카프카 클러스터를 EC2 인스턴스에 구축해봤다.
Confluent에서 제공하는 ansible playbook을 사용하면 정말 쉽게 구축이 가능하다.
https://github.com/confluentinc/cp-ansible
GitHub - confluentinc/cp-ansible: Ansible playbooks for the Confluent Platform
Ansible playbooks for the Confluent Platform. Contribute to confluentinc/cp-ansible development by creating an account on GitHub.
github.com
해당 playbook을 통해 아래 component들 모두 구축이 가능하다
Confluent Platform을 사용하지 않고도 오픈소스로 제공하는 카프카 컴포넌트들을 쉽게 다운로드 할 수 있으니 굉장히 편리하다.
아래와 같은 인스턴스 구성으로 설치해봤다.
나중에도 쉽게 구성할 수 있도록 명령어 위주로 기록해두려고 한다.
cp-ansible을 실행시킬 노드 1대에서만 작업해주면 된다.
$ sudo yum install ansible
# EC2인스턴스 host 정보 넣어주기
$ vi host.yml
# pem 파일 복사
$ vi /home/ec2-user/.ssh/ec2.pem
$ chmod 400 ~/.ssh/ec2.pem
# ping 날려보기
$ ansible all -m ping -i hostt.yml --user ec2-user --key-file /home/ec2-user/.ssh/ec2.pem
cp-ansible 코드를 가져와서 설정파일을 수정해주면 된다.
hosts_example.yml 파일에 각 환경변수에 대한 설정이 잘 나와있고, docs/VARIABLES.md 파일에도 각 설정 값에 대한 문서화가 잘 나와있다.
$ ansible-galaxy collection install git+https://github.com/confluentinc/cp-ansible.git,7.7.0-post
$ cd .ansible/collections/ansible_collections/confluent/platform/
# 샘플 파일 복사 & 설정에 맞게 수정하기
$ cp docs/hosts_example.yml ./
$ mv hosts_example.yml hosts.yml
reference
내가 추가로 설정해준 값들은 KAFKA_HEAP_OPTS 값들을 변경해줬다.
테스트를 위해 구축한 EC2 인스턴스(t2.micro) 라서 메모리가 1G 밖에 되지 않아 default 설정 값으로는 인스턴스가 시작되지 않는다.
아래와 같이 각 컴포넌트들의 KAFKA_HEAP_OPTS 값을 수정하여 메모리를 줄여줬다.
all:
vars:
ansible_connection: ssh
ansible_user: ec2-user
ansible_become: true
ansible_ssh_private_key_file: /home/ec2-user/.ssh/ec2.pem
rbac_enabled: false
confluent_server_enabled: false
# To configure different security settings on the internal and external listeners set the following variables:
zookeeper_service_environment_overrides:
KAFKA_HEAP_OPTS: "-Xmx512M -Xms512M"
kafka_broker_service_environment_overrides:
KAFKA_HEAP_OPTS: "-Xmx256M -Xms256M -XX:MetaspaceSize=96m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80"
kafka_connect_service_environment_overrides:
KAFKA_HEAP_OPTS: "-Xms256M -Xmx256M"
schema_registry_service_environment_overrides:
SCHEMA_REGISTRY_HEAP_OPTS: "-Xms512M -Xmx512M -XX:MetaspaceSize=96m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80"
...
이제 ansible playbook을 실행하면 설정한 값에 따라 컴포넌트들이 바로 설치되고 구축된다.
(진짜 편하다...)
전체를 설치해볼수도있고 컴포넌트별로 하나씩 설치도 가능하다.
# 전체 설치
$ ansible-playbook -i hosts.yml playbooks/all.yml
# 주키퍼만 설치
$ ansible-playbook -i hosts.yml playbooks/all.yml --tags=zookeeper
# 카프카만 설치
$ ansible-playbook -i hosts.yml playbooks/all.yml --tags=kafka_broker
# 카프카 커넥트 설치
$ ansible-playbook -i hosts.yml playbooks/all.yml --tags=kafka_connect
# 스키마 레지스트리 설치
$ ansible-playbook -i hosts.yml playbooks/all.yml --tags=schema_registry
전체 설치 playbook도 10분 이내로 소요된다.
이렇게 구축한 Kafka cluster로 이것저것 스터디도해보고 테스트도 가능하다.
카프카 클러스터를 구축하는 것 역시 금방할 수 있다.
이제는 인프라를 구축하고 설치하는 것은 큰 어려움이나 기술적인 역량이 필요한 부분은 아니라고 생각한다.
심지어 MSK를 사용한다면 클러스터 운영적인 부분까지 위임도 가능하다.
그래도 가끔은 클러스터를 직접 구축하고 약간의 옵션을 설정할 수 있는 것은 다른 개발, 컴포넌트를 확장하는 과정에서 조금은 더 유연함을 주는 것 같기도하다.
우선 Kafka Cluster가 안정적으로 구축된다면 다양한 데이터들을 Kafka Topic에 넣고 전처리하여 S3에 저장을 하거나 실시간 Serving layer도 구축이 가능하다.
실시간 아키텍처에 대한 요구사항이 당장은 필요하지 않더라도 확장성이 높은 아키텍처를 위해 Kafka는 좋은 선택이 된다고 생각한다.
Iceberg 란 무엇인가? (3) | 2024.12.15 |
---|---|
Kafka Connect Plugin 설치하기 (1) | 2024.09.19 |
Kafka Connect 공부하기 (1) (0) | 2024.09.18 |
Data Warehouse, Data Lake, Data Lakehouse (1) | 2024.08.16 |