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