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
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λ‘ μ€μ
Multiple in-flight requestλ₯Ό μ μ‘ max.in.flight.requests.per.connection=5(default)
Batch0κ° μ€ν¨νμ§λ§, Batch1μ μ±κ³΅νλ©΄, Batch1μ΄ Batch0λ³΄λ€ λ¨Όμ Commit Logμ μΆκ°λμ΄ μμκ° λ¬λΌμ§
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β μ€ν

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