Kafka
본 문서에서는 Kafka에 관해 설명한다.
BXI의 기본 구성에서는 온라인 인스턴스가 거래 처리와 로깅을 모두 수행하지만, 로깅 인스턴스 및 Kafka를 이용해 로깅 역할을 분리할 수 있다. 거래 처리 스레드와 로깅 스레드를 분리하여 가용성을 높일 수 있다.
1. 아키텍처

BXI에서는 로그의 종류별로 Kafka 토픽을 생성하는데, 이 때 모든 토픽명은 로그명에 테넌트ID가 추가된 형태이다. (EX. errorLog_999: errorLog + _ + 테넌트ID)
BXI 엔진에서 온라인 인스턴스의 Producer는 각각의 토픽에 인입할 레코드를 생성해 Kafka 서버에 보내고, 로깅 인스턴스의 Consumer는 각각의 토픽에서 레코드를 가져와 DB에 Insert 하여 실제 로깅을 수행한다. 이 때 각 토픽에 대한 Producer와 Consumer는 별도의 스레드로 작동하는데, Consumer 스레드는 해당하는 토픽의 파티션 갯수만큼 생성되며, Producer는 그보다는 적게 생성된다.(파티션 수/5)
로깅 인스턴스는 거래 처리는 하지 않으나 에러가 발생할 수 있으므로, ErrorLogProducer가 추가로 존재한다. |
2. 설정
Kafka 사용을 위해 필요한 설정 작업은 아래와 같다. 아래 작업을 완료 후 로그관리를 참조한다.
2.1. Kafka 서버가 1대인 경우
2.1.1. ZooKeeper 설정
# zookeeper 데이터 경로 설정
dataDir=/tmp/zookeeper
# zookeeper 리슨 포트 설정
clientPort=2181
2.1.3. Kafka 설정
# Kafka 리스너 설정
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://localhost:9092
# Kafka 로그 디렉터리 설정
log.dirs=/tmp/kafka-logs
# zookeeper 리스너 주소 입력
zookeeper.connect=localhost:2181
2.1.5. 토픽 설정
ZooKeeper의 IP, Port 및 테넌트ID를 변경하여 bin/kafka-topics.sh를 아래와 같이 실행한다. Kafka를 1대만 사용하므로 replication-factor 는 1로 설정한다.
bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic errorLog_${TENANT_ID} --replication-factor 1 --partitions 5
bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic imageLog_${TENANT_ID} --replication-factor 1--partitions 40
bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic stctsLog_${TENANT_ID} --replication-factor 1 --partitions 5
bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic txHistoryLog_${TENANT_ID} --replication-factor 1 --partitions 20
bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic instanceMonitoringLog_${TENANT_ID} --replication-factor 1 --partitions 10
2.2. Kafka 서버가 3대 이상인 경우
각각의 서버에 모두 Kafka를 설치해 하단 설정을 모두 진행해야 한다. |
2.2.1. ZooKeeper 설정
# zookeeper 데이터 경로 설정
dataDir=/tmp/zookeeper
# zookeeper 리슨 포트 설정
clientPort=2181
initLimit=5
syncLimit=2
# Zookeeper 2888은 동기화를 위한 포트, 3888은 클러스터 구성 시, leader를 선출하기 위한 포트
server.1=서버1의IP:2888:3888
server.2=서버2의IP:2888:3888
server.3=서버3의IP:2888:3888
2.2.3. Kafka 설정
# Kafka 서버의 고유 ID. 반드시 Kafka 서버마다 달라야 한다.
broker.id=1
# Kafka 리스너 설정
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://localhost:9092
# Kafka 로그 디렉터리 설정
log.dirs=/tmp/kafka-logs
# zookeeper 리스너 주소 입력
zookeeper.connect=서버1의IP:2181,서버2의IP:2181,서버3의IP:2181
2.2.4. Kafka 실행
Kafka는 각 서버에서 모두 실행하고, 토픽 생성 스크립트는 하나의 서버에서만 실행하면 된다.
bin/kafka-server-start.sh config/server.properties
2.2.5. 토픽 설정
ZooKeeper의 IP, Port 및 테넌트ID를 변경하여 bin/kafka-topics.sh를 아래와 같이 실행한다. Kafka를 3대 이상 기동하므로 replication-factor는 2 또는 3을 설정한다.
bin/kafka-topics.sh --create --zookeeper 서버1의IP:2181,서버2의IP:2181,서버3의IP:2181 --topic errorLog_${TENANT_ID} --replication-factor 3 --partitions 5
bin/kafka-topics.sh --create --zookeeper 서버1의IP:2181,서버2의IP:2181,서버3의IP:2181 --topic imageLog_${TENANT_ID} --replication-factor 3--partitions 40
bin/kafka-topics.sh --create --zookeeper 서버1의IP:2181,서버2의IP:2181,서버3의IP:2181 --topic stctsLog_${TENANT_ID} --replication-factor 3 --partitions 5
bin/kafka-topics.sh --create --zookeeper 서버1의IP:2181,서버2의IP:2181,서버3의IP:2181 --topic txHistoryLog_${TENANT_ID} --replication-factor 3 --partitions 20
bin/kafka-topics.sh --create --zookeeper 서버1의IP:2181,서버2의IP:2181,서버3의IP:2181 --topic instanceMonitoringLog_${TENANT_ID} --replication-factor 3 --partitions 10