λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Kafka μ„±λŠ₯ νŠœλ‹κ³Ό μ΅œμ ν™”: κ³ μ²˜λ¦¬λŸ‰ μš”κ΅¬ 사항 λŒ€μ‘ 방법

okrestart 2024. 10. 23.

 

Apache Kafka λŠ” κ³ μ„±λŠ₯ 데이터 슀트리밍 ν”Œλž«νΌμœΌλ‘œ 널리 μ‚¬μš©λ˜κ³  μžˆμ§€λ§Œ, λŒ€κ·œλͺ¨ 데이터 νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ μ ˆν•œ μ„±λŠ₯ νŠœλ‹ 이 ν•„μˆ˜μ μž…λ‹ˆλ‹€. 이 ν¬μŠ€νŒ…μ—μ„œλŠ” ν”„λ‘œλ“€μ„œ 와 컨슈머 μ„€μ • μ΅œμ ν™”, Kafka ν΄λŸ¬μŠ€ν„° ꡬ성 νŠœλ‹ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„±λŠ₯ ν”„λ‘œνŒŒμΌλ§ , 그리고 κ³ μ²˜λ¦¬λŸ‰ μš”κ΅¬ 사항 λŒ€μ‘ 방법을 μ„€λͺ…ν•©λ‹ˆλ‹€.

 


 

 

1. ν”„λ‘œλ“€μ„œμ™€ 컨슈머 μ„€μ • μ΅œμ ν™”

Kafka μ„±λŠ₯의 핡심 μš”μ†ŒλŠ” ν”„λ‘œλ“€μ„œ 와 컨슈머 의 μ„€μ •μž…λ‹ˆλ‹€. 이 섀정듀이 μ μ ˆν•˜κ²Œ μ‘°μ •λ˜μ§€ μ•ŠμœΌλ©΄ μ„±λŠ₯ μ €ν•˜λ₯Ό μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” μ£Όμš” νŠœλ‹ μ˜΅μ…˜κ³Ό μ„€λͺ…μž…λ‹ˆλ‹€.

ν”„λ‘œλ“€μ„œ μ΅œμ ν™” μ„€μ •

 

a. acks μ„€μ •

  • acks=all : λͺ¨λ“  λ¦¬ν”Œλ¦¬μΉ΄κ°€ 데이터λ₯Ό 받을 λ•ŒκΉŒμ§€ λŒ€κΈ°. μ•ˆμ „μ„± λ†’μŒ.
  • acks=1 : 리더 λ¦¬ν”Œλ¦¬μΉ΄λ§Œ 확인. μ„±λŠ₯ ν–₯상.
  • acks=0 : ν™•μΈν•˜μ§€ μ•Šκ³  전솑. 맀우 λΉ λ₯΄μ§€λ§Œ 데이터 손싀 μœ„ν—˜.

 

b. 배치 크기 μ‘°μ •

  • batch.size : ν”„λ‘œλ“€μ„œκ°€ ν•œ λ²ˆμ— μ „μ†‘ν•˜λŠ” λ©”μ‹œμ§€ 크기. 기본값은 16KB. νŠΈλž˜ν”½μ΄ λ§Žμ„μˆ˜λ‘ 이 값을 λ†’μ—¬ μ„±λŠ₯을 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

c. λŒ€κΈ° μ‹œκ°„ μ„€μ •

  • linger.ms : 배치λ₯Ό κΈ°λ‹€λ¦¬λŠ” μ‹œκ°„. 기본값은 0μ΄μ§€λ§Œ, μ•½κ°„μ˜ λŒ€κΈ° μ‹œκ°„μ„ μ£Όμ–΄ 배치λ₯Ό 더 효율적으둜 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜 5~10ms 섀정이 μœ νš¨ν•©λ‹ˆλ‹€.

컨슈머 μ΅œμ ν™” μ„€μ •

 

a. fetch.min.bytes 및 fetch.max.wait.ms

  • fetch.min.bytes : μ»¨μŠˆλ¨Έκ°€ ν•œ λ²ˆμ— κ°€μ Έμ˜¬ μ΅œμ†Œ 데이터 크기. 더 λ§Žμ€ 데이터λ₯Ό ν•œ λ²ˆμ— κ°€μ Έμ˜€λ©΄ I/O νš¨μœ¨μ„±μ΄ ν–₯μƒλ©λ‹ˆλ‹€.
  • fetch.max.wait.ms : μ»¨μŠˆλ¨Έκ°€ 데이터λ₯Ό κΈ°λ‹€λ¦¬λŠ” μ΅œλŒ€ μ‹œκ°„. νŠΈλž˜ν”½μ΄ 적을 λ•ŒλŠ” 이 값을 높이면 배치 처리λ₯Ό μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

b. max.poll.records

  • max.poll.records : ν•œ λ²ˆμ— κ°€μ Έμ˜€λŠ” λ©”μ‹œμ§€ 수. 처리 μ„±λŠ₯을 높이렀면 이 값을 적절히 μ„€μ •ν•˜μ—¬ ν•œ λ²ˆμ— λ§Žμ€ λ©”μ‹œμ§€λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

 


 

2. Kafka ν΄λŸ¬μŠ€ν„° ꡬ성 νŠœλ‹

Kafka의 ν΄λŸ¬μŠ€ν„° μ„±λŠ₯은 λΈŒλ‘œμ»€μ™€ νŒŒν‹°μ…˜ 수, λ¦¬ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ • 등에 μ˜ν•΄ 크게 μ’Œμš°λ©λ‹ˆλ‹€. ν΄λŸ¬μŠ€ν„°μ˜ ꡬ성을 μ΅œμ ν™”ν•˜λ©΄ Kafka의 ν™•μž₯μ„±κ³Ό μ„±λŠ₯을 크게 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

브둜컀 ꡬ성 μ΅œμ ν™”

 

a. λ©”μ‹œμ§€ 크기 μ΅œμ ν™”

  • message.max.bytes : λΈŒλ‘œμ»€κ°€ ν—ˆμš©ν•  수 μžˆλŠ” μ΅œλŒ€ λ©”μ‹œμ§€ 크기. 이 값을 늘리면 λŒ€μš©λŸ‰ 데이터λ₯Ό 전솑할 수 μžˆμ§€λ§Œ, μ§€λ‚˜μΉ˜κ²Œ 큰 λ©”μ‹œμ§€λŠ” ν΄λŸ¬μŠ€ν„°μ— λΆ€ν•˜λ₯Ό 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

 

b. μ••μΆ• μ‚¬μš©

  • compression.type : 데이터 압좕을 μ‚¬μš©ν•˜μ—¬ λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­μ„ μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. snappy , lz4 , zstd 와 같은 κ²½λŸ‰ μ••μΆ• μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λ©΄ μ„±λŠ₯ μ €ν•˜ 없이 데이터 크기λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

 

c. λ¦¬ν”Œλ¦¬μΌ€μ΄μ…˜ νŒ©ν„°

  • λ¦¬ν”Œλ¦¬μΌ€μ΄μ…˜ νŒ©ν„° λ₯Ό μ μ ˆν•˜κ²Œ μ„€μ •ν•˜λ©΄ 데이터 μ•ˆμ •μ„±μ„ 확보할 수 μžˆμ§€λ§Œ, μ§€λ‚˜μΉ˜κ²Œ λ†’μœΌλ©΄ μ„±λŠ₯에 영ν–₯을 쀄 수 μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜 3이 ꢌμž₯λ©λ‹ˆλ‹€.

νŒŒν‹°μ…˜ 및 ν† ν”½ 관리

 

a. νŒŒν‹°μ…˜ 수 증가

  • νŒŒν‹°μ…˜ 수 λ₯Ό 늘리면 Kafka ν΄λŸ¬μŠ€ν„°κ°€ 더 λ§Žμ€ 데이터λ₯Ό λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ„ˆλ¬΄ λ§Žμ€ νŒŒν‹°μ…˜μ€ μ˜€λ²„ν—€λ“œλ₯Ό μ¦κ°€μ‹œν‚¬ 수 μžˆμœΌλ―€λ‘œ μ μ ˆν•œ 수λ₯Ό μ„€μ •ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

 

b. νŒŒν‹°μ…˜ 리더 κ· ν˜• μ‘°μ •

  • λͺ¨λ“  λΈŒλ‘œμ»€κ°€ λ™μΌν•œ 수의 νŒŒν‹°μ…˜ 리더 역할을 ν•˜λ„λ‘ κ· ν˜•μ„ λ§žμΆ°μ•Ό ν΄λŸ¬μŠ€ν„° μ „λ°˜μ˜ λΆ€ν•˜κ°€ κ³ λ₯΄κ²Œ λΆ„μ‚°λ©λ‹ˆλ‹€.

 


 

3. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„±λŠ₯ ν”„λ‘œνŒŒμΌλ§

Kafkaλ₯Ό μ‚¬μš©ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ μ ˆν•˜κ²Œ λ™μž‘ν•˜λŠ”μ§€ ν™•μΈν•˜λ €λ©΄ μ„±λŠ₯ ν”„λ‘œνŒŒμΌλ§ 이 ν•„μˆ˜μ μž…λ‹ˆλ‹€. Java 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λΌλ©΄ JMX(Java Management Extensions) λͺ¨λ‹ˆν„°λ§μ„ 톡해 Kafka의 λ‹€μ–‘ν•œ μ„±λŠ₯ μ§€ν‘œλ₯Ό 좔적할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ£Όμš” μ§€ν‘œ

 

a. producer-metrics

  • λ ˆμ½”λ“œ μ „μ†‘μœ¨ , 배치 크기 , λŒ€κΈ° μ‹œκ°„ 등을 μΆ”μ ν•˜μ—¬ ν”„λ‘œλ“€μ„œ μ„±λŠ₯을 뢄석할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

b. consumer-metrics

  • μ†ŒλΉ„μœ¨ , λ ˆμ½”λ“œ 지연 μ‹œκ°„ 등을 λͺ¨λ‹ˆν„°λ§ν•˜μ—¬ 컨슈머의 μ„±λŠ₯ 병λͺ©μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

c. 브둜컀 μ§€ν‘œ

  • λ””μŠ€ν¬ I/O , λ„€νŠΈμ›Œν¬ I/O , λ©”μ‹œμ§€ μ²˜λ¦¬λŸ‰ λ“± 브둜컀의 μ„±λŠ₯을 μ§€μ†μ μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ: JMX 기반 λͺ¨λ‹ˆν„°λ§ μ„€μ •

# Kafka 브둜컀 섀정에 JMXλ₯Ό ν™œμ„±ν™”ν•©λ‹ˆλ‹€.
KAFKA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

 


 

4. κ³ μ²˜λ¦¬λŸ‰ μš”κ΅¬ 사항 λŒ€μ‘ 방법

Kafkaλ₯Ό κ³ μ²˜λ¦¬λŸ‰ μš”κ΅¬ 사항에 맞게 νŠœλ‹ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒκ³Ό 같은 방법을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

배치 처리 μ΅œμ ν™”

배치 μ²˜λ¦¬λŠ” Kafka의 μ„±λŠ₯을 λ†’μ΄λŠ” 핡심 방법 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. ν”„λ‘œλ“€μ„œ 배치 및 컨슈머 배치 섀정을 μ΅œμ ν™”ν•˜λ©΄ λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­κ³Ό μ‹œμŠ€ν…œ λ¦¬μ†ŒμŠ€λ₯Ό 더 효율적으둜 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

압좕을 ν†΅ν•œ λ„€νŠΈμ›Œν¬ μ΅œμ ν™”

KafkaλŠ” 데이터λ₯Ό 전솑할 λ•Œ μ••μΆ• 을 톡해 λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­μ„ μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 특히 κ³ μ²˜λ¦¬λŸ‰ μš”κ΅¬ 사항이 μžˆλŠ” 경우, μ μ ˆν•œ μ••μΆ• μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ 전솑 νš¨μœ¨μ„ κ·ΉλŒ€ν™”ν•˜μ„Έμš”.

ν•˜λ“œμ›¨μ–΄ λ¦¬μ†ŒμŠ€ ν™•μž₯

  • SSD μ‚¬μš© : KafkaλŠ” λ§Žμ€ 데이터λ₯Ό λΉ λ₯΄κ²Œ μ €μž₯ν•˜κ³  읽어야 ν•˜λ―€λ‘œ, SSD μ‚¬μš©μ„ 톡해 λ””μŠ€ν¬ I/O μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ©”λͺ¨λ¦¬ 증가 : Kafka λΈŒλ‘œμ»€λŠ” λ©”μ‹œμ§€λ₯Ό 캐싱할 λ•Œ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ, λ©”λͺ¨λ¦¬ 크기λ₯Ό 늘리면 더 λ§Žμ€ 데이터λ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λΆ„μ‚° ν΄λŸ¬μŠ€ν„° ν™•μž₯

데이터 μ²˜λ¦¬λŸ‰μ΄ 계속 μ¦κ°€ν•˜λŠ” 경우, λΆ„μ‚° ν΄λŸ¬μŠ€ν„° λ₯Ό 톡해 Kafkaλ₯Ό ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ 개의 브둜컀λ₯Ό μΆ”κ°€ν•˜μ—¬ 처리 μ„±λŠ₯을 높이고, νŒŒν‹°μ…˜μ„ λΆ„μ‚°μ‹œμΌœ λΆ€ν•˜λ₯Ό κ³ λ₯΄κ²Œ λ‚˜λˆ„λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

 


 

자주 λ¬»λŠ” 질문 (FAQ)

Q1. Kafkaμ—μ„œ acks 섀정은 무엇이며, μ–΄λ–»κ²Œ μ„€μ •ν•˜λ‚˜μš”?
A1. acks λŠ” ν”„λ‘œλ“€μ„œκ°€ λ©”μ‹œμ§€λ₯Ό Kafka둜 전솑할 λ•Œ 확인 응닡을 λ°›λŠ” 방식 을 μ„€μ •ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€. acks=all 은 μ•ˆμ „μ„±μ„ 높이고, acks=1 은 μ„±λŠ₯을 μ€‘μ‹œν•˜λ©°, acks=0 은 κ°€μž₯ λΉ λ₯Έ 속도λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

Q2. Kafka ν΄λŸ¬μŠ€ν„°μ—μ„œ νŒŒν‹°μ…˜ 수λ₯Ό μ–΄λ–»κ²Œ κ²°μ •ν•˜λ‚˜μš”?
A2. νŒŒν‹°μ…˜ μˆ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 병렬 처리 μ„±λŠ₯ κ³Ό 관련이 있으며, 더 λ§Žμ€ νŒŒν‹°μ…˜μ„ μ‚¬μš©ν•˜λ©΄ 병렬 μ²˜λ¦¬κ°€ ν–₯μƒλ˜μ§€λ§Œ 관리 μ˜€λ²„ν—€λ“œκ°€ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜 μ²˜λ¦¬λŸ‰μ— 맞게 μ μ ˆν•œ νŒŒν‹°μ…˜ 수 λ₯Ό μ„€μ •ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

Q3. Kafkaμ—μ„œ 배치 μ²˜λ¦¬λŠ” μ™œ μ€‘μš”ν•œκ°€
Q3. Kafkaμ—μ„œ 배치 μ²˜λ¦¬λŠ” μ™œ μ€‘μš”ν•œκ°€μš”?
A3.
배치 처리 λŠ” λ©”μ‹œμ§€λ₯Ό λ¬Άμ–΄μ„œ ν•œ λ²ˆμ— μ „μ†‘ν•¨μœΌλ‘œμ¨ λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­ κ³Ό μ‹œμŠ€ν…œ λ¦¬μ†ŒμŠ€**λ₯Ό μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 배치 크기λ₯Ό 적절히 μ‘°μ •ν•˜λ©΄ ν”„λ‘œλ“€μ„œμ™€ 컨슈머의 νš¨μœ¨μ„±μ„ κ·ΉλŒ€ν™”ν•˜κ³ , μ„±λŠ₯을 크게 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

Q4. Kafka의 λ¦¬ν”Œλ¦¬μΌ€μ΄μ…˜ νŒ©ν„°λŠ” λ¬΄μ—‡μΈκ°€μš”?
A4. λ¦¬ν”Œλ¦¬μΌ€μ΄μ…˜ νŒ©ν„° λŠ” λ©”μ‹œμ§€κ°€ μ—¬λŸ¬ λΈŒλ‘œμ»€μ— λ³΅μ œλ˜λŠ” 횟수λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 이 값을 높이면 데이터 μ•ˆμ •μ„± 이 ν–₯μƒλ˜μ§€λ§Œ, 그만큼 λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½ κ³Ό μ €μž₯μ†Œ μ‚¬μš©λŸ‰ 이 μ¦κ°€ν•©λ‹ˆλ‹€. 일반적으둜 3 이 μ μ ˆν•œ κ°’μœΌλ‘œ ꢌμž₯λ©λ‹ˆλ‹€.

Q5. Kafka ν΄λŸ¬μŠ€ν„°μ—μ„œ μ„±λŠ₯을 λͺ¨λ‹ˆν„°λ§ν•˜λŠ” κ°€μž₯ 쒋은 방법은 λ¬΄μ—‡μΈκ°€μš”?
A5. JMX(Java Management Extensions) λ₯Ό μ‚¬μš©ν•΄ Kafka ν΄λŸ¬μŠ€ν„°μ˜ λ‹€μ–‘ν•œ μ„±λŠ₯ μ§€ν‘œλ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Prometheus , Grafana 같은 도ꡬλ₯Ό μ‚¬μš©ν•΄ 브둜컀의 λ””μŠ€ν¬ I/O , λ„€νŠΈμ›Œν¬ μ²˜λ¦¬λŸ‰ , λ ˆμ½”λ“œ 지연 μ‹œκ°„ λ“±μ˜ μ„±λŠ₯을 μΆ”μ ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

 


 

κ²°λ‘ 

Kafka의 μ„±λŠ₯을 μ΅œμ ν™”ν•˜λ €λ©΄ ν”„λ‘œλ“€μ„œμ™€ 컨슈머의 μ„€μ • , ν΄λŸ¬μŠ€ν„° ꡬ성 , μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œνŒŒμΌλ§ , 그리고 κ³ μ²˜λ¦¬λŸ‰ λŒ€μ‘ 을 μœ„ν•œ λ‹€μ–‘ν•œ 방법을 μ μ ˆν•˜κ²Œ μ‘°ν•©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 ν¬μŠ€νŒ…μ—μ„œ μ†Œκ°œν•œ νŠœλ‹ 방법듀을 톡해 Kafka의 μ„±λŠ₯을 μ΅œλŒ€ν•œ λŒμ–΄μ˜¬λ¦¬κ³ , μ•ˆμ •μ μ΄κ³  ν™•μž₯ κ°€λŠ₯ν•œ μ‹œμŠ€ν…œ 을 ꡬ좕할 수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€