02.KafkainRealEnvironment

Broker ์„ค์น˜

Broker๋Š” ๋ถ„๋ฆฌ๋œ ๊ฐ๊ฐ์˜ ์ „์šฉ ์„œ๋ฒ„์— ๋ถ„๋ฆฌํ•˜์—ฌ ์„ค์น˜ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

  • N๊ฐœ์˜ Broker๊ฐ€ ์žˆ์œผ๋ฉด, Replication Factor(RF)๋Š” ์ตœ๋Œ€ N๊นŒ์ง€ ์‚ฌ์šฉํ•˜์—ฌ Topic ์ƒ์„ฑ ๊ฐ€๋Šฅ

  • Mission Critical Topic์—๋Š” Replication Factor๋Š” ๋ณดํ†ต 3 ์„ ๋งŽ์ด ์‚ฌ์šฉ

    • 3 ๊ฐœ์˜ Broker๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ํ•˜๋‚˜์˜ Broker๊ฐ€ ์žฅ์•  ์ƒํƒœ์‹œ, RF 3์ธ Topic ์ƒ์„ฑ ๋ถˆ๊ฐ€๋Šฅ

    • ๋”ฐ๋ผ์„œ, Broker๋Š” 4 ๊ฐœ ์ด์ƒ ํ•˜๋‚˜์˜ Cluster๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

  • ๋ฐ์ดํ„ฐ ์œ ์‹ค ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด์„œ, min.insync.replicas๋Š” 2 ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉ

    • 3 ๊ฐœ์˜ Broker๋กœ ๊ตฌ์„ฑํ•˜๊ณ  1 ๊ฐœ์˜ Broker๊ฐ€ ์žฅ์•  ์ƒํƒœ์‹œ, Topic์— Write๋Š” ๊ฐ€๋Šฅ

    • 1 ๊ฐœ์˜ Broker๊ฐ€ ์ถ”๊ฐ€๋กœ ์žฅ์• ์‹œ, ๋ฐ์ดํ„ฐ ์œ ์‹ค์˜ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง

    • ๋”ฐ๋ผ์„œ, Broker๋Š” 4 ๊ฐœ ์ด์ƒ ํ•˜๋‚˜์˜ Cluster๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

Broker CPU

Broker๋Š” CPU๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์œผ๋‚˜, ์ฒ˜๋ฆฌ๋Ÿ‰์— ๋”ฐ๋ผ์„œ Thread ํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹์ด ํ•„์š”ํ•˜๋ฉฐ, Thread ์ฆ๊ฐ€์— ๋”ฐ๋ผ CPU ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•จ

  • ์„ค์ •์„ ์ž˜ ๋ชป ํ•˜๊ฑฐ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, Bug๋กœ ์ธํ•ด CPU ์‚ฌ์šฉ๋ฅ ์ด ๋†’์„ ์ˆ˜๋„ ์žˆ์Œ

  • Reference Architecture์—๋Š” Dual 12-core Sockets๋ฅผ ๊ถŒ์žฅ (๊ถŒ์žฅ ์‚ฌ์–‘์ด ๋†’์€ ๊ฒƒ์€ poc๋ฅผ ์ง„ํ–‰ ํ•  ๋•Œ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒ.)

  • Broker ํŒŒ๋ผ๋ฏธํ„ฐ

    • num.io.threads (๊ธฐ๋ณธ๊ฐ’ : 8) : Disk ๊ฐœ์ˆ˜๋ณด๋‹ค ํฌ๊ฒŒ ์„ค์ •(thread์˜ ๊ฐœ์ˆ˜)

    • um.network.threads (๊ธฐ๋ณธ๊ฐ’ : 3) : TLS(์ž„ํ˜ธํ™”)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋‘ ๋ฐฐ ์ด์ƒ์œผ๋กœ ์„ค์ •

    • num.recovery.threads.per.data.dir (๊ธฐ๋ณธ๊ฐ’ : 1) : Broker ์‹œ์ž‘์‹œ ๋น ๋ฅธ ๊ธฐ๋™์„ ์œ„ํ•ด์„œ, core์ˆ˜๊นŒ์ง€๋งŒ ์„ค์ •

    • num.replica.fetchers (๊ธฐ๋ณธ๊ฐ’ : 1) : Source Broker์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณต์ œํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” Thread ์ˆ˜. ๋น ๋ฅด๊ฒŒ ๋ณต์ œํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ’์„ ์ฆ๊ฐ€(Latency๋ฅผ ๋งŒ์กฑํ•˜๋Š”). Broker์˜ CPU ์‚ฌ์šฉ๋ฅ ๊ณผ ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ๋ฅ ์ด ์˜ฌ๋ผ๊ฐ

      • 4~6์˜ ๊ฐ’์„ ๋งŽ์ด ์‚ฌ์šฉํ•จ.

    • num.cleaner.threads (๊ธฐ๋ณธ๊ฐ’ : 1) : Disk ๊ฐœ์ˆ˜ ํ˜น์€ core ๊ฐœ์ˆ˜๊นŒ์ง€๋งŒ ์„ค์ •

Open File Descriptors

Broker๋Š” ๋งŽ์€ ์ˆ˜์˜ Partition์„ ์ง€์›ํ•˜๋ฏ€๋กœ ์ƒ๋Œ€์ ์œผ๋กœ ์†Œ๊ทœ๋ชจ ๋ฐฐํฌ์—์„œ๋„ Open File Handle ์ˆ˜๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์„ ์‰ฝ๊ฒŒ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ์Œ

  • ์ตœ์†Œ: ulimit โ€’n 100000

Broker Memory

Broker๋Š” JVM Heap์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

  • Broker์˜ Heap ๋ฉ”๋ชจ๋ฆฌ๋Š” ์šด์˜ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„ 6 GB ๊นŒ์ง€ ํ• ๋‹น

  • ๋งค์šฐ ํฐ Cluster ํ˜น์€ ๋งค์šฐ ๋งŽ์€ Partition์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ 12 GB ์ด์ƒ ์‚ฌ์šฉ

  • Broker์˜ OS๋งŒ์„ ์œ„ํ•ด์„œ๋Š” ๋ณดํ†ต 1 GB ์ •๋„ ํ• ๋‹น

  • Broker ๋Š” OS Page Cache๋ฅผ ๋งŽ์ด ์‚ฌ์šฉ

    • OS Page Cache๋ฅผ ํ†ตํ•ด์„œ Zero Copy ์ „์†ก์„ ์ˆ˜ํ–‰

    • ๋งŽ์„์ˆ˜๋ก ์„ฑ๋Šฅ์— ์œ ๋ฆฌ

  • ์šด์˜ํ™˜๊ฒฝ์šฉ Broker ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ตœ์†Œ 32 GB ์ด์ƒ ๊ถŒ์žฅํ•˜๋ฉฐ, ์ฒ˜๋ฆฌ๋Ÿ‰์— ๋”ฐ๋ผ์„œ 64 GB ์ด์ƒ ์‚ฌ์šฉ ๊ถŒ์žฅ

Zero Copy(๋ฌด๋ณต์‚ฌ)

์ปค๋„ ์˜์—ญ์—์„œ ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์€ ํ›„ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋˜๋Œ์•„๊ฐ€์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์†Œ์ผ“์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ ์ „์†ก

์ฐธ๊ณ  : https://til-perfectacle.netlify.app/2018/10/14/zero-copy/

Broker Java Heap Memory

kafka-server-start ์Šคํฌ๋ฆฝํŠธ์— Java Heap ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์Œ

  • $KAFKA_HEAP_OPTS

    • -Xms6g โ€’Xmx6g

  • $KAFKA_JVM_PERFORMANCE_OPTS

    • -server -XX:MetaspaceSize=96m -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80 -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M

G1 GC๋ž€?

G1 GC๋Š” CMS GC๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กญ๊ฒŒ ๋“ฑ์žฅํ•˜์˜€์œผ๋ฉฐ, ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์„œ ์‹œ์Šคํ…œ์„ ์œ„ํ•ด ์ œ์ž‘๋˜์—ˆ๋‹ค. ๋น ๋ฅธ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ์ง€์›ํ•˜๋ฉด์„œ STW๋ฅผ ์ตœ์†Œํ™”ํ•œ๋‹ค. CMS GC๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ๋™์‹œ์— Application๊ณผ GC๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฉ”๋ชจ๋ฆฌ Compaction ๊ณผ์ •๊นŒ์ง€ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค. Java 9 ๋ฒ„์ „๋ถ€ํ„ฐ ๊ธฐ๋ณธ GC ๋ฐฉ์‹์œผ๋กœ ์ฑ„ํƒ๋˜์—ˆ๋‹ค.

Broker Network

  • ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์ž‘์€ Application์ผ ๊ฒฝ์šฐ, Broker์˜ NW์€ 1 Gigabit(Gb) ์œผ๋กœ ์ถฉ๋ถ„

  • ์ฒ˜๋ฆฌ๋Ÿ‰์ด ํฐ Application์ผ ๊ฒฝ์šฐ, Broker์˜ NW์€ 10 Gigabit(Gb) ์ด์ƒ ํ•„์š”

  • Producer์—์„œ ์••์ถ• ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋„คํŠธ์›Œํฌ๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • ๋‹จ, CPU ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€.

  • Internal(๋‚ด๋ถ€ ๋ณต์ œ)๊ณผ External ํŠธ๋ž˜ํ”ฝ ๊ฐ„ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ

KIP-103: Separation of Internal and External traffic

https://cwiki.apache.org/confluence/display/KAFKA/KIP-103%3A+Separation+of+Internal+and+External+traffic

Broker Disk

Kafka Broker์˜ data log ์šฉ Disk๋Š” OS ์šฉ Disk์™€ ๋ถ„๋ฆฌ ๊ถŒ์žฅ

  • Broker์˜ data log์šฉ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Local Disk ์‚ฌ์šฉ์„ ๊ถŒ์žฅ(RAID10 ๊ถŒ์žฅ, JBOD ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

  • Broker์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘ log.dirs ์— ์ฝค๋งˆ(,)๋กœ ๊ตฌ๋ถ„ํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋“ค๋กœ ์ •์˜

  • SSD Disk๋ฅผ ๊ถŒ์žฅ

  • XFS ํŒŒ์ผ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

  • mount์‹œ์— noatime ์˜ต์…˜ ์‚ฌ์šฉ - Linux๊ฐ€ ๊ฐ ํŒŒ์ผ์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์•ก์„ธ์Šคํ•œ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ off

  • ํ•˜๋‚˜์˜ Partition์€ ํ•˜๋‚˜์˜ volume์—์„œ ์ƒ์„ฑ๋จ

  • Partition๋“ค์€ log.dirs ์˜ ๋””๋ ‰ํ† ๋ฆฌ์— round-robin ๋ฐฉ์‹์œผ๋กœ ๋ถ„๋ฐฐ

  • NAS ์‚ฌ์šฉ ๋ถˆ๊ฐ€

NAS(Network Attached Storage) ๋„คํŠธ์›Œํฌ ๊ฒฐํ•ฉ ์Šคํ† ๋ฆฌ์ง€๋กœ, ์ž๋ฃŒ๋ฅผ ์ปดํ“จํ„ฐ์— ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋„คํŠธ์›Œํฌ ์ €์žฅ์†Œ์— ๋ณด๊ด€ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๋“ค๊ณผ ๊ณต์œ ํ•œ๋‹ค๋Š” ๊ธฐ๋ณธ ๊ฐœ๋…์˜ ๋„คํŠธ์›Œํฌ ์ €์žฅ ์žฅ์น˜

Virtual Memory

  • Memory swapping ์ตœ์†Œํ™” vm.swappiness=1 (๊ธฐ๋ณธ๊ฐ’ : 60)

  • Blocking Flush (synchronous) ๋นˆ๋„ ๊ฐ์†Œ vm.dirty_ratio=80 (๊ธฐ๋ณธ๊ฐ’ : 20)

  • Non-Blocking background flushes (asynchronous) ๋นˆ๋„ ์ฆ๊ฐ€ vm.dirty_background_ratio=5 (๊ธฐ๋ณธ๊ฐ’ : 10)

  • ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์€ /etc/sysctl.conf ์— ์„ค์ •ํ•˜๊ณ  sysctl -p ๋ช…๋ น์–ด๋กœ Loadํ•จ

Memory swapping

RAM์ด ๋ถ€์กฑํ•  ๋•Œ ์ž„์‹œ๋กœ ๋ณด์กฐ ๋ฉ”๋ชจ๋ฆฌ ์ด์šฉํ•œ๋’ค, ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋Š” ์‹œ์ ์— ๋ฉ”๋ชจ๋ฆฌ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ

Zookeeper ์„ค์น˜

Zookeeper ๊ถŒ์žฅ ์‚ฌ์–‘

HW ๊ถŒ์žฅ ์‚ฌ์–‘

  • ์ตœ์†Œ 2 Core โ€’ ๊ถŒ์žฅ 4 Core

  • Memory : 8 GB

  • Transaction log (dataLogDir) : 512 GB SSD

  • Database snapshots (dataDir) : 2 TB SSD RAID 10

Zookeeper Disk

ZooKeeper ์˜ server.properties ๋‚ด์˜ purge snapshots ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •

  • autopurge.snapRetainCount : ๋ณด์กดํ•  SnapShot ๊ฐœ์ˆ˜(๊ถŒ์žฅ 3)

  • autopurge.purgeInterval : Purge Interval(๊ถŒ์žฅ 24)

  • ์œ„์˜ ๊ถŒ์žฅ ์˜ต์…˜์€ 24 ์‹œ๊ฐ„๋งˆ๋‹ค 3 ๊ฐœ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์Šค๋ƒ…์ƒท์„ ์ œ๊ฑฐํ•˜๋Š” ์„ค์ •

  • ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ์—๋Š” 3-5๊ฐœ Zookeeper ๋…ธ๋“œ์— ์ถ”๊ฐ€ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์กดํ•  SnapShot ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ

Last updated