01.Producer Acks, Batch, Page Cache, Flush

Producer Acks

  • acks 섀정은 μš”μ²­μ΄ 성곡할 λ•Œλ₯Ό μ •μ˜ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” Producer에 μ„€μ •ν•˜λŠ” Parameter (Producer Parameter 쀑 ν•˜λ‚˜)

Ack = 0

  • acks = 0 : ackκ°€ ν•„μš”ν•˜μ§€ μ•ŠμŒ. λ©”μ‹œμ§€ 손싀이 λ‹€μ†Œ μžˆλ”λΌλ„ λΉ λ₯΄κ²Œ λ©”μ‹œμ§€λ₯Ό 보내야 ν•˜λŠ” κ²½μš°μ— μ‚¬μš©(ꢌμž₯ X)

Ack = 1

  • acks=1 : (default κ°’) Leaderκ°€ λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν•˜λ©΄ ackλ₯Ό 보냄. Leaderκ°€ Producerμ—κ²Œ ACKλ₯Ό 보낸 ν›„, Followerκ°€ λ³΅μ œν•˜κΈ° 전에 Leader에 μž₯μ• κ°€ λ°œμƒν•˜λ©΄ λ©”μ‹œμ§€κ°€ 손싀. β€œAt most once(μ΅œλŒ€ ν•œ 번)” 전솑을 보μž₯

Ack = -1

  • acks=-1 : acks=all κ³Ό 동일. λ©”μ‹œμ§€κ°€ Leaderκ°€ λͺ¨λ“  ReplicaκΉŒμ§€ Commit 되면 ackλ₯Ό 보냄. Leaderλ₯Ό μžƒμ–΄λ„ 데이터가 살아남을 수 μžˆλ„λ‘ 보μž₯. κ·ΈλŸ¬λ‚˜ λŒ€κΈ° μ‹œκ°„μ΄ 더 κΈΈκ³  νŠΉμ • μ‹€νŒ¨ μ‚¬λ‘€μ—μ„œ λ°˜λ³΅λ˜λŠ” 데이터 λ°œμƒ κ°€λŠ₯μ„± 있음. β€œAt least once(μ΅œμ†Œ ν•œ 번)” 전솑을 보μž₯

Producer Retry

Parameter
description
Default

retries

λ©”μ‹œμ§€λ₯Ό sendν•˜κΈ° μœ„ν•΄ μž¬μ‹œλ„ν•˜λŠ” 횟수

MAX_INT

retry.backoff.ms

μž¬μ‹œλ„ 사이에 μΆ”κ°€λ˜λŠ” λŒ€κΈ° μ‹œκ°„

100

request.timeout.ms

Producerκ°€ 응닡을 κΈ°λ‹€λ¦¬λŠ” μ΅œλŒ€ μ‹œκ°„

30,000(30초)

delivery.timeout.ms

send() ν›„ 성곡 λ˜λŠ” μ‹€νŒ¨λ₯Ό λ³΄κ³ ν•˜λŠ” μ‹œκ°„μ˜ μƒν•œ

120,000(2λΆ„)

  • retriesλ₯Ό μ‘°μ •ν•˜λŠ” λŒ€μ‹ μ— delivery.timeout.ms μ‘°μ •μœΌλ‘œ μž¬μ‹œλ„ λ™μž‘μ„ μ œμ–΄

  • acks = 0 μ—μ„œ retryλŠ” 무의미

Producer Batch 처리

  • λ©”μ‹œμ§€λ₯Ό λͺ¨μ•„μ„œ ν•œλ²ˆμ— 전솑

  • Batch μ²˜λ¦¬λŠ” RPC(Remote Procedure Call)수λ₯Ό μ€„μ—¬μ„œ Brokerκ°€ μ²˜λ¦¬ν•˜λŠ” μž‘μ—…μ΄ 쀄어듀기 λ•Œλ¬Έμ— 더 λ‚˜μ€ μ²˜λ¦¬λŸ‰μ„ 제곡

linger.ms 와 batch.size

  • linger.ms (default : 0, μ¦‰μ‹œ 보냄)

    • λ©”μ‹œμ§€κ°€ ν•¨κ»˜ Batch 처리될 λ•ŒκΉŒμ§€ λŒ€κΈ° μ‹œκ°„

  • batch.size (default : 16 KB)

    • 보내기 μ „ Batch의 μ΅œλŒ€ 크기

  • Batch 처리의 일반적인 섀정은 linger.ms=100 및 batch.size=1000000 batch.size둜 μ§€μ •ν•œ 크기만큼 데이터가 μ μž¬λ˜μ§€ μ•ŠλŠ” 경우 λ¬Έμ œκ°€ 될 수 μžˆλ‹€. 주둜 linger.msλ₯Ό ν™œμš©.

Producer Delivery Timeout

  • send() ν›„ 성곡 λ˜λŠ” μ‹€νŒ¨λ₯Ό λ³΄κ³ ν•˜λŠ” μ‹œκ°„μ˜ μƒν•œ

Message Send μˆœμ„œ 보μž₯

  • μ§„ν–‰ 쀑(in-flight)인 μ—¬λŸ¬ μš”μ²­(request)을 μž¬μ‹œλ„ν•˜λ©΄ μˆœμ„œκ°€ 변경될 수 있음 λ©”μ‹œμ§€ μˆœμ„œλ₯Ό 보μž₯ν•˜λ €λ©΄ Producerμ—μ„œ enable.idempotenceλ₯Ό true둜 μ„€μ •

  1. Multiple in-flight requestλ₯Ό 전솑 max.in.flight.requests.per.connection=5(default)

  2. Batch0κ°€ μ‹€νŒ¨ν–ˆμ§€λ§Œ, Batch1은 μ„±κ³΅ν•˜λ©΄, Batch1이 Batch0보닀 λ¨Όμ € Commit Log에 μΆ”κ°€λ˜μ–΄ μˆœμ„œκ°€ 달라짐

  3. enable.idempotenceλ₯Ό μ‚¬μš©ν•˜λ©΄, ν•˜λ‚˜μ˜ Batchκ°€ μ‹€νŒ¨ν•˜λ©΄, 같은 Partition으둜 λ“€μ–΄μ˜€λŠ” 후속 Batch듀도 OutOfOrderSequenceExceptionκ³Ό ν•¨κ»˜ μ‹€νŒ¨

Page Cache 와 Flush

  • λ©”μ‹œμ§€λŠ” Partition에 기둝됨

  • Partition은 Log Segment file둜 ꡬ성 (κΈ°λ³Έκ°’ : 1GBλ§ˆλ‹€ μƒˆλ‘œμš΄ Segment 생성)

  • μ„±λŠ₯을 μœ„ν•΄ Log SegmentλŠ” OS Page Cache에 기둝됨

  • 둜그 νŒŒμΌμ— μ €μž₯된 λ©”μ‹œμ§€μ˜ 데이터 ν˜•μ‹μ€ Brokerκ°€ Producerλ‘œλΆ€ν„° μˆ˜μ‹ ν•œ 것, 그리고 Consumerμ—κ²Œ λ³΄λ‚΄λŠ” 것과 μ •ν™•νžˆ λ™μΌν•˜λ―€λ‘œ, Zero-Copyκ°€ κ°€λŠ₯

  • Page CacheλŠ” λ‹€μŒκ³Ό 같은 경우 λ””μŠ€ν¬λ‘œ Flush됨

    • Brokerκ°€ μ™„μ „νžˆ μ’…λ£Œ

    • OS background β€œFlusher Thread” μ‹€ν–‰

Zero-copy

전솑은 데이터가, User Space에 λ³΅μ‚¬λ˜μ§€ μ•Šκ³ , CPU κ°œμž… 없이 Page Cache와 Network Buffer μ‚¬μ΄μ—μ„œ 직접 μ „μ†‘λ˜λŠ” 것을 의미. 이것을 톡해 Broker Heap λ©”λͺ¨λ¦¬λ₯Ό μ ˆμ•½ν•˜κ³  λ˜ν•œ μ—„μ²­λ‚œ μ²˜λ¦¬λŸ‰μ„ 제곡

Flush 되기 전에 Broker μž₯μ•  λ°œμƒ

  • OSκ°€ 데이터λ₯Ό λ””μŠ€ν¬λ‘œ Flushν•˜κΈ° 전에 Broker의 μ‹œμŠ€ν…œμ— μž₯μ• κ°€ λ°œμƒν•˜λ©΄ ν•΄λ‹Ή 데이터가 손싀됨

  • Partition이 Replication(볡제)λ˜μ–΄ μžˆλ‹€λ©΄, Brokerκ°€ λ‹€μ‹œ 온라인 μƒνƒœκ°€ 되면 ν•„μš”μ‹œ Leader Replica(볡제본)μ—μ„œ 데이터가 볡ꡬ됨

  • Replication이 μ—†λ‹€λ©΄, λ°μ΄ν„°λŠ” 영ꡬ적으둜 손싀될 수 있음

Kafka 자체 Flush μ •μ±…

  • λ§ˆμ§€λ§‰ Flush μ΄ν›„μ˜ λ©”μ‹œμ§€ 수(log.flush.interval.messages) λ˜λŠ” μ‹œκ°„(log.flush.interval.ms)으둜 Flush(fsync)λ₯Ό νŠΈλ¦¬κ±°ν•˜λ„λ‘ μ„€μ •ν•  수 있음

  • KafkaλŠ” 운영 체제의 background Flush κΈ°λŠ₯(예: pdflush)을 더 효율적으둜 ν—ˆμš©ν•˜λŠ”κ²ƒμ„ μ„ ν˜Έν•˜κΈ° λ•Œλ¬Έμ— μ΄λŸ¬ν•œ 섀정은 기본적으둜 λ¬΄ν•œ(기본적으둜 fsync λΉ„ν™œμ„±ν™”)으둜 μ„€μ •

  • μ΄λŸ¬ν•œ 섀정을 κΈ°λ³Έκ°’μœΌλ‘œ μœ μ§€ν•˜λŠ” 것을 ꢌμž₯

  • *.log νŒŒμΌμ„ 보면 λ””μŠ€ν¬λ‘œ Flush된 데이터와 아직 Flushλ˜μ§€ μ•Šμ€ Page Cache (OS Buffer)에 μžˆλŠ” 데이터가 λͺ¨λ‘ ν‘œμ‹œλ¨

  • Flush된 ν•­λͺ©κ³Ό Flushλ˜μ§€ μ•Šμ€ ν•­λͺ©μ„ ν‘œμ‹œν•˜λŠ” Linux 도ꡬ(예: vmtouch)도 있음

Last updated