먼저 카프카의 탄생 배경에 대해 알아보자.
현재 카프카는 링크드인(LinkedIn)에서 개발되고 오픈소스로 풀려있고 빅데이터 시장에서 spark와 같이 없어서는 안될 중요한 오픈소스이다. 카프카는 스타트업에서도 보다 빠른 app개발을 위해 사용되고, 대기업과 같은 아키텍처가 큰 서비스에서도 주요하게 자리잡고 있다. 카프카는 링크드인에서 만들어졌으며, 링크드인에서는 파편화된 데이터 수집 및 분배 아키텍처를 운영하는데 여러 오픈소스들을 조합해서 사용했기 때문에 구현에 어려움이 존재했다.
데이터를 생성하고 적재하기 위해서는 데이터를 생성하는 소스 app과 데이터가 최종 적재되는 타킷 app을 연결해야한다. 아키텍처가 작을 경우에는 문제가 되지 않는데, 서비스가 커짐에 따라 아키텍처가 커지면 소스app과 타킷 app의 개수가 점점 많아지면 문제가 생기기 마련이다. 이 소스 app과 타킷 app의 수평적 확장을 보다 쉽게 하기 위해 나온게 kafka이다.
이제 클러스터 구성을 해보자.
일단 각 클러스터에 주키퍼와 카프카 다운받고 시작하기.
Inbound rule에서 2181, 9092 포트 열어주기 ( 주키퍼와 카프카 포트임)
둘 다 다운받고 다운받은 tar.gz는 자원낭비이므로 지워주자.
주키퍼는 카프카 뿐만 아니라 하둡, 스파크, hbase 등 다양한 분산 시스템을 위한 구성, 자원과 상태 등을 동기화시켜주는 역할을 한다. 다른 고급 언어로 고가용성(HA)을 위한 분산 코디네이터라고도 부른다.
잡담은 그만하고 주키퍼에 카프카 구성을 작성해야한다.
이 포스팅에서는 AWS인스턴스 2대로 구성을 해보겠다.
일단 환경구성부터 시작하자.
이 작업은 리눅스 네트워킹에서 DNS를 지정하는 작업이다.
/etc/hosts에 존재한다. 자기 자신의 ip는 0.0.0.0으로 설정하고, 다른 노드의 ip주소는 ipv4를 기입한다.
꼭 할 필요는 없는데, 매번 ipv4 주소 적기 귀찮으면 해야한다.
당연하게도 windows에도 있으니 궁금하면 찾아보자.
이제 주키퍼 앙상블을 구성해야한다.
각 인스턴스의 주키퍼의 설정을 해주어야한다. 주키퍼 압축 푼 폴더/conf/zoo.cfg 생성 후 작업.
kafka01과 kafka02에 붙은 포트(?) 같은 것 들이 이해가 가지 않을 것이다.
2888과 3888은 주키퍼 서비스 내의 p2p연결을 위해 2888 포트 번호를 사용한다는 의미이다.
각 노드들의 통신을 가능하기 위한 필수 설정이다. 주키퍼는 leader, followr로 구성되어 있는데, follower들을 leader에 연결해야하기 때문에 이 설정을 사용한다.
3888포트는 leader의 선출에 사용되는 포트번호이다. 이걸 2888로 쓰면 서로 충돌나기 때문에 다른 포트를 사용한다.
aws에서 각 인스턴스의 inbound rule을 수정해주어야한다.
9092 : kafka
2181 : zookeeper
3888,2888 : 앙상블 구현
각 인스턴스의 주키퍼를 실행해주자.
이제 카프카를 설정해보자.
server.properties를 설정해야한다.
advertised.listerens : 광고서버. 자신의 서버를 producer, consumer에게 알림. >> 자신의 borker서버를 적어준다.
아까 만든 kafka01의 경우 kafka01:9092 이렇게 적어주면 된다. 이 설정을 하지 않는 경우, default설정인 listeners의 주소로 설정된다.
zookeeper.connect에 모든 클러스터의 broker서버를 적어준다. 말 그대로 주키퍼 앙상블을 이루기 위해 사용하는 옵션.
토픽 생성
./bin/kafka-topics.sh --create --zookeeper test-broker01:2181,test-broker02:2181 --replication-factor 2 --partitions 1 --topic test
옵션에 보면 주키퍼에 각 인스턴스의 서버들이 적혀있다.
각 브로커에서 토픽의 파티션은 1로 나누지 않고 설정하고, 복제 계수는 2로 설정한다.
producer, consumer 통신
끝!
참고 블로그
https://penguin5309.tistory.com/107
서적 : 아파치 카프카 애플리케이션 프로그래밍