[νμ΅ ν μ€νΈλ‘ λ°°μ보λ kafka] 6. νμ΅ ν μ€νΈλ‘ μΉ΄νμΉ΄ νν°μ (kafka partition) μμ보기
ν΄λΉ μ리μ¦μμ μ 곡νλ λͺ¨λ μμ€μ½λλ github repository μμ μ 곡λ©λλ€. μμΈν μ½λμ ν μ€νΈ μΌμ΄μ€λ github repository μμ νμΈν΄μ£ΌμΈμ.
μ΄λ² [νμ΅ ν μ€νΈλ‘ λ°°μ보λ kafka] μ리μ¦λ μλ μμλλ‘ μ±ν°κ° ꡬμ±λκ³ , μλ¦¬μ¦ μΈλ‘ kafka κ΄λ ¨νμ¬ λμ± λ§μ νμ΅ μ 보λ kafka μ¬ν μΈμ μμ νμΈν μ μμ΅λλ€.
μλ¦¬μ¦ λͺ©μ°¨
- μ리μ¦λ₯Ό μμνλ©°
- kafka λΉ λ₯΄κ² νμ΄λ³΄κ³ μλ체νκΈ°
- kafka 컨μ κ³Ό μ©μ΄ μ 리
- νμ΅ν μ€νΈ μ€λΉνκΈ°
- νμ΅ ν μ€νΈλ‘ kafka producer μμ보기
- νμ΅ ν μ€νΈλ‘ kafka consumer μμ보기
- νμ΅ ν μ€νΈλ‘ partitioning μμ보기 <-- νμ¬ κΈ
- νμ΅ ν μ€νΈλ‘ consumer group κ³Ό rebalancing μμ보기
νμ΅μ λ¨κ³λ³ μμλ‘ λͺ©μ°¨κ° ꡬμ±λμ΄μμΌλ―λ‘ μ νλμ΄μΌ νλ μ±ν°κ° μ‘΄μ¬ν©λλ€
μ§λμκ° μ°λ¦¬λ Producer μ Consumer μ java client μ κΈ°λ³Έμ μΈ λ΄μ©μ λν΄μ νμ΅ ν μ€νΈλ₯Ό ν΅ν΄ μμ보μλ€.
μ΄λ² μκ°μλ Partition μ λν΄μ μμ보λλ‘ νκ² λ€
partitioning
μΌλ°μ μΈ λ°μ΄ν° μ²λ¦¬μ νν°μ λμ λ°μ΄ν°λ₯Ό νΉμ κΈ°μ€μ λ°λΌ λλλ κ²μ μλ―Ένλ€.
μ΄λ κ² λλ μ¬λ¬κ°μ λ©μ΄λ¦¬λ€μ λ 립μ μΌλ‘ μ²λ¦¬ν΄μ λ°μ΄ν° μ²λ¦¬ μ체λ₯Ό λ³λ ¬λ‘ λ§λ€κ±°λ κ²μμ΄ μ©μ΄νλλ‘ λ§λ λ€.
μΉ΄νμΉ΄μμλ λμΌνλ€
μΉ΄νμΉ΄λ ν ν½λ³λ‘ νν°μ λμ μ§μνλ€
ν ν½ λ΄μ λ°μ΄ν°λ₯Ό νλ νΉμ κ·Έ μ΄μμ νν°μ μΌλ‘ λλμ΄ μ΄λ²€νΈ λ‘κ·Έλ€μ κ΄λ¦¬νλ€
μΉ΄νμΉ΄λ μ΄λ κ² νλμ ν ν½μ μ¬λ¬κ°μ νν°μ μΌλ‘ λλ μ λ°μ΄ν° λΆμ° μ μ₯κ³Ό λ³λ ¬ μ²λ¦¬κ° κ°λ₯νλλ‘ νλ€
μ νν°μ λμ νλκ°?
λ°μ΄ν° μ²λ¦¬μ κ°λ μμ νν°μ λμ΄λ μΉ΄νμΉ΄μ νν°μ λμ΄λ κ²°κ΅ λ°μ΄ν°λ₯Ό λ 빨리 μ²λ¦¬νκ³ μ νλ λμ¦μ μν΄ μ겨λ¬λ€.
λ§μ½ νκ°μ λ©μμ§λ₯Ό λ°ννκ³ λ΄λΆμ μΌλ‘ κ·Έ λ©μμ§λ₯Ό μ²λ¦¬νλλ° 1μ΄κ° κ±Έλ¦°λ€κ³ ν΄λ³΄μ.
κ·ΈλΌ 6κ°μ λ©μμ§λ₯Ό λ°ννλλ° μ΄ 6μ΄κ° 걸릴 κ²μ΄λ€
νμ§λ§ 6κ°μ λ©μμ§λ₯Ό 3κ°μ νν°μ μ μ μ₯ν΄μΌ νλ€λ©΄ λ무λλ λΉμ°νκ² 2μ΄λ‘ μκ°μ΄ λ¨μΆλλ 컨μ μ΄λ€
ν ν½μ΄ μ¬λ¬κ°μ νν°μ μΌλ‘ λλλ©΄ μ΄μ μμ°μ€λ½κ² λ©μμ§λ₯Ό μ΄λ€ νν°μ μ 보λ΄μΌ νμ§? νΉμ ν ν½μ ꡬλ νλκ±°μΌ? νν°μ μ ꡬλ νλκ±°μΌ? μ΄λΌλ μ£Όμ λ‘ κ³ λ―Όμ μμν΄μΌ νλ€.
μΉ΄νμΉ΄μ νν°μ ν λΉ
μ°λ¦¬κ° μΉ΄νμΉ΄ νλ‘λμ api λ₯Ό μ΄μ©νμ¬ μΉ΄νμΉ΄ λΈλ‘컀μ λ©μμ§(μ΄λ²€νΈ λ‘κ·Έ)λ₯Ό λ°ννλ€κ³ νμ λ, μΉ΄νμΉ΄ λ΄λΆμ μΌλ‘λ ν΄λΉνλ λ©μμ§λ₯Ό μ΄λ€ νν°μ μ μ μ₯ν΄μΌ νλκ°? μ λν partition assign κ³Όμ μ κ±°μΉκ² λλ€.
μ κ·Έλ¦Όμ 보면 μ μ μλ― μΉ΄νμΉ΄λ λ΄λΆμ μΌλ‘ Partitiner κ° μ΄λ²€νΈ λ‘κ·Έ(λ©μμ§)λ€μ μ΄λ€ νν°μ μ ν λΉν μ§ κ²°μ νλ μν μ μννλ€
νν°μ λλ ν¬κ² 2κ°μ§ νν°μ ν λΉ κΈ°λ²μ μ 곡νλλ°, λ€μκ³Ό κ°λ€
- key based partitioning
- Round Robin Partitioning
μ΄ 2κ°μ§μ λν΄μ μμ보μ
Key Based Partitioning
key based partition μ μ°λ¦¬κ° λ©μμ§λ₯Ό λ°νν λ νΉμ ν€λ₯Ό μ λ ₯νμ¬ ν΄λΉ ν€λ₯Ό hashing ν κ°μΌλ‘ νν°μ μ κ²°μ νλ λ°©λ²μ΄λ€.
νν°μ ν€λ₯Ό κ²°μ νκΈ° μν΄μλ λ€μκ³Ό κ°μ κ³Όμ μ κ±°μΉλ€.
μ°μ νν°μ
ν€λ‘ λ€μ΄μ¨ input κ°μ murmur2
λ₯Ό μ΄μ©ν΄μ ν΄μ±μ νκ³ , κ·Έ κ²°κ³Όλ‘ λμ¨ hash κ°μ νν°μ
μ κ°―μλ§νΌ mod μ°μ°μ μννμ¬ μ€μ λ€μ΄κ° partition μ number λ₯Ό κ²°μ νλ€.
μ΄μ ν μ€νΈλ₯Ό ν΄λ³΄λ©° λ°°μ보μ
ν μ€νΈ 1. ν€λ₯Ό μ΄μ©ν νν°μ Produce ν μ€νΈ
ν μ€νΈ μ€λͺ
- μ£Όμ 1 & 2
- for loop μ λλ©΄μ i κ° μ§μ/νμμ λ°λΌ νν°μ ν€λ₯Ό κ°κ° λ§λ€μλ€.
- μ£Όμ 3.
- ProduceRecord μ μ΄λ²€νΈ λ‘κ·Έλ₯Ό partitionKey μ value ννλ‘ μμ±νλ€
- μμ producer μμ νμ΅νλ κ² μ²λΌ κ²°κ³Όλ₯Ό μΆλ ₯νλ callback μ μΆκ°ν΄μ£Όμλ€
- μ£Όμ 4.
- μ½μ κ²°κ³Ό μΆλ ₯μ μν΄ blocking νλ€
ν μ€νΈλ₯Ό μ€νμν€λ©΄ λ€μκ³Ό κ°μ κ²°κ³Όκ° λμ¨λ€
κ·ΈλΌ μμ producer ννΈμμ λ°°μ λ ν μ€νΈλ€ μ²λΌ ν€λ₯Ό λͺ μνμ§ μμΌλ©΄ μ΄λ»κ² λ κΉ?
μλ ν μ€νΈμμ νμΈν΄λ³΄μ
ν μ€νΈ 2. λΌμ΄λ λ‘λΉ νν°μ Produce ν μ€νΈ
ν μ€νΈ μ€λͺ
- μ£Όμ 1 & 2
- for loop μ μ΄ 6λ² λλ€
- μ£Όμ 2.
- ProduceRecord μ μ΄λ²€νΈ λ‘κ·Έλ₯Ό partitionKey μμ΄ μμ±νλ€
- μμ producer μμ νμ΅νλ κ² μ²λΌ κ²°κ³Όλ₯Ό μΆλ ₯νλ callback μ μΆκ°ν΄μ£Όμλ€
- μ£Όμ 4.
- μ½μ κ²°κ³Ό μΆλ ₯μ μν΄ blocking νλ€
μ΄ ν μ€νΈλ₯Ό μ€νμν€λ©΄ λ€μκ³Ό κ°μ κ²°κ³Όκ° μΆλ ₯λλ€
μμ κ²°κ³Όλ₯Ό 보면 μ μ μλ―μ΄, μ€μ ν€λ₯Ό λͺ μνμ§ μμμ§λ§ λ΄λΆμ μΌλ‘ partitioner μ μν΄ Round Robin ννλ‘ ν€κ° ν λΉλμ΄ κ³ λ₯΄κ² νν°μ μ λ€μ΄κ° κ²μ νμΈν μ μλ€
ν μ€νΈ 3. νν°μ ν€ μΆ©λ ν μ€νΈ
μμ νν°μ ν λΉ λμμ€ ν΄μ κ³Όμ μ κ±°μΉλ€κ³ νλλ°, μ¬κΈ°μ μ£Όμν μ μ΄ μλ€.
μλμ ν μ€νΈλ₯Ό νμΈν΄λ³΄μ
ν μ€νΈ μ€λͺ
- μ£Όμ 1
- kafka λ λ΄λΆμ μΌλ‘ hash λ₯Ό νκΈ° μν΄ murmur hashing λ₯Ό νλ€.
- key-1 μ΄λΌλ λ¬Έμμ΄μ hash νκ³ μμμ νν°μ μ(2) λ§νΌ mod μ°μ°μ μννμ¬ νν°μ λ²νΈλ₯Ό ꡬνλ€
- μ£Όμ 2.
- key-2 μ΄λΌλ λ¬Έμμ΄μ νν°μ ν€λ‘ μ€μ ν΄ νν°μ λ²νΈλ₯Ό ꡬνλ€
- μ£Όμ 3.
- λ ν€κ° λ¬λΌμΌ νλ€λ ν μ€νΈ λ¨μΈλ¬Έμ΄λ€
μ΄ ν μ€νΈλ μλ‘ λ€λ₯Έ ν€λ₯Ό λͺ μνκΈ° λλ¬Έμ μ€ν¨ν΄μΌνλ€.
νμ§λ§ μνκΉκ²λ μ€ν¨νλ€.
μ΄κ²μ νν°μ ν€ μΆ©λμ΄λΌκ³ νλ€.
μλ‘ λ€λ₯Έ νν°μ ν€λ₯Ό κ°μ‘λλΌλ ν΄μκ°μ νν°μ μλ‘ mod μ°μ°ν κ²°κ³Όκ° λμΌνκΈ° λλ¬Έμ μ΄μ κ°μ λ¬Έμ κ° λ°μνλ κ²μ΄λ€.
κ°λ°μλ νν°μ ν€λ₯Ό μ ν λΉνλ€κ³ μκ°νμ§λ§ μ€μ λ‘ νν°μ ν€κ° λμΌνκΈ° λλ¬Έμ νμͺ½μΌλ‘ λͺ°λ¦Ό νμμ΄ λ°μν μ μλλ°, μ΄λ‘ μΈν΄μ νν°μ λμ νμ§λ§ μ€μ§μ μΌλ‘λ μλ¬΄λ° ν¨κ³Όλ μ»μ μ μλ μν©μ΄ λμ΄λ²λ¦°λ€.
μ΄λ° ν€ μΆ©λμ μ΅μν νκΈ° μν΄μ ν€μ λν΄μ μ¬μ μ μΆ©λΆν ν μ€νΈ κ³Όμ μ΄ μκ±°λ νν°μ μλ₯Ό λ리λ κ²μ κ³ λ €ν΄μΌν μλ μλ€.
νν°μ κ³Ό λ©μμ§ μμ
νν°μ μ μ΄μΌκΈ°ν λλ νμ μμμ λν μ΄μΌκΈ°κ° λμ¨λ€.
κ²°λ‘ λΆν° μ΄μΌκΈ° νμλ©΄,
νν°μ λ΄λΆμ λ©μμ§ μμλ 보μ₯μ΄ λμ§λ§ νν°μ κ°μ μμλ 보μ₯λμ§ μλλ€.
μμ ν μ€νΈλ₯Ό ν΅ν΄ μμ보μ
ν μ€νΈ 4. λ¨μΌ νν°μ μμ λ©μμ§ μμ νμΈ ν μ€νΈ
μλ ν μ€νΈλ λ¨μΌ νν°μ μ΄ μ€μ λ ν ν½μΌλ‘ λ©μμ§λ₯Ό λ°ννκ³ μλΉνλ ν μ€νΈμ΄λ€. ν μ€νΈ μ λ¬Έμ github μμ νμΈν μ μλ€.
ν μ€νΈ μ€λͺ
- μ£Όμ 1
- λ©μμ§λ₯Ό λ°ννλ€.
- μμλλ‘ μνλ²³κ³Ό μ΄λͺ¨μ§λ₯Ό λ°ννλ€.
- μ£Όμ 2.
- consumer μ νΉμ ν ν½μ λν΄ subscribe νλ€.
- μ£Όμ 3 & 4
- consumer μ
poll()
μ°μ°μ ν΅ν΄μ λ©μμ§λ₯Ό μλΉνκ³ ν΄λΉ λ©μμ§ μ€νΈλ¦Όμ String 리μ€νΈλ‘ λ³ννλ€
- consumer μ
- μ£Όμ 5
- ν μ€νΈ λ¨μΈλ¬Έμ ν΅ν΄ List μ λ΄μ©λ¬Όκ³Ό λμΌν μμμΈμ§ κ²μ¦νλ€
μ΄ ν μ€νΈλ μ±κ³΅νλ€
ν μ€νΈ 5. λ€μ€ νν°μ μμ λ©μμ§ μμ νμΈ ν μ€νΈ
μλ ν μ€νΈλ λ€μ€ νν°μ μ΄ μ€μ λ ν ν½μΌλ‘ λ©μμ§λ₯Ό λ°ννκ³ μλΉνλ ν μ€νΈμ΄λ€.
ν μ€νΈ μ€λͺ
- μ£Όμ 1
- λ©μμ§λ₯Ό λ°ννλ€.
- μμλλ‘ μνλ²³κ³Ό μ΄λͺ¨μ§λ₯Ό λ°ννλ€.
- μ£Όμ 2.
- consumer μ νΉμ ν ν½μ λν΄ subscribe νλ€.
- μ£Όμ 3 & 4
- consumer μ
poll()
μ°μ°μ ν΅ν΄μ λ©μμ§λ₯Ό μλΉνκ³ ν΄λΉ λ©μμ§ μ€νΈλ¦Όμ String 리μ€νΈλ‘ λ³ννλ€
- consumer μ
- μ£Όμ 5
- ν μ€νΈ λ¨μΈλ¬Έμ ν΅ν΄ List μ λ΄μ©λ¬Όκ³Ό λμΌν μμμΈμ§ κ²μ¦νλ€
- μμλλ‘ μλΉλμ§ μλλ€.
λ°ν μμλλ‘ μλΉνμ§ μλκ²μ νμΈνλ μμ ν μ€νΈ μμ ν΅κ³Όνλ€.
νν°μ μλ μΌλ§κ° μ λΉν κΉ?
μμ λ΄μ©λ€μ μ’ ν©μ μΌλ‘ μκ°ν΄λ΄€μ λ, νν°μ μλ₯Ό κ²°μ νλ μΌμ λ§€μ° μ€μνλ€.
μ°λ¦¬λ λ©μμ§μ μ²λ¦¬λμ λμ΄κΈ° μν΄μ νν°μ λμ νλ€.
κ·ΈλΌ μ²λ¦¬λμ λ§€μ° λμ΄κΈ° μν΄μ νν°μ μ 100κ°, 1000κ° λλ €λ λ κΉ? λΉμ°ν μλλ€.
νν°μ μ μΉ΄νμΉ΄ λΈλ‘컀 λ΄λΆμ ν ν½ λλ ν 리λ 맀νλκ³ νν°μ μ μ μ₯λλ λ©μμ§λ§λ€ 2κ°μ νμΌ(μΈλ±μ€, λ°μ΄ν°)κ° μ μ₯λλ€.
κ²°κ΅ νν°μ μ΄ λ§μμλ‘ νμΌ νΈλ€λ¬ μκ° λ§μμ Έ νμΌ νΈλ€λ¬κ° λλΉκ° λ μ μλ€.
νμ§λ§ νν°μ μκ° μ λ€λ©΄ λ©μμ§ μ²λ¦¬λμ΄ μ€μ΄λ€μ΄ μ±λ₯μ΄ μ λ°μ μΌλ‘ μ νλ μ μλ€.
λ¬Όλ‘ μν©κ³Ό 쑰건μ λ°λΌμ κ²°μ μ¬νμ΄ κ³μ λ°λκ² λ κ²μΈλ°, μ΄λ¬ν μ¬νλ€μ μΈμ§νκ³ μμΌλ©΄ μ νμ λμμ΄ λ κ²μ΄λ€
νμ΅ ν μ€νΈ μ 리
- β νν°μ ν€λ₯Ό λͺ μνλ©΄ ν΄λΉ ν€μ ν΄λΉνλ νν°μ μ λ©μμ§(μ΄λ²€νΈ λ‘κ·Έ)κ° λ°νλλ€
- β νν°μ ν€λ₯Ό λͺ μνμ§ μμΌλ©΄ partitioner μ μν΄ μ μ ν νν°μ μ κ³ λ₯΄κ² λΆλ°°λλ€
- β νν°μ ν€λ₯Ό λͺ μνλλΌλ νν°μ ν λΉ μΆ©λμ΄ λ°μν μ μμΌλ―λ‘ κ·Έ μ μ κ³ λ €ν΄μΌνλ€
- β νν°μ λ΄μμλ μμλ₯Ό 보μ₯νλ€
- β ν ν½ λ΄μ μ¬λ¬ νν°μ κ°μ μμλ 보μ₯νμ§ μλλ€