raft

1. Raft Consensus Algorithm

ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„๋•Œ, ๋…ธ๋“œ๋“ค์ด ์„œ๋กœ ๋™์ผํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์ด๋ก ๋นผ๊ณ  ์‹ค์ „

zookeeper

vi docker-compose.yml

version: '3.8'
services:
  zk1:
    image: confluentinc/cp-zookeeper:7.4.1
    hostname: zk1
    container_name: zk1
    environment:
      ZOOKEEPER_SERVER_ID: 1
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_INIT_LIMIT: 5
      ZOOKEEPER_SYNC_LIMIT: 2
      ZOOKEEPER_SERVERS: zk1:2888:3888;zk2:2888:3888;zk3:2888:3888
  zk2:
    image: confluentinc/cp-zookeeper:7.4.1
    hostname: zk2
    container_name: zk2
    environment:
      ZOOKEEPER_SERVER_ID: 2
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_INIT_LIMIT: 5
      ZOOKEEPER_SYNC_LIMIT: 2
      ZOOKEEPER_SERVERS: zk1:2888:3888;zk2:2888:3888;zk3:2888:3888
  zk3:
    image: confluentinc/cp-zookeeper:7.4.1
    hostname: zk3
    container_name: zk3
    environment:
      ZOOKEEPER_SERVER_ID: 3
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_INIT_LIMIT: 5
      ZOOKEEPER_SYNC_LIMIT: 2
      ZOOKEEPER_SERVERS: zk1:2888:3888;zk2:2888:3888;zk3:2888:3888

  kafka1:
    image: confluentinc/cp-kafka:7.4.1
    hostname: kafka1
    container_name: kafka1
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zk1:2181,zk2:2182,zk3:2183
      KAFKA_LISTENERS: INTERNAL://kafka1:9092
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka1:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
  kafka2:
    image: confluentinc/cp-kafka:7.4.1
    hostname: kafka2
    container_name: kafka2
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: zk1:2181,zk2:2182,zk3:2183
      KAFKA_LISTENERS: INTERNAL://kafka2:9092
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka2:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
  kafka3:
    image: confluentinc/cp-kafka:7.4.1
    hostname: kafka3
    container_name: kafka3
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ZOOKEEPER_CONNECT: zk1:2181,zk2:2182,zk3:2183
      KAFKA_LISTENERS: INTERNAL://kafka3:9092
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka3:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3

  kafka-ui:
    image: provectuslabs/kafka-ui:latest
    hostname: kafka-ui
    container_name: kafka-ui
    ports:
      - 8080:8080
    environment:
      KAFKA_CLUSTERS_0_NAME: kafka
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka1:9092,kafka2:9092,kafka3:9092
    depends_on:
      - kafka1
      - kafka2
      - kafka3

์ด์ œ zookeeper๋ฅผ ํ•˜๋‚˜ ์ฃฝ์—ฌ๋ด…๋‹ˆ๋‹ค.

๋™์ž‘

ํ•˜๋‚˜ ๋” ์ฃฝ์—ฌ๋ด…๋‹ˆ๋‹ค.

์—๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3๊ฐœ์—์„œ๋Š” 2๊ฐœ ์ฃฝ์œผ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ํญ๋ฐœ..

kraft

3๊ฐœ node kraft kafka cluster๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

vi docker-compose.yml

๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ controler๋ฅผ ํ•˜๋‚˜ ์ฃฝ์—ฌ๋ด…๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜ ๋” ์ฃฝ์—ฌ๋ด…๋‹ˆ๋‹ค.

์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” controller๊ฐ€ ์ •์กฑ์ˆ˜(2๊ฐœ)๋ฅผ ๋„˜์ง€ ๋ชปํ•ด์„œ ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

kraft๋„ ์—ฌ์ „ํžˆ Raft Consensus Algorithm ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋•Œ๋ฌธ์— ์ •์กฑ์ˆ˜๋ฅผ ๋„˜์ง€ ๋ชปํ•˜๋ฉด ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

https://thesecretlivesofdata.com/raft/ ์ด ์‚ฌ์ดํŠธ ์‹ ๊ธฐํ•˜๋„ค์š”

๋‚ด๊ฒฐํ•จ์„ฑ์„ ์œ„ํ•œ ์ตœ์ ์˜ ๋…ธ๋“œ ์ˆ˜

ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Consensus Algorithm)์„ ์ฑ„ํƒํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ „์ฒด ๋…ธ๋“œ ์ˆ˜๋ฅผ ๊ฐ€๊ธ‰์  3๊ฐœ ์ด์ƒ์˜ ํ™€์ˆ˜๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ „์ฒด ๋…ธ๋“œ ์ˆ˜
ํ•„์š” ์ •์กฑ์ˆ˜ ํ—ˆ์šฉ
๊ฐ€๋Šฅ ์žฅ์•  ๋…ธ๋“œ ์ˆ˜

1

1

0

2

2

0

3

2

1

4

3

1

5

3

2

6

4

2

7

4

3

8

5

3

... ... ... 2k (์ง์ˆ˜) k+1 k-1 2k+1 (ํ™€์ˆ˜) k+1 k

์ „์ฒด ๋…ธ๋“œ ์ˆ˜๊ฐ€ 3๊ฐœ ์ด์ƒ์ด์–ด์•ผ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์žฅ์•  ๋…ธ๋“œ๊ฐ€ ์ƒ๊ธด๋‹ค. ๊ทธ ๋ฏธ๋งŒ์œผ๋กœ๋Š” ๋‚ด๊ฒฐํ•จ์„ฑ์„ ๊ฐ–์ถœ ์ˆ˜ ์—†๋‹ค.

2๊ฐœ์˜ ๋…ธ๋“œ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ž์› ๊ด€๋ฆฌ์˜ ์ธก๋ฉด์—์„œ๋‚˜ ๋‚ด๊ฒฐํ•จ์„ฑ์˜ ์ธก๋ฉด์—์„œ๋‚˜ ๋ชจ๋‘ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ์‹์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

zookeeper๋‚˜ controller ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ด์•ผ๊ธฐํ•˜๋Š”๊ฒƒ์ž…๋‹ˆ๋‹ค. kafka ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

Last updated

Was this helpful?