三台真機,容器采用host
192.168.0.128 192.168.0.141 192.168.0.142
zookeeper集群搭建
在每台機上執行腳本,
#!/bin/bash #Get zookeeper image zkimage=`docker images | grep zookeeper | awk {'print $1'}` if [ -n "$zkimage" ] then echo 'The zookeeper image is already existed.' else echo 'Pull the latest zookeeper image.' docker pull zookeeper fi #Create network for zookeeper containers zknet=`docker network ls | grep yapi_net | awk {'print $2'}` if [ -n "$zknet" ] then echo 'The zknetwork is already existed.' else echo 'Create zknetwork.' docker network create --subnet 172.30.0.0/16 yapi_net fi #Start zookeeper cluster echo 'Start 3 zookeeper servers.' rm -rf /opt/zookeeper_1/data /opt/zookeeper_1/datalog /var/log/zookeeper_1/log rm -rf /opt/zookeeper_2/data /opt/zookeeper_2/datalog /var/log/zookeeper_2/log rm -rf /opt/zookeeper_3/data /opt/zookeeper_3/datalog /var/log/zookeeper_3/log mkdir -p /opt/zookeeper_1/data /opt/zookeeper_1/datalog /var/log/zookeeper_1/log mkdir -p /opt/zookeeper_2/data /opt/zookeeper_2/datalog /var/log/zookeeper_2/log mkdir -p /opt/zookeeper_3/data /opt/zookeeper_3/datalog /var/log/zookeeper_3/log
ZOO_SERVERS="server.1=192.168.0.128:2888:3888 server.2=192.168.0.142:2888:3888 server.3=192.168.0.141:2888:3888"
#新版 ZOO_SERVERS="clientPort=2181 server.1=192.168.0.146:2888:3888 server.2=192.168.0.145:2888:3888"
docker run --network host -d --restart always -v /opt/zookeeper_1/data:/data -v /opt/zookeeper_1/datalog:/datalog -v /var/log/zookeeper_1/log:/logs -e ZOO_SERVERS="$ZOO_SERVERS" -e ZOO_MY_ID=1 --name zookeeper_1 -p 2182:2181 -p 2888:2888 -p 3888:3888 docker.io/zookeeper
注意每台機的
id號不同
官方的鏡像有可能配置的環境變量不同,需要修改腳本,參考Entrypoint文件,和配置文件,配置文件如下:
clientPort=2181 dataDir=/data dataLogDir=/datalog tickTime=2000 initLimit=5 syncLimit=2 autopurge.snapRetainCount=3 autopurge.purgeInterval=0 maxClientCnxns=60 server.1=192.168.0.128:2888:3888 server.2=192.168.0.142:2888:3888 server.3=192.168.0.141:2888:3888
單機(非集群)的配置文件,telnet ip 2181 = 》stat ==》Mode: standalone
telnet 新版的不能驗證stat,訪問http://192.168.0.145:8080/commands/stat,可驗證,參考docker hub的zookeeper鏡像
http://192.168.1.129:8080/commands/mntr #查看集權信息
clientPort=2181 dataDir=/data dataLogDir=/datalog tickTime=2000 initLimit=5 syncLimit=2 autopurge.snapRetainCount=3 autopurge.purgeInterval=0 maxClientCnxns=60
kafka集群
在每台機上執行腳本,
#!/bin/bash #Get zookeeper image kfkimage=`docker images | grep 'docker.io/wurstmeister/kafka' | awk {'print $1'}` if [ -n "$kfkimage" ] then echo 'The docker.io/wurstmeister/kafka is already existed.' else echo 'Pull the image.' docker pull docker.io/wurstmeister/kafka fi #Create network for zookeeper containers kfknet=`docker network ls | grep yapi_net | awk {'print $2'}` if [ -n "$kfknet" ] then echo 'The kfknetwork is already existed.' else echo 'Create kfknetwork.' docker network create --subnet 172.30.0.0/16 yapi_net fi #Start 3 zookeeper cluster echo 'Start 3 kafka servers.' rm -rf /opt/kafka_1/logdata rm -rf /opt/kafka_2/logdata rm -rf /opt/kafka_3/logdata mkdir -p /opt/kafka_1/logdata mkdir -p /opt/kafka_2/logdata mkdir -p /opt/kafka_3/logdata #kafka ip kfk_1_ip='172.30.0.41' kfk_2_ip='172.30.0.42' kfk_3_ip='172.30.0.43' #zk_jiqun_ip='172.30.0.31:2181' zk_jiqun_ip='192.168.0.128:2181,192.168.0.142:2181,192.168.0.141:2181' docker run --restart always -d --name kafka_1 --network host -e KAFKA_ZOOKEEPER_CONNECT=${zk_jiqun_ip} -e KAFKA_LISTENERS='PLAINTEXT://0.0.0.0:9092' -e KAFKA_BROKER_ID='141' -e KAFKA_ADVERTISED_LISTENERS='PLAINTEXT://192.168.0.141:9092' -v /opt/kafka_1/logdata:/kafka -p 9092:9092 docker.io/wurstmeister/kafka
注意id號 和PLAINTEXT://192.168.0.141:9092,(創建容器后,再進入容器修改,restart后會重置,所以必須在創建容器時,就要指定好環境變量。因為啟動腳本會重新修改配置文件,所以要想修改環境變量,只需要在啟動腳本里加一個即可)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
補充:單機docker run -d --restart always -v /opt/zookeeper/data:/data -v /opt/zookeeper/datalog:/datalog -v /var/log/zookeeper/log:/logs --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 -p 8081:8080 docker.io/zookeeper
docker run --restart always -d --name kafka -e KAFKA_ZOOKEEPER_CONNECT=${zk_jiqun_ip} -e KAFKA_LISTENERS='PLAINTEXT://0.0.0.0:9092' -e KAFKA_BROKER_ID='163' -e KAFKA_ADVERTISED_LISTENERS='PLAINTEXT://172.18.72.163:9092' -v /opt/kafka/logdata:/kafka -p 9092:9092 docker.io/wurstmeister/kafka
---------------------------------------------------------------------------------------------------------
補充2:雲上部署,不同主機節點,zookeeper采用host網絡:因為采用容器網絡,zookeeper不同主機節點之間通信,找不到容器網絡,
不同主機節點,kafka采用host網絡,單參數KAFKA_ADVERTISED_LISTENERS='PLAINTEXT://172.18.72.163:9092' ,發消息時,會通過配置文件PLAINTEXT://172.18.72.163:9092,找kafka集群的節點,線上配置私網即可,因為,服務之間可以通過私網訪問,如果本地需要用
來訪問kafka時,就需要要配置公網ip:因為遠程,如果是私網,就會連接超時,
test是測kafka

ping是測zookeeper

kafka連接zookeeper超時
[2019-01-02 14:41:03,450] ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING at kafka.zookeeper.ZooKeeperClient$$anonfun$kafka$zookeeper$ZooKeeperClient$$waitUntilConnected$1.apply$mcV$sp(ZooKeeperClient.scala:268) at kafka.zookeeper.ZooKeeperClient$$anonfun$kafka$zookeeper$ZooKeeperClient$$waitUntilConnected$1.apply(ZooKeeperClient.scala:264) at kafka.zookeeper.ZooKeeperClient$$anonfun$kafka$zookeeper$ZooKeeperClient$$waitUntilConnected$1.apply(ZooKeeperClient.scala:264) at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:251) at kafka.zookeeper.ZooKeeperClient.kafka$zookeeper$ZooKeeperClient$$waitUntilConnected(ZooKeeperClient.scala:264) at kafka.zookeeper.ZooKeeperClient.<init>(ZooKeeperClient.scala:97) at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1693) at kafka.server.KafkaServer.kafka$server$KafkaServer$$createZkClient$1(KafkaServer.scala:348) at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:372) at kafka.server.KafkaServer.startup(KafkaServer.scala:202) at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38) at kafka.Kafka$.main(Kafka.scala:75) at kafka.Kafka.main(Kafka.scala)

在各個節點上hosts文件,添加對應ip即可
