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

ParameterdescriptionDefault

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