Debezium文件翻譯02:啟動Docker,Debezium,Zookeeper,Kafka
使用Docker執行Debezium
執行Debezium涉及三個主要服務:Zookeeper、Kafka和Debezium的聯結器服務。
本教程將指導您使用Docker和Debezium的Docker映像啟動這些服務的單個例項。
另一方面,生產環境需要執行每個服務的多個例項,以保證效能、可靠性、複製和容錯。
這可以通過OpenShift和Kubernetes這樣的平臺來實現,該平臺可以管理執行在多個主機和機器上的多個Docker容器,但通常需要在專用硬體上安裝。
啟動Docker
確保Docker安裝並執行在Linux、OS X或Windows上。
我們強烈推薦在這些平臺上使用Docker的最新版本,我們在編寫這些說明時也考慮到了這一點。
(通過Docker machine在虛擬機器中執行Docker不再是首選方法,Docker建議您升級。)
為了進行簡單的評估和實驗,本教程將指導您在本地機器上的單獨容器中啟動每個服務的單個例項。
Zookeeper和Kafka都在容器內部本地儲存資料,正常使用需要將主機上的目錄作為卷掛載,這樣容器停止時,持久化資料就會保留下來。
在本教程中我們將跳過這一點,儘管Docker映象的文件描述瞭如何做到這一點。
這意味著當一個容器被移除時,所有的持久化資料都會丟失。
這對於我們的實驗來說是很理想的,因為當我們完成的時候,你的電腦上什麼都沒有留下,你可以多次執行這個實驗,而不需要清理中間的任何東西。
在本地執行多個服務可能會造成混淆,因此我們將使用一個單獨的終端來執行前臺中的每個容器。
這樣,容器的所有輸出都將顯示在用於執行它的終端中。
提示:
這不是執行Docker容器的唯一方法。
與在前臺(使用-it)執行容器不同,Docker允許您以分離模式(使用-d)執行容器,容器在其中啟動,Docker命令立即返回。
分離模式容器不會在終端中顯示它們的輸出,儘管您總是可以通過使用docker日誌命令
docker logs --follow --name <container-name>
來看到輸出內容。這是我們為執行的每個容器命名的原因之一。
有關更多細節,請參閱Docker文件。
啟動Zookeeper
在構成Debezium的所有不同服務/程序中,首先啟動的是Zookeepe。
通過以下命令來啟動一個新的終端和一個帶有Zookeeper的容器:
$ docker run -it --rm --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 debezium/zookeeper:0.8
這將使用debezium/zookeeper映像的0.8版本執行一個新的容器,並將zookeeper名稱分配給這個容器。
"-it"命令使容器具有互動性,這意味著它將終端的標準輸入和輸出附加到容器上,以便您可以看到容器中發生了什麼。
“–rm"命令可以使Docker在容器停止時移除容器。
這三個”-p"選項將容器的三個埠(例如,2181、2888和3888)對映到Docker主機上的相同埠,以便其他容器(以及容器外的軟體)可以與Zookeeper通訊。
你應該可以在你的終端看到zookeeper的典型輸出:
Starting up in standalone mode
ZooKeeper JMX enabled by default
Using config: /zookeeper/conf/zoo.cfg
2017-09-21 07:15:55,417 - INFO [main:[email protected]] - Reading configuration from: /zookeeper/conf/zoo.cfg
2017-09-21 07:15:55,419 - INFO [main:[email protected]] - autopurge.snapRetainCount set to 3
2017-09-21 07:15:55,419 - INFO [main:[email protected]] - autopurge.purgeInterval set to 1
2017-09-21 07:15:55,420 - WARN [main:[email protected]] - Either no config or no quorum defined in config, running in standalone mode
2017-09-21 07:15:55,420 - INFO [PurgeTask:[email protected]] - Purge task started.
2017-09-21 07:15:55,425 - INFO [PurgeTask:[email protected]] - Purge task completed.
2017-09-21 07:15:55,427 - INFO [main:[email protected]] - Reading configuration from: /zookeeper/conf/zoo.cfg
2017-09-21 07:15:55,427 - INFO [main:[email protected]] - Starting server
2017-09-21 07:15:55,432 - INFO [main:[email protected]] - Server environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
2017-09-21 07:15:55,432 - INFO [main:[email protected]] - Server environment:host.name=51b46dd211d0
2017-09-21 07:15:55,432 - INFO [main:[email protected]] - Server environment:java.version=1.8.0_131
2017-09-21 07:15:55,432 - INFO [main:[email protected]] - Server environment:java.vendor=Oracle Corporation
2017-09-21 07:15:55,432 - INFO [main:[email protected]] - Server environment:java.home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-3.b12.el7_3.x86_64/jre
2017-09-21 07:15:55,432 - INFO [main:[email protected]] - Server environment:java.class.path=/zookeeper/bin/../build/classes:/zookeeper/bin/../build/lib/*.jar:/zookeeper/bin/../lib/slf4j-log4j12-1.6.1.jar:/zookeeper/bin/../lib/slf4j-api-1.6.1.jar:/zookeeper/bin/../lib/netty-3.10.5.Final.jar:/zookeeper/bin/../lib/log4j-1.2.16.jar:/zookeeper/bin/../lib/jline-0.9.94.jar:/zookeeper/bin/../zookeeper-3.4.10.jar:/zookeeper/bin/../src/java/lib/*.jar:/zookeeper/conf:
2017-09-21 07:15:55,432 - INFO [main:[email protected]] - Server environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2017-09-21 07:15:55,432 - INFO [main:[email protected]] - Server environment:java.io.tmpdir=/tmp
2017-09-21 07:15:55,433 - INFO [main:[email protected]] - Server environment:java.compiler=<NA>
2017-09-21 07:15:55,433 - INFO [main:[email protected]] - Server environment:os.name=Linux
2017-09-21 07:15:55,433 - INFO [main:[email protected]] - Server environment:os.arch=amd64
2017-09-21 07:15:55,433 - INFO [main:[email protected]] - Server environment:os.version=4.4.0-93-generic
2017-09-21 07:15:55,433 - INFO [main:[email protected]] - Server environment:user.name=zookeeper
2017-09-21 07:15:55,433 - INFO [main:[email protected]] - Server environment:user.home=/zookeeper
2017-09-21 07:15:55,433 - INFO [main:[email protected]] - Server environment:user.dir=/zookeeper
2017-09-21 07:15:55,435 - INFO [main:[email protected]] - tickTime set to 2000
2017-09-21 07:15:55,435 - INFO [main:[email protected]] - minSessionTimeout set to -1
2017-09-21 07:15:55,435 - INFO [main:[email protected]] - maxSessionTimeout set to -1
2017-09-21 07:15:55,440 - INFO [main:[email protected]] - binding to port 0.0.0.0/0.0.0.0:2181
最後一行很重要,報告Zookeeper已經準備好,並監聽埠2181。終端將繼續顯示Zookeeper生成的其他輸出。
啟動Kafka
開啟一個新的終端,在一個新的容器中執行Kafka:
$ docker run -it --rm --name kafka -p 9092:9092 --link zookeeper:zookeeper debezium/kafka:0.8
提示
在本教程中,我們總是在Docker容器中連線Kafka,只要我們連線到Kafka容器,就總是能夠看到Kafka容器並與之通訊。如果我們想從Docker容器外部連線到Kafka,那麼我們就會希望Kafka通過Docker的主機地址告知外界,我們可以通過新增
-e ADVERTISED_HOST_NAME=
緊隨其後的是在Linux或Mac上執行的Docker的主機的IP地址或主機名解析,這是主機的IP地址(不是localhost)。
我們使用debezium/kafka映象的0.8版本執行一個新的容器,並將kafka名稱分配給這個容器。"-it"選項使容器具有互動性,這意味著它將終端的標準輸入和輸出附加到容器上,以便您可以看到容器中發生了什麼,"–rm"命令可以使Docker在容器停止時移除容器。該命令將容器中的埠9092對映到Docker主機上的相同埠,以便容器外部的軟體可以與Kafka通訊。最後,使用"–link zookeeper:zookeeper"引數告訴容器,它可以在名為zookeeper的容器中找到在同一個Docker主機上執行的zookeeper。
你應該可以在你的終端看到Kafka的典型輸出,內容結尾為:
...
2017-09-21 07:16:59,085 - INFO [main-EventThread:[email protected]] - zookeeper state changed (SyncConnected)
2017-09-21 07:16:59,218 - INFO [main:[email protected]] - Cluster ID = LPtcBFxzRvOzDSXhc6AamA
2017-09-21 07:16:59,221 - WARN [main:[email protected]] - No meta.properties file under dir /kafka/data/1/meta.properties
2017-09-21 07:16:59,247 - INFO [ThrottledRequestReaper-Fetch:[email protected]] - [ThrottledRequestReaper-Fetch]: Starting
2017-09-21 07:16:59,247 - INFO [ThrottledRequestReaper-Produce:[email protected]] - [ThrottledRequestReaper-Produce]: Starting
2017-09-21 07:16:59,248 - INFO [ThrottledRequestReaper-Request:[email protected]] - [ThrottledRequestReaper-Request]: Starting
2017-09-21 07:16:59,308 - INFO [main:[email protected]] - Loading logs.
2017-09-21 07:16:59,312 - INFO [main:[email protected]] - Logs loading complete in 4 ms.
2017-09-21 07:16:59,349 - INFO [main:[email protected]] - Starting log cleanup with a period of 300000 ms.
2017-09-21 07:16:59,353 - INFO [main:[email protected]] - Starting log flusher with a default period of 9223372036854775807 ms.
2017-09-21 07:16:59,385 - INFO [main:[email protected]] - Awaiting socket connections on 172.17.0.4:9092.
2017-09-21 07:16:59,387 - INFO [main:[email protected]] - [Socket Server on Broker 1], Started 1 acceptor threads
2017-09-21 07:16:59,394 - INFO [ExpirationReaper-1-Produce:[email protected]] - [ExpirationReaper-1-Produce]: Starting
2017-09-21 07:16:59,395 - INFO [ExpirationReaper-1-Fetch:[email protected]] - [ExpirationReaper-1-Fetch]: Starting
2017-09-21 07:16:59,395 - INFO [ExpirationReaper-1-DeleteRecords:[email protected]] - [ExpirationReaper-1-DeleteRecords]: Starting
2017-09-21 07:16:59,435 - INFO [ExpirationReaper-1-topic:[email protected]] - [ExpirationReaper-1-topic]: Starting
2017-09-21 07:16:59,441 - INFO [ExpirationReaper-1-Heartbeat:[email protected]] - [ExpirationReaper-1-Heartbeat]: Starting
2017-09-21 07:16:59,442 - INFO [controller-event-thread:[email protected]] - Creating /controller (is it secure? false)
2017-09-21 07:16:59,447 - INFO [ExpirationReaper-1-Rebalance:[email protected]] - [ExpirationReaper-1-Rebalance]: Starting
2017-09-21 07:16:59,456 - INFO [controller-event-thread:[email protected]] - Result of znode creation is: OK
2017-09-21 07:16:59,458 - INFO [main:[email protected]] - [GroupCoordinator 1]: Starting up.
2017-09-21 07:16:59,459 - INFO [main:[email protected]] - [GroupCoordinator 1]: Startup complete.
2017-09-21 07:16:59,460 - INFO [group-metadata-manager-0:[email protected]] - [Group Metadata Manager on Broker 1]: Removed 0 expired offsets in 1 milliseconds.
2017-09-21 07:16:59,487 - INFO [main:[email protected]] - [ProducerId Manager 1]: Acquired new producerId block (brokerId:1,blockStartProducerId:0,blockEndProducerId:999) by writing to Zk with path version 1
2017-09-21 07:16:59,530 - INFO [main:[email protected]] - [Transaction Coordinator 1]: Starting up.
2017-09-21 07:16:59,532 - INFO [TxnMarkerSenderThread-1:[email protected]] - [Transaction Marker Channel Manager 1]: Starting
2017-09-21 07:16:59,532 - INFO [main:[email protected]] - [Transaction Coordinator 1]: Startup complete.
2017-09-21 07:16:59,551 - INFO [main:[email protected]] - Will not load MX4J, mx4j-tools.jar is not in the classpath
2017-09-21 07:16:59,590 - INFO [main:[email protected]] - Creating /brokers/ids/1 (is it secure? false)
2017-09-21 07:16:59,604 - INFO [main:[email protected]] - Result of znode creation is: OK
2017-09-21 07:16:59,605 - INFO [main:[email protected]] - Registered broker 1 at path /brokers/ids/1 with addresses: EndPoint(172.17.0.4,9092,ListenerName(PLAINTEXT),PLAINTEXT)
2017-09-21 07:16:59,606 - WARN [main:[email protected]] - No meta.properties file under dir /kafka/data/1/meta.properties
2017-09-21 07:16:59,648 - INFO [main:[email protected]] - Kafka version : 0.11.0.0
2017-09-21 07:16:59,648 - INFO [main:[email protected]] - Kafka commitId : cb8625948210849f
2017-09-21 07:16:59,649 - INFO [main:[email protected]] - [Kafka Server 1], started
上面顯示的最後一行顯示Kafka broker已經成功啟動,併為客戶機連線做好了準備。終端將繼續顯示Kafka生成的額外輸出。
提示
Debezium 0.8.3.Final需要Kafka Connect 1.1.0,在本教程中,我們還使用Kafka broker的1.1.0版本。檢視Kafka文件,瞭解不同版本的Kafka Connect和Kafka broker之間的相容性。