[Kafka] Apache Kafka
๐ณApache Kafka
๐ซ์ํ์น ์นดํ์นด ๊ฐ์ ๋ฐ ์ค๋ช
- ํ๋ฆ
- Source Application โ KafKa โ Target Application
- ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ฉ์ด
- ์ดํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ ๊ฐ์ ์ข ์์ฑ์ ์ฝํ
๐ซํ ํฝ์ด๋?
- ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ ๊ณต๊ฐ
- ํ ํฝ ์ฌ๋ฌ ๊ฐ ์์ฑ ๊ฐ๋ฅ.
- DB ํ ์ด๋ธ ๋๋ ํ์ผ ์์คํ ์ ํด๋์ ์ ์ฌ
- ๋ชฉ์ ์ ๋ฐ๋ผ ํ ํฝ์ ๋ง๋ค๋ฉด ๊ด๋ฆฌ ์ฉ์ด
๐ซํ ํฝ ๋ด๋ถ
- ํ๋์ ํ ํฝ์ ์ฌ๋ฌ๊ฐ์ ํํฐ์ ์ ๊ฐ์ง ์ ์์
- ํํฐ์
- 0๋ถํฐ ์์
- ํํฐ์ ๋ด์ ๋ฐ์ดํฐ๊ฐ ์์. ๊ฐ ๋ฐ์ดํฐ๋ ์คํ์ (offset)์ด๋ผ๊ณ ํ๋ ์ซ์๊ฐ ๋ถ๊ฒ๋จ.
- ์ปจ์๋จธ๋ ํํฐ์ ์ ๊ฐ์ฅ ์ค๋๋ ๋ฐ์ดํฐ๋ถํฐ ๊ฐ์ ธ๊ฐ
- ์ปจ์๋จธ๊ฐ record๋ค์ ๊ฐ์ ธ๊ฐ๋ ๋ฐ์ดํฐ๋ ์ญ์ ๋์ง ์์
- ์ง์์ง์ง ์์ ๋ฐ์ดํฐ๋ ์๋ก์ด ์ปจ์๋จธ๊ฐ ๋ค์ 0๋ถํฐ ๋ฐ์ดํฐ ๊ฐ์ ธ๊ฐ
- ๋จ, ์ปจ์๋จธ ๊ทธ๋ฃน์ด ๋ฌ๋ผ์ผ ํ๊ณ , auto.offset.reset = earliset ์ธํ ๋์ด ์์ด์ผ ํจ.
- ์ง์์ง์ง ์์ ๋ฐ์ดํฐ๋ ์๋ก์ด ์ปจ์๋จธ๊ฐ ๋ค์ 0๋ถํฐ ๋ฐ์ดํฐ ๊ฐ์ ธ๊ฐ
- ํํฐ์
2๊ฐ ์ด์ ๊ฒฝ์ฐ
- ํ๋ก๋์๊ฐ ํค ์ค์ ๊ฐ๋ฅ
- ํค null & ๊ธฐ๋ณธ ํํฐ์
๋ ์ฌ์ฉ ๊ฒฝ์ฐ
- Round Robin ์ผ๋ก ํ ๋น
- ํค not null & ๊ธฐ๋ณธ ํํฐ์
๋ ์ฌ์ฉํ ๊ฒฝ์ฐ
- ํค์ hash ๊ฐ์ ๊ตฌํด ํน์ ํํฐ์ ์ ํ ๋น
- ํค null & ๊ธฐ๋ณธ ํํฐ์
๋ ์ฌ์ฉ ๊ฒฝ์ฐ
- ํํฐ์
๋๋ฆด ๋ ์ ์!!!
- ํํฐ์ ์ ๋๋ฆด ์ ์์ง๋ง ์ค์ผ ์๋ ์์
- Why ํํฐ์ ์ฆ๊ฐ? ํํฐ์ ์ ๋๋ฆฌ๋ฉด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ถ์ฐ ์ํฌ ์ ์์
- ํ๋ก๋์๊ฐ ํค ์ค์ ๊ฐ๋ฅ
- Record ์ธ์ ์ญ์ ?
- ์ต์
์ ๋ฐ๋ผ ๋ค๋ฆ
- log.retention.ms : ์ต๋ record ๋ณด์กด ์๊ฐ
- log.retention.byte : ์ต๋ record ๋ณด์กด ํฌ๊ธฐ(byte)
- ์ต์
์ ๋ฐ๋ผ ๋ค๋ฆ
๐ซ๋ธ๋ก์ปค, ๋ณต์ , ISR
๐ฌ์นดํ์นด ๋ธ๋ก์ปค
- ์นดํ์นด๊ฐ ์ค์น๋์ด ์๋ ์๋ฒ ๋จ์
- ๋ณดํต 3๊ฐ ์ด์์ broker ๊ถ์ฅ
- ๋ธ๋ก์ปค ๊ฐ์๊ฐ 3์ด๋ฉด replication์ 3์ ์ด๊ณผํ ์ ์์
๐ฌReplication
- ํํฐ์ ๋ณต์ ๋ฅผ ์๋ฏธ
- Eg) replication=1 : partition 1๊ฐ๋ง ์กด์ฌ /
- replication=3 : partition ์๋ณธ 1๊ฐ / ๋ณต์ ๋ณธ 2๊ฐ
- Leader partition : ๋ฐ์ดํฐ ์๋ณธ์ ์ ์ฅํ๋ ํํฐ์
- ํ๋ก๋์๊ฐ ํ ํฝ์ ํํฐ์ ์ ๋ฐ์ดํฐ ์ ๋ฌ ์ ์ ๋ฌ๋ฐ๋ ์ฃผ์ฒด
- ํ๋ก๋์์ ack ์ต์
: partition์ replication๊ณผ ๊ด๋ จ
- 0 : Leader partition์ ๋ฐ์ดํฐ ์ ์ก ํ ์๋ต๊ฐ ๋ฐ์ง ์์
- ์๋ ๋น ๋ฅด๋ / ๋ฐ์ดํฐ ์ ์ค ๊ฐ๋ฅ์ฑ ์กด์ฌ
- 1 : leader partition์ ๋ฐ์ดํฐ ์ ์ก ํ ์ ์ ์๋ต ์ฌ๋ถ ์๋ต๊ฐ ์ ๋ฌ
- ๋ณต์ ์ฌ๋ถ ํ์ธ ๋ถ๊ฐ : ๋ฐ์ดํฐ ์ ์ค ๊ฐ๋ฅ์ฑ ์กด์ฌ. (Leader ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐ์ ์ฆ์ ๋ฐ๋ก ๋ฌธ์ ๋ฐ์ ์ ๋ณต์ ๊ฐ ์ ์ ์๋ํ์ง ์์ ์ ์์)
- all : ์๋ต + ๋ณต์ ์ ์ ์ฌ๋ถ
- ๋ฐ์ดํฐ ์ ์ค์ ์์ผ๋ / ์๋ ํ์ ํ ๋๋ฆผ
- 0 : Leader partition์ ๋ฐ์ดํฐ ์ ์ก ํ ์๋ต๊ฐ ๋ฐ์ง ์์
- Follower partition : ์๋ณธ ์ ์ฅ ์ ์ธ ํํฐ์
- ISR (In Sync Replica) : Leader + Follower partitions
- ๊ณ ๊ฐ์ฉ์ฑ ๋ชฉ์ ์ผ๋ก Replication ํ์ฉ
- ํ๋์ ํํฐ์ ์์ ๋ฌธ์ ๋ฐ์ ์ ๋ค๋ฅธ ํํฐ์ ํ์ฉ ๊ฐ๋ฅ
- ๋ง์ผ๋ฉด ์ข์๊ฒ ์๋
- ๋ธ๋ก์ปค๊ฐ ์ฌ์ฉํ๋ ๋ฆฌ์์ค ์๋ ์ฆ๊ฐ (eg. Disk usage 1TB)
- ๋ฐ์ดํฐ๋ & ์ ์ฅ์๊ฐ ๊ณ ๋ คํ ๋ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ๊ฒฐ์
- ๋ธ๋ก์ปค 3๊ฐ์ด์ ์ฌ์ฉ์ ๋ ํ๋ฆฌ์ผ์ด์ 3 ์ถ์ฒ
๐ซํํฐ์ ๋๋?
๏ฟผ
- ํ๋ก๋์๋ ํํฐ์ ๋๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก์ปค๋ก ์ ๋ฌ
- ๋ฐ์ดํฐ๋ฅผ ํ ํฝ์ ์ด๋ค ํํฐ์
์ ๋ฃ์์ง ๊ฒฐ์ ํ๋ ์ญํ
- ๋ ์ฝ๋์ ํฌํจ๋ ๋ฉ์์ง ํค ๋๋ ๋ฉ์์ง ๊ฐ์ ๋ฐ๋ผ ํํฐ์ ์ ์์น ๊ฒฐ์
- ๋ํดํธ ํํฐ์
๋ : UniformStickyPartitioner
- ๋ฉ์์ง ํค ์ ๋ฌด์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์๋
- ๋ฉ์์ง ํค ์กด์ฌ ์
- ํด์ ๊ฐ => ํํฐ์ ๋ฒํธ
- ํด์ ๊ฐ์ด ๋์ผํ ๊ฒฝ์ฐ ๋์ผํ ํํฐ์ ์ ์์๋๋ก ์ ์ฅ๋๋ ๊ฒ์ ๋ณด์ฅํ ์ ์์.
- ๋ฉ์์ง ํค ์์ ์
- Round Robin์ผ๋ก ์ ์ฅ
- ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์ ์ฅ. ํ๋ก๋์์์ ๋ฐฐ์น๋ก ๋ชจ์ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ ํํฐ์ ์ ๋ณด๋
- ํํฐ์ ์ ์ ์ ํ ๋ถ๋ฐฐ๋จ
- Round Robin์ผ๋ก ์ ์ฅ
- ๋ฉ์์ง ํค ์กด์ฌ ์
- ๋ฉ์์ง ํค ์ ๋ฌด์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์๋
- Custom Partitioner ์ฌ์ฉ ๊ฐ๋ฅ
- Kafka์์ Partitioner ์ธํฐํ์ด์ค ์ ๊ณต
- ์ธ์ ์ฌ์ฉ?
- Eg. vip๊ณ ๊ฐ์ ์ํด ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์กฐ๊ธ ๋ ๋นจ๋ฆฌ ์ฒ๋ฆฌ. ์ฒ๋ฆฌ๋์ ๋๋ฆด ์ ์์. Vip ๊ณ ๊ฐ์ ์ํ ํํฐ์ ๊ฐ์๋ฅผ ๋ ๋ง์ด ๊ฐ์ ธ๊ฐ.
๐ซKafka Lag์ด๋?
์นดํ์นด ๋ชจ๋ํฐ๋ง ์งํ.
๐ฌKafka Consumer Lag
- ํ๋ก๋์๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ฃ์ offset๊ณผ ์ปจ์๋จธ๊ฐ ๋ง์ง๋ง์ผ๋ก ์ฝ์ offset ๊ฐ์ ์ฐจ์ด
- ํ ํฝ ๋ด ํํฐ์ ์ฌ๋ฌ ๊ฐ ์กด์ฌ ์ lag ์ญ์ ์ฌ๋ฌ ๊ฐ ์กด์ฌ ๊ฐ๋ฅ
- ์ฃผ๋ก ์ปจ์๋จธ์ ์ํ์ ๋ํด ๋ณผ ๋ ์ฌ์ฉ
- Records-lag-max
- ํ ๊ฐ์ ํ ํฝ๊ณผ ์ปจ์๋จธ ๊ทธ๋ฃน์ ๋ํ lag์ด ์ฌ๋ฌ๊ฐ ์กด์ฌํ ์ ์์ ๋ ๊ทธ ์ค ๊ฐ์ฅ ๋์ ์ซ์์ lag
๐ซKafka Burrow
- KafkaConsumer ๊ฐ์ฒด๋ฅผ ํตํด ํ์ฌ Lag ์ ๋ณด ๊ฐ์ ธ์ฌ ์ ์์. Lag ๋ชจ๋ํฐ๋ง์ ์ปจ์๋จธ ๋จ์์์ ํ๋ ๊ฒ์ ์ํํ๊ณ ์ด์์์๊ฐ ๋ง์ด ๋ค์ด๊ฐ
- Why?
- ์ปจ์๋จธ ์ํ์ ๋ํ๋์๊ฐ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ. ์ปจ์๋จธ๊ฐ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋ ๊ฒฝ์ฐ ๋์ด์ lag ์ ๋ณด ๋ณด๋ผ ์ ์์. Lag ์ธก์ ๋ถ๊ฐํด์ง.
- Consumer ์ถ๊ฐ๋ ๋๋ง๋ค Lag ์ธก์ ๊ธฐ๋ฅ ๊ฐ๋ฐ ํ์.
- Why?
- ์คํ์์ค
- Golang
- ์ปจ์๋จธ Lag ๋ชจ๋ํฐ๋ง์ ๋์์ฃผ๋ ๋ ๋ฆฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
- 3๊ฐ์ง ํน์ง
- ๋ฉํฐ ์นดํ์นด ํด๋ฌ์คํฐ ์ง์
- ์นดํ์นด ํด๋ฌ์คํฐ๊ฐ ์ฌ๋ฌ ๊ฐ๋๋ผ๋ ๋ฒ๋ก์ฐ 1๊ฐ์๋ง ์ฐ๋ํ๋ฉด ์นดํ์นด ํด๋ฌ์คํฐ๋ค์ ๋ถ์ ์ปจ์๋จธ์ Lag๋ฅผ ๋ชจ๋ ๋ชจ๋ํฐ๋ง ๊ฐ๋ฅ
- Sliding window๋ฅผ ํตํ Consumer์ status ํ์ธ
- โERRORโ, โWARNINGโ, โOKโ
- ERROR : Consumer๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ์ง ์๋ ๊ฒฝ์ฐ
- WARNING : ๋ฐ์ดํฐ์์ด ์ผ์์ ์ผ๋ก ๋ง์์ง๋ฉด์ Consumer offset์ด ์ฆ๊ฐ๋๊ณ ์๋ ๊ฒฝ์ฐ
- OK
- โERRORโ, โWARNINGโ, โOKโ
- HTTP API ์ ๊ณต
- ๋ฉํฐ ์นดํ์นด ํด๋ฌ์คํฐ ์ง์
Burrow ์๊ฐ : https://blog.voidmainvoid.net/243
Burrow์ Consumer status ํ์ธ ๋ฐฉ๋ฒ : https://blog.voidmainvoid.net/244
Burrow http endpoint ์ ๋ฆฌ : https://blog.voidmainvoid.net/245
Burrow github : https://github.com/linkedin/Burrow
AWS์ ์นดํ์นด ํด๋ฌ์คํฐ ์ค์นํ๊ธฐ : https://blog.voidmainvoid.net/325
๐ซKafka Producer
๐ฌํ๋ก๋์ ์ญํ
- Topic์ ํด๋นํ๋ ๋ฉ์์ง ์์ฑ
- ํน์ topic์ผ๋ก ๋ฐ์ดํฐ publish
- ์ฒ๋ฆฌ ์คํจ/์ฌ์๋
Kafka-client ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ ์ถ๊ฐ ํ์.
- ๋ธ๋ก์ปค ๋ฒ์ & ํด๋ผ์ด์ธํธ ๋ฒ์ ํธํ์ฑ ํ์ธ ํ์!!!
๐ฌKafka Producer ์ ์ฉ Java ์์ค
๏ฟผ
๐ฌKey๊ฐ Null ์ธ ๊ฒฝ์ฐ
๏ฟผ
๐ฌKey๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ
- ํํฐ์
์ ์ค๊ฐ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ key์ ํํฐ์
์ ๋งค์นญ์ด ๊นจ์ง!!
- ์ค๊ฐ์ ์ถ๊ฐ์ ์ธ ํํฐ์ ์ ์์ฑํ์ง ์๋ ๊ฒ์ ๊ถ์ฅํจ.
๏ฟผ๏ฟผ
๐ซKafka Consumer
ํํฐ์ ์ ์ ์ฅ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ด(polling)
๐ฌ์ปจ์๋จธ ์ญํ
- Topic์ partition์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ Polling
- Partition offset ์์น ๊ธฐ๋ก (commit)
- Consumer group์ ํตํด ๋ณ๋ ฌ ์ฒ๋ฆฌ
Kafka-client ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ ์ถ๊ฐ ํ์.
- ๋ธ๋ก์ปค ๋ฒ์ & ํด๋ผ์ด์ธํธ ๋ฒ์ ํธํ์ฑ ํ์ธ ํ์!!!
๋ค๋ฅธ ๋ฉ์์ง ์์คํ ๊ณผ ๋ค๋ฅธ ์
- ์ปจ์๋จธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ๋ฉด ํ ๋ด๋ถ ๋ฐ์ดํฐ ์ฌ๋ผ์ง
- ์นดํ์นด๋ ํ ๋ด๋ถ ๋ฐ์ดํฐ ์ฌ๋ผ์ง์ง ์์
๐ฌKafka Consumer ์ ์ฉ Java ์์ค
๏ฟผ๏ฟผ๏ฟผ
- ํด๋ง ๋ฃจํ : poll() ๋ฉ์๋๊ฐ ํฌํจ๋ ๋ฌดํ๋ฃจํ
- Consumer API ํต์ฌ ๋ก์ง
- 0.5์ด ๋์ ๋ฐ์ดํฐ ๋์ฐฉ ๊ธฐ๋ค๋ฆผ. ์ดํ ์ฝ๋ ์คํ
- ๋ง์ฝ 0.5์ด๋์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค์ง ์์ผ๋ฉด ๋น๊ฐ์ ๋ ์ฝ๋ ๋ฐํ / ๋ฐ์ดํฐ ์กด์ฌ ์ records ๊ฐ ๋ฐํ
- records๋ ๋ฐ์ดํฐ ๋ฐฐ์น๋ก, ๋ ์ฝ๋์ ๋ฌถ์ list
๏ฟผ๏ฟผ๏ฟผ
๐ฌKafka Consumer ์๋๋ฐฉ์
๏ฟผ๏ฟผ๏ฟผ๏ฟผ
- offset์ ํ ํฝ๋ณ, ํํฐ์
๋ณ๋ก ๋ฉ๊ฒจ์ง
- offset์ ์ปจ์๋จธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ด๋์ง์ ๊น์ง ์ฝ์๋์ง ํ์ธํ๋ ์ฉ๋
- ์ปจ์๋จธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ๋๋ง๋ค ์นดํ์นด์ __consumer_offset ํ ํฝ์ offset ์ ๋ณด๋ฅผ ์ ์ฅ (commit)
- ์๊ธฐ์น ์๊ฒ ์คํ์ด ์ค๋จ๋ ๊ฒฝ์ฐ, __consumer_offset ํ ํฝ์ offset ์ ๋ณด๋ฅผ ํ ๋๋ก ์์์์น ๋ณต๊ตฌ ๊ฐ๋ฅ
๐ฌ๋์ผํ Kafka Consumer Group
๏ฟผ๏ฟผ๏ฟผ ๏ฟผ
๐ฌ์ฌ๋ฌ ๊ฐ์ Kafka Consumer Group
๏ฟผ๏ฟผ๏ฟผ๏ฟผ
- ์๋ก ๋ค๋ฅธ ์ปจ์๋จธ ๊ทธ๋ฃน์ ๋ํ offset ์ ๋ณด๋ ์ํฅ์ ๋ฏธ์น์ง ์์
- __consumer_offset ํ ํฝ์ ์ปจ์๋จธ ๊ทธ๋ฃน๋ณ๋ก ํ ํฝ๋ณ๋ก offset์ ๋๋์ด ์ ์ฅํ๊ธฐ ๋๋ฌธ