Related POST 사실 도커로 설치했기때문에 그냥 눈으로만 학습
카프카는 1GB heap이 디폴트. aws 프리티어로는 부족하므로 힙을 400으로 줄이는 부분.
config 바꾸는 방법은 docker-compose에서 ENV로 주어져서 바꿔짐
카프카(2.5기준)는 zookeeper가 반드시 필수
zookeeper standalone 모드에서는 replication이 없음
EC2,Kafka 설정 Kafka 실행 최소 Heap size 설정 제거 1 $ export KAFKA_HEAP_OPTS="-Xmx400m -Xms400m"
Kafka 2.5.0은 1G의 Heap memory가 default
테스트용 ec2인 t2.micro에 실행하기 위해 heap size 환경변수 선언
Kafka 실행 최소 Heap size 설정 제거 1 2 3 4 export KAFKA_HEAP_OPTS=" -Xmx6g -Xms6g -XX:MetaspaceSize=96m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80 "
링크드인에서 테스트한 최적의 Java option 추천값
60대 브로커, 5만개 파티션, Replication-factor 2로 구성시
300MB/sec inbound, 1GB/sec outbound 보장
환산 : 1TB/hour inbound, 3TB/hour inbound
PRACTICE - config/server.properties
broker.id : 정수로 된 브로커 번호. 클러스터 내 고유번호로 지정
listeners : kafka 통신에 사용되는 host:port
advertised.listeners : Kafka client가 접속할 host:port
log.dirs : 메시지를 저장할 디스크 디렉토리. 세그먼트가 저장됨
log.segment.bytes : 메시지가 저장되는 파일의 크기 단위
log.retention.ms : 메시지를 얼마나 보존할지 지정. 닫힌 세그먼트를 처리 SK planet의 경우 3일로 지정
zookeeper.connect : 브로커의 메타데이터를 저장하는 주키퍼의 위치
auto.create.topics.enable : 자동으로 토픽이 생성여부 (Producer가 데이터 넣을 시)
num.partitions : 자동생성된 토픽의 default partition 개수
message.max.bytes : kafka broker에 쓰려는 메시지 최대 크기
Zookeeper 실행, Kafka 실행 Zookeeper 실행 1 $ bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
Kafka 실행 1 $ bin/kafka-server-start.sh -daemon config/server.properties
Kafka shell scripts
kafka-topics.sh
kafka-console-consumer.sh
kafka-console-producer.sh
kafka-consumer-groups.sh
위 4개를 포함하여 33개의 Kafka shell script가 제공됨
카프카 토픽 생성 aws 예제에서 카프카 토픽 생성 1 2 3 ./kafka-topics.sh --create --bootstrap-server {aws ec2 public ip}:9092 --replication-factor 1 --partitions 3 --topic test Created topic test .
도커 예제를 사용시엔 컨테이너에 들어가서 해야한다
카프카 컨테이너 직접 들어가기 1 docker exec -it kafka ash
docker예제에서는 docker-compose에 설정된 kafka 서버 ip를 넣는다 1 2 ./kafka-topics.sh --create --bootstrap-server 10.10.20.142:9092 --replication-factor 1 --partitions 3 --topic test
데이터 넣어보기 1 2 3 4 5 ./kafka-console-producer.sh --bootstrap-server 10.10.20.142:9092 --topic test >hello >kafka >hello >world
다른 터미널에서 polling해보자 1 2 3 4 5 ./kafka-console-consumer.sh --bootstrap-server 10.10.20.142:9092 --topic test --from-beginning hello kafka hello world
--from-beginning
: 첫 offset부터 가져오라는 뜻
Consumer Group 테스트 1 2 3 4 5 6 7 8 ./kafka-console-consumer.sh --bootstrap-server 10.10.20.142:9092 --topic test -group testgroup --from-beginning world hello world hello hello hello kafka kafka send?
producer가 보낸 것과 Consumer 그룹이 받은 것과 순서가 다른 이유?
파티션 3개에 데이터가 들어가 있는 상태에서 순서 없이 가져가므로
파티션 1개 사용하면 queue처럼 순서가 같게 된다.
Consumer 그룹 종료 -> Producer로 더 생산 –> 다시 위의 명령어 실행 하면?
해당 그룹이 어디까지 받았는지 기록이 되어 있기 때문에 그룹 종료 이후 생산되는 것부터 받아오게 된다
그룹 확인 1 2 3 4 5 6 7 8 9 10 11 ./kafka-consumer-groups.sh --bootstrap-server 10.10.20.142:9092 --list testgroup ./kafka-consumer-groups.sh --bootstrap-server 10.10.20.142:9092 --group testgroup --describe Consumer group 'testgroup' has no active members. GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID testgroup test 1 2 2 0 - - - testgroup test 0 6 6 0 - - - testgroup test 2 4 4 0 - - -
PARTITION : 0~2까지 파티션 3개를 확인 가능
CURRENT-OFFSET : 컨슈퍼 오프셋 (BY testgroup)
LOG-END-OFFSET : 현재 토픽의 마지막 오프셋
LAG : 컨슈머 랙
두 오프셋의 차이
컨슈머가 안가져가고 있는 양의 크기
크면 실시간으로 빨리 처리를 못하고 있다는 반증
offset reset 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ./kafka-consumer-groups.sh --bootstrap-server 10.10.20.142:9092 --group testgroup --topic test --reset-offsets --to-earliest --execute GROUP TOPIC PARTITION NEW-OFFSET testgroup test 0 0 testgroup test 1 0 testgroup test 2 0 ./kafka-consumer-groups.sh --bootstrap-server 10.10.20.142:9092 --group testgroup --describe Consumer group 'testgroup' has no active members. GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID testgroup test 1 0 2 2 - - - testgroup test 0 0 7 7 - - - testgroup test 2 0 5 5 - - - ./kafka-consumer-groups.sh --bootstrap-server 10.10.20.142:9092 --group testgroup --topic test :1 --reset-offsets --to-offset 10 --execute