데이터 중심 파이프라인 : 커넥트를 이용해 카프카로 데이터를 보내거나, 카프카로부터 데이터를 가져온다.
유연성과 확장성 : 커넥트는 테스트 및 일회성 작업을 위한 단독 모드로 실행할 수 있고, 대규모 운영 환경을 위한 분산 모드(클러스터형)으로 실행할 수 있다.
재사용성과 기능 확장 : 커넥트는 이미 만들어진 기존 커넥터들을 활용할 수도 있고 운영 환경에서의 요구사항에 맞춰 빠르게 확장 가능, 커넥트의 이러한 손쉬운 확장 기능을 통해 운영 오버헤드를 낮출 수 있다.
장애 및 복구 : 카프카 커넥트를 분산 모드로 실행하면 워커 노드의 장애 상황에도 유연하게 대응 가능하므로 고가용성이 보장
카프카 커넥트의 핵심 개념
카프카 클러스터의 양쪽 옆에 카프카카 커넥트를 배치할 수 있다.
카프카를 기준으로 들어오고 나가는 양방향에 커넥트가 존재하는데, 소스 방향에 있는 커넥트를 소스 커넥트, 싱크 방향에 있는 커넥터를 싱크 커넥트라고 한다.
소스와 카프카 사이에 위치해서 프로듀서 역할을 하는 것이 소스 커넥트, 카프카와 싱크 사이에 위치해서 컨슈머 역할하는 것이 싱크 커넥트
워컨커는 카프카 커넥트 프로세스가 실행되는 서버 또는 인스턴스를 의미
커넥터나 태스크들이 워커에서 실행된다.
분산 모드는 특정 워커에 장애가 발생하더라도 해당 워커에서 동작 중인 커넥터나 태스크들이 다른 워커로 이동해 연속해서 동작할 수 있다.
커넥터 : 직접 데이터를 복사하지 않고, 데이터를 어디에서 어디로 복사해야 하는지의 작업을 정의하고 관리하는 역할
RDBMS의 데이터를 카프카로 전송하고 싶다면 JDBC 소스 커넥터가 필요하고, 카프카에 적재된 데이터를 HDFS로 적재하고 싶다면 HDFS 싱크 커넥터가 필요
태스크 : 커넥터가 정의한 작업을 직접 수행하는 역할
커넥터는 데이터 전송에 관한 작업을 정의한 후 각 태스크들을 워커에 분산하고, 분산된 태스크들은 커넥터가 정의한 작업대로 데이터를 복사하게 된다.
카프카 커넥트의 내부 동작
분산 배치된 각 태스크들은 메시지들을 소스에서 카프카로, 혹은 카프카에서 싱크로 이동시킨다.
커넥트는 파티셔닝 개념을 적용해 데이터들을 하위 집합으로 나누는데, 카프카에서 병렬 처리를 위해 토픽을 파티션으로 나누는 동작과 동일하다.
커넥터에서 복사해야 하는 데이터들은 레코드의 순서에 맞추어 파티셔닝되어야 한다. 위 그림에서 스트림 영역으로 표시된 부분이 바로 데이터가 파티셔닝된 것
커넥터에 정의된 값을 살펴보면 최대 태스크 수는 2로 정의되어있고, 스트림에서 나뉜 각 파티션들은 2개의 태스크에 할당되고, 태스크들은 실제로 데이터를 이동하는 동작을 처리
각 파티션들에는 오프셋도 함께 포함되어 있어서, 커넥트의 장애나 실패가 발생할 경우 지정된 위치부터 데이터 이동이 가능하며, 커넥터에 따라 오프셋 기준이 달라질 수 있는데, 일반적인 파일을 전송하는 커넥터일 경우 오프셋이 파일의 위치를, DB의 경우 타임스탬프나 시퀀스ID를 사용
단독 모드 카프카 커넥트
peter-ansible 서버 접속
✘ user ~/Desktop/kafka-aws ssh -i keypair.pem ec2-user@3.34.141.246
카프카 클러스터 구성 명령어 수행 절차
[ec2-user@ip-172-31-2-254 ~]$ cd kafka2
[ec2-user@ip-172-31-2-254 kafka2]$ cd chapter2/ansible_playbook
[ec2-user@ip-172-31-2-254 ansible_playbook]$ ansible-playbook -i hosts kafka1.yml
PLAY [kafkahosts] **
TASK [Gathering Facts] *****
[WARNING]: Platform linux on host peter-kafka03.foo.bar is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [peter-kafka03.foo.bar]
[WARNING]: Platform linux on host peter-kafka02.foo.bar is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [peter-kafka02.foo.bar]
[WARNING]: Platform linux on host peter-kafka01.foo.bar is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [peter-kafka01.foo.bar]
TASK [common : Set timezone to Asia/Seoul] *****
ok: [peter-kafka03.foo.bar]
ok: [peter-kafka01.foo.bar]
ok: [peter-kafka02.foo.bar]
<img width="1123" alt="image" src="https://github.com/kmg28801/kafka-study/assets/53685313/b8c093d3-d7c7-40f1-9847-f88bc5fde0ca">
- 파일 소스 커넥터와 싱크 커넥터를 실행해 단독 모드 파일 커넥터 구성도
- 카프카 커넥트 시나리오
1. 로컬 디렉토리에 `test.txt` 파일 생성 후 `파일 소스 커넥터를 실행`하여, 로컬의 `test.txt` 파일 내용을 읽은 다음 카프카의 `connect-test` 토픽으로 메시지 전송
2. 파일 싱크 커넥터는 `connect-test` 토픽에서 메시지를 읽은 후 해당 내용을 로컬의 `test.sink.txt` 파일로 저장
- 이 모든 과정은 교재에서 ansible에서 진행되었지만, 카프카 서버에서 해야됨
```cmd
[ec2-user@ip-172-31-2-254 ansible_playbook]$ echo "hello-1" > test.txt
[ec2-user@ip-172-31-2-254 ansible_playbook]$ echo "hello-2" >> test.txt
[ec2-user@ip-172-31-2-254 ansible_playbook]$ echo "hello-3" >> test.txt
[ec2-user@ip-172-31-2-254 ansible_playbook]$ cat test.txt
hello-1
hello-2
hello-3
소스 파일 커넥터에서 test.txt 파일 인지하도록 /usr/local/kafka/config/connect-file-source.properties 파일 편집
name=local-file-source # 커넥터에서 식별하는 이름 지정
connector.class=FileStreamSource # 커넥터에서 사용하는 클래스 지정
tasks.max=1 # 실제 작업을 처리하는 태스크의 최대 수 지정
file=/home/ec2-user/test.txt # 파일 소스 커넥터가 읽을 파일 지정
topic=connect-test # 파일 소스 커넥터가 읽은 내용을 전송할 카프카 토픽 지정
bootstrap.servers=localhost:9092 # 브로커 주소 지정
key.converter=org.apache.kafka.connect.json.JsonConverter # 카프카로 데이터를 보내거나 가져올 때 사용할 포맷 지정, 이때 키와 밸류는 각각 지정
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=false # 스키마가 포함된 구조 사용 여부 지정
value.converter.schemas.enable=false
offset.storage.file.filename=/tmp/connect.offsets # 재처리 등을 목적으로 오프셋 파일 저장할 경로 지정
offset.flush.interval.ms=10000 # 오프셋 플러시 주기 설정 (ms)
참고 : 카프카 커넥트의 컨버터는 소스에서 카프카로 전송할 때의 직렬화와 카프카에서 싱크로 전송할 때의 역직렬화를 담당
싱크 커넥터의 경우 데이터는 역순으로 처리되며, 카프카의 메시지 형태는 키와 밸류 형태로 이뤄지므로, 컨버터도 키 컨버터와 밸류 컨버터로 나뉨
커넥트에서는 이러한 컨버터를 통해 카프카 데이터를 전송하며, 카프카 내부에서는 데이터 포맷을 표준화된 상태로 처리할 수 있으므로 불필요하게 컨버팅하는 코드를 작성할 필요가 없다.
단독 모드 커넥트 실행 [ec2-user@ip-172-31-4-136 bin]$ sudo /usr/local/kafka/bin/connect-standalone.sh -daemon /usr/local/kafka/config/connect-standalone.properties /usr/local/kafka/config/connect-file-source.properties
추가 옵션
단독 모드 커넥트 설정 파일 /usr/local/kafka/config/connect-standalone.properties
파일 소스 커넥터 설정 파일 /usr/local/kafka/config/connect-file-source.properties
카프카 커넥트가 잘 실행되었는지 확인을 위한 REST API 명령어
[ec2-user@ip-172-31-4-136 bin]$ curl http://localhost:8083/connectors/local-file-source | python -m json.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 229 100 229 0 0 1243 0 --:--:-- --:--:-- --:--:-- 1237
{
"config": {
"connector.class": "FileStreamSource",
"file": "test.txt",
"name": "local-file-source",
"tasks.max": "1",
"topic": "connect-test"
},
"name": "local-file-source",
"tasks": [
{
"connector": "local-file-source",
"task": 0
}
],
"type": "source"
}
파일 싱크 커넥터 실행 명령어 curl --header "Content-Type: application/json" --header "Accept: application/json" --request PUT --data '{"name": "local-file-sink", "connector.class": "FileStreamSink", "tasks.max": "1", "file": "/home/ec2-user/test.sink.txt", "topics": "connect-test"}' http://localhost:8083/connectors/local-file-sink/config
test.txt에 메시지들을 저장한 다음, 파일 소스 커넥터가 이 텍스트 파일을 읽어 카프카의 connect-test 토픽으로 전송하고, 카프카에 저장된 메시지들을 파일 싱크 커넥터가 읽은 뒤 test.sink.txt 파일로 저장한다.
토픽도 잘 생성된 것 확인
[ec2-user@ip-172-31-4-136 ~]$ /usr/local/kafka/bin/kafka-topics.sh --bootstrap-server=localhost:9092 --list
__consumer_offsets
connect-test
[ec2-user@ip-172-31-4-136 ~]$ sudo pkill -f connect
[ec2-user@ip-172-31-4-136 ~]$ curl http://localhost:8083/connectors/local-file-source | python -m json.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (7) Failed to connect to localhost port 8083 after 3 ms: Couldn't connect to server
No JSON object could be decoded
## 분산 모드 카프카 커넥트
- 운영 환경에서는 단독 모드보다는 분산 모드로 사용하는 것이 안정적인 운영에 도움을 준다.
- 단독 모드와 분산 모드의 가장 중요한 차이점은 메타 정보의 저장소 위치
- 분산 모드는 메타 정보의 저장소로 `카프카 내부 토픽` 이용
- 카프카 내부 토픽을 이용하는 바업ㅂ은 컨슈머 그룹들의 오프셋 정보를 `__consumer_offsets` 토픽에 저장하는 방법과 유사
- 카프카 내부 토픽에 저장하게 되면 워커 장애 시에도 유연하게 대응 가능하다.
- 하나의 워커에 장애가 발생하더라도 남아 있는 모든 워커가 카프카의 내부 토픽으로부터 메타 정보를 얻어갈 수 있다.
- 카프카 커넥트에서 사용하는 토픽들은 커넥트 운영에서 중요한 정보가 저장되므로, 리플리케이션 팩터 수는 반드시 3으로 설정
- 카프카 커넥트는 안전한 메타 저장소를 바탕으로 확장성, 장애 허용, 자동 리밸런싱 등 운영에 필요한 필수 기능을 제공
<img width="999" alt="image" src="https://github.com/kmg28801/kafka-study/assets/53685313/dc2a3b1f-be2d-4695-9b63-d191082566db">
- 기존에는 워커3까지 있었는데, 워커4가 추가되었다면, 카프카 커넥트에서는 내부적으로 자동 리밸런싱 동작에 의해 워커2에 있던 커넥터B가 워커4로 이동한다.
- 자동 리밸런싱은 워커들 안에서 태스크와 커넥터가 최대한 균등하게 배치될 수 있게 한다.
<img width="938" alt="image" src="https://github.com/kmg28801/kafka-study/assets/53685313/da20f03b-4b4c-48e8-9cb7-e74900a77212">
- 워커 3이 장애가 발생해 종료하면서, 워커3ㅇ에서 동작 중이던 태스크B1은 워커2로 이동해서 다시 본래의 작업을 처리
- 자동 리밸런싱, 장애 허용 동작을 통한 안정성 확보와 용이한 스케일 아웃을 위해 운영 환경의 카프카 커넥트는 반드시 분산 모드로 구성해야 한다.
- 분산 모드 설정 파일 옵션 확인 명령어
```cmd
[ec2-user@ip-172-31-4-136 ~]$ sudo cat /usr/local/kafka/config/connect-distributed.properties
bootstrap.servers=peter-kafka01.foo.bar:9092,peter-kafka02.foo.bar:9092,peter-kafka03.foo.bar:9092
group.id=peter-connect-cluster # 분산 모드 그룹 아이디를 지정, 컨슈머 그룹의 그룹 아이디와 동일한 개념
key.converter=org.apache.kafka.connect.converters.ByteArrayConverter
value.converter=org.apache.kafka.connect.converters.ByteArrayConverter
key.converter.schemas.enable=false
value.converter.schemas.enable=false
offset.storage.topic=connect-offsets # 커넥터들의 오프셋 추적을 위해 저장하는 카프카 내부 토픽명 지정
offset.storage.replication.factor=3 # 커넥터들의 오프셋 추적을 위해 저장하는 카프카 내부 토픽 리플리케이션 팩터 지정
offset.storage.partitions=25 # 커넥터들의 오프셋 추적을 위해 저장하는 카프카 내부 토픽 파티션 수 지정
config.storage.topic=connect-configs # 커넥터들의 설정을 저장하는 카프카 내부 토픽명 지정
config.storage.replication.factor=3 # 커넥터들의 설정을 저장하는 카프카 내부 토픽 리플리케이션 팩터 지정
config.storage.partitions=1 # 커넥터들의 설정을 저장하는 카프카 내부 토픽 파티션 수 지정
status.storage.topic=connect-status # 커넥터들의 상태를 저장하는 카프카 내부 토픽명 지정
status.storage.replication.factor=3 # 커넥터들의 상태를 저장하는 카프카 내부 토픽 리플리케이션 팩터 지정
status.storage.partitions=5 # 커넥터들의 상태를 저장하는 카프카 내부 토픽 파티션 수 지정
분산 모드 커넥트 설정 파일 점검이 완료되면 모든 브로커 서버에서 connect-distributed.sh 파일 실행
추가 옵션으로 분산 모드 커넥트 설정 파일connect-distributed.properties를 로드하도록 명시
[ec2-user@ip-172-31-4-136 ~]$ sudo systemctl start kafka-connect
[ec2-user@ip-172-31-4-136 ~]$ sudo systemctl status kafka-connect
● kafka-connect.service - kafka-connect
Loaded: loaded (/etc/systemd/system/kafka-connect.service; disabled; vendor preset: disabled)
Active: active (running) since 토 2023-09-09 10:05:15 KST; 8s ago
Main PID: 32205 (java)
CGroup: /system.slice/kafka-connect.service
└─32205 java -Xms256M -Xmx2G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -XX:MaxInlineLevel=15 -Djava.awt.headless=true -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dkafka.logs.dir=/usr/local/kafka/bi...
9월 09 10:05:21 ip-172-31-4-136.ap-northeast-2.compute.internal kafka-connect[32205]: WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.r...
9월 09 10:05:22 ip-172-31-4-136.ap-northeast-2.compute.internal kafka-connect[32205]: Sep 09, 2023 10:05:22 AM org.glassfish.jersey.internal.Errors logErrors
9월 09 10:05:22 ip-172-31-4-136.ap-northeast-2.compute.internal kafka-connect[32205]: WARNING: The following warnings have been detected: WARNING: The (sub)resource method listLoggers in org.apache.kafka.connect.runtime.rest.resources.LoggingResource contains empty path annotation.
9월 09 10:05:22 ip-172-31-4-136.ap-northeast-2.compute.internal kafka-connect[32205]: WARNING: The (sub)resource method createConnector in org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource contains empty path annotation.
9월 09 10:05:22 ip-172-31-4-136.ap-northeast-2.compute.internal kafka-connect[32205]: WARNING: The (sub)resource method listConnectors in org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource contains empty path annotation.
9월 09 10:05:22 ip-172-31-4-136.ap-northeast-2.compute.internal kafka-connect[32205]: WARNING: The (sub)resource method listConnectorPlugins in org.apache.kafka.connect.runtime.rest.resources.ConnectorPluginsResource contains empty path annotation.
9월 09 10:05:22 ip-172-31-4-136.ap-northeast-2.compute.internal kafka-connect[32205]: WARNING: The (sub)resource method serverInfo in org.apache.kafka.connect.runtime.rest.resources.RootResource contains empty path annotation.
9월 09 10:05:22 ip-172-31-4-136.ap-northeast-2.compute.internal kafka-connect[32205]: [2023-09-09 10:05:22,193] INFO Started o.e.j.s.ServletContextHandler@329a1243{/,null,AVAILABLE} (org.eclipse.jetty.server.handler.ContextHandler:825)
9월 09 10:05:22 ip-172-31-4-136.ap-northeast-2.compute.internal kafka-connect[32205]: [2023-09-09 10:05:22,193] INFO REST resources initialized; server is started and ready to handle requests (org.apache.kafka.connect.runtime.rest.RestServer:319)
9월 09 10:05:22 ip-172-31-4-136.ap-northeast-2.compute.internal kafka-connect[32205]: [2023-09-09 10:05:22,193] INFO Kafka Connect started (org.apache.kafka.connect.runtime.Connect:57)
Hint: Some lines were ellipsized, use -l to show in full.
미러메이커는 운영 환경에서 카프카와 카프카를 미러링하기 위해 자주 사용되는 별도의 애플리케이션으로, 미러 메이커 2.0이 릴리스되면서 카프카 커넥트에서 분산 모드로 실행할 수 있게 되었따.
커넥터 기반의 미러 메이커 2.0
기업에서 다중 클러스터를 활용하는 예시
장애 복구 차원에서 다중 데이터 센터를 운영하는 경우 각 데이터 센터에 카프카 클러스터를 배치하고 카프카와 카프카 간에 리플리케이션(미러링)을 구성
온프레미스에서의 데이터를 클라우드로 마이그레이션하려는 경우 온프레미스에 카프카를 하나 두고, 클라우드에 또 다른 카프카를 두어서 온프레미스에서 클라우드로 리플리케이션
데이터 분석을 위한 용도로 카프카와 카프카 간의 리플리케이션
참고 : 업스트림 카프카는 실시간 용도이고, 다운스트림 카프카는 배치를 위한 용도로 사용하는데, 업스트림 카프카에서 다운스트림 카프카로 리플리케이션 구성을 하여 데이터를 전송하기도 한다.
카프카와 카프카 간 리플리케이션을 하기 위한 도구 중 하나가 바로 미러 메이커이고, 아파치 카프카에서는 미러 메이커를 기본 도구로 제공
미러 메이커 2.0의 가장 큰 특징은 카프카 커넥트 프레임워크 기반으로 간단한 설정만으로도 손쉬운 확장이 가능하다는 점
미러 메이커 2.0에서 제공하는 기능과 특징
원격 토픽과 에일리어스 기능
미러 메이커 2.0은 소스 클러스터에서 타깃 클러스터로 타깃 토픽들을 리플리케이션한다.
리플리케이션은 단방향/양방향 모두 가능
양방향 토픽 리플리케이션을 지원하기 위해 기본적으로 액티브/액티브 리플리케이션 토픽 이름 정책이 적용
- 미러메이커 1.0에서는 미러링하는 대상의 토픽명이 소스 카프카와 타깃 카프카가 동일했다.
- 단방향의 미러링에서는 동일한 토픽명에서 비롯되는 문제가 없지만, 양방향 미러링의 경우 동일한 토픽명으로 인해 무한 루프 또는 순서가 뒤섞이는 경우 발생
- 미러 메이커 2.0은 위 그림처럼 에일리어스를 추가해 서로의 토픽명을 구분짓는다.
카프카 클러스터 통합
미러 메이커 2.0을 이용하면 다중 클러스터로부터 미러링된 토픽들을 다운스트림 컨슈머가 통합 가능
카프카 커넥트 주요 장점
카프카 커넥트의 핵심 개념
소스 커넥트
, 싱크 방향에 있는 커넥터를싱크 커넥트
라고 한다.프로듀서 역할
을 하는 것이소스 커넥트
, 카프카와 싱크 사이에 위치해서컨슈머 역할
하는 것이싱크 커넥트
워컨커는 카프카 커넥트 프로세스가 실행되는 서버 또는 인스턴스를 의미
커넥터나 태스크들이 워커에서 실행된다.
분산 모드는 특정 워커에 장애가 발생하더라도 해당 워커에서 동작 중인 커넥터나 태스크들이 다른 워커로 이동해 연속해서 동작할 수 있다.
커넥터 : 직접 데이터를 복사하지 않고, 데이터를 어디에서 어디로 복사해야 하는지의 작업을 정의하고 관리하는 역할
JDBC 소스 커넥터
가 필요하고, 카프카에 적재된 데이터를 HDFS로 적재하고 싶다면HDFS 싱크 커넥터
가 필요태스크 : 커넥터가 정의한 작업을 직접 수행하는 역할
커넥터는 데이터 전송에 관한 작업을 정의한 후 각 태스크들을 워커에 분산하고, 분산된 태스크들은 커넥터가 정의한 작업대로 데이터를 복사하게 된다.
카프카 커넥트의 내부 동작
단독 모드 카프카 커넥트
✘ user ~/Desktop/kafka-aws ssh -i keypair.pem ec2-user@3.34.141.246
PLAY [kafkahosts] **
TASK [Gathering Facts] ***** [WARNING]: Platform linux on host peter-kafka03.foo.bar is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. ok: [peter-kafka03.foo.bar] [WARNING]: Platform linux on host peter-kafka02.foo.bar is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. ok: [peter-kafka02.foo.bar] [WARNING]: Platform linux on host peter-kafka01.foo.bar is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. ok: [peter-kafka01.foo.bar]
TASK [common : Set timezone to Asia/Seoul] ***** ok: [peter-kafka03.foo.bar] ok: [peter-kafka01.foo.bar] ok: [peter-kafka02.foo.bar]
TASK [common : install Java and tools] *****
changed: [peter-kafka02.foo.bar] changed: [peter-kafka03.foo.bar] changed: [peter-kafka01.foo.bar]
TASK [common : copy krb5 conf] ***** ok: [peter-kafka03.foo.bar] ok: [peter-kafka01.foo.bar] ok: [peter-kafka02.foo.bar]
TASK [stop kafka-server] *** ok: [peter-kafka01.foo.bar] ok: [peter-kafka03.foo.bar] ok: [peter-kafka02.foo.bar]
TASK [remove directory kafka] ** ok: [peter-kafka01.foo.bar] ok: [peter-kafka03.foo.bar] ok: [peter-kafka02.foo.bar]
TASK [make dir kafka] ** changed: [peter-kafka01.foo.bar] changed: [peter-kafka02.foo.bar] changed: [peter-kafka03.foo.bar]
TASK [download kafka from web] ***** ok: [peter-kafka03.foo.bar] ok: [peter-kafka01.foo.bar] ok: [peter-kafka02.foo.bar]
TASK [unarchive kafka] ***** changed: [peter-kafka02.foo.bar] changed: [peter-kafka03.foo.bar] changed: [peter-kafka01.foo.bar]
TASK [setup link kafka] **** ok: [peter-kafka01.foo.bar] ok: [peter-kafka03.foo.bar] ok: [peter-kafka02.foo.bar]
TASK [copy kafka server conf files] **** changed: [peter-kafka01.foo.bar] changed: [peter-kafka03.foo.bar] changed: [peter-kafka02.foo.bar]
TASK [copy kafka conf file] **** ok: [peter-kafka01.foo.bar] => (item=jmx) ok: [peter-kafka03.foo.bar] => (item=jmx) ok: [peter-kafka02.foo.bar] => (item=jmx) changed: [peter-kafka01.foo.bar] => (item=connect-distributed.properties) changed: [peter-kafka03.foo.bar] => (item=connect-distributed.properties) changed: [peter-kafka02.foo.bar] => (item=connect-distributed.properties)
TASK [copy kafka server in systemd] **** ok: [peter-kafka01.foo.bar] => (item=kafka-server.service) ok: [peter-kafka02.foo.bar] => (item=kafka-server.service) ok: [peter-kafka03.foo.bar] => (item=kafka-server.service) ok: [peter-kafka01.foo.bar] => (item=kafka-connect.service) ok: [peter-kafka02.foo.bar] => (item=kafka-connect.service) ok: [peter-kafka03.foo.bar] => (item=kafka-connect.service)
TASK [kafka : just force systemd to reload configs] **** ok: [peter-kafka01.foo.bar] ok: [peter-kafka03.foo.bar] ok: [peter-kafka02.foo.bar]
TASK [kafka : make sure a service is running] ** changed: [peter-kafka01.foo.bar] changed: [peter-kafka03.foo.bar] changed: [peter-kafka02.foo.bar]
PLAY RECAP ***** peter-kafka01.foo.bar : ok=15 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 peter-kafka02.foo.bar : ok=15 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 peter-kafka03.foo.bar : ok=15 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
test.txt
파일 인지하도록/usr/local/kafka/config/connect-file-source.properties
파일 편집[ec2-user@ip-172-31-4-136 bin]$ sudo /usr/local/kafka/bin/connect-standalone.sh -daemon /usr/local/kafka/config/connect-standalone.properties /usr/local/kafka/config/connect-file-source.properties
/usr/local/kafka/config/connect-standalone.properties
/usr/local/kafka/config/connect-file-source.properties
curl --header "Content-Type: application/json" --header "Accept: application/json" --request PUT --data '{"name": "local-file-sink", "connector.class": "FileStreamSink", "tasks.max": "1", "file": "/home/ec2-user/test.sink.txt", "topics": "connect-test"}' http://localhost:8083/connectors/local-file-sink/config
test.txt
에 메시지들을 저장한 다음, 파일 소스 커넥터가 이 텍스트 파일을 읽어 카프카의connect-test
토픽으로 전송하고, 카프카에 저장된 메시지들을 파일 싱크 커넥터가 읽은 뒤test.sink.txt
파일로 저장한다.토픽도 잘 생성된 것 확인
connect-distributed.sh
파일 실행connect-distributed.properties
를 로드하도록 명시커넥터 기반의 미러 메이커 2.0
카프카와 카프카 간 리플리케이션을 하기 위한 도구 중 하나가 바로 미러 메이커이고, 아파치 카프카에서는 미러 메이커를 기본 도구로 제공
미러 메이커 2.0의 가장 큰 특징은 카프카 커넥트 프레임워크 기반으로 간단한 설정만으로도 손쉬운 확장이 가능하다는 점
미러 메이커 2.0에서 제공하는 기능과 특징
us-west
의 카프카에서 미러링된us-west.topic1
과us-east
카프카에서 미러링된us-east.topic1
을 다운스트림 컨슈머가 통합해 컨슘 가능미러 메이커 2.0 실행 방법
앤서블 서버에서 카프카 클러스터 생성하기