您好,登錄后才能下訂單哦!
這篇文章主要介紹“Docker搭建Zookeeper和Kafka集群實(shí)例分析”,在日常操作中,相信很多人在Docker搭建Zookeeper和Kafka集群實(shí)例分析問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Docker搭建Zookeeper和Kafka集群實(shí)例分析”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
環(huán)境準(zhǔn)備
一臺(tái)可以上網(wǎng)且有centos7虛擬機(jī)的電腦
為什么使用虛擬機(jī)?因?yàn)槭褂玫墓P記本,所以每次連接網(wǎng)絡(luò)ip都會(huì)改變,還要總是修改配置文件的,過(guò)于繁瑣,不方便測(cè)試。(通過(guò)docker虛擬網(wǎng)絡(luò)的方式可以避免此問(wèn)題,當(dāng)時(shí)實(shí)驗(yàn)的時(shí)候沒(méi)有了解到)
docker 安裝
如果已經(jīng)安裝docker請(qǐng)忽略此步驟
docker支持以下的centos版本:
centos 7 (64-bit):要求系統(tǒng)為64位、系統(tǒng)內(nèi)核版本為 3.10 以上。
centos 6.5(64-bit)或更高的版本:要求系統(tǒng)為64位、系統(tǒng)內(nèi)核版本為 2.6.32-431 或者更高版本。
centos 僅發(fā)行版本中的內(nèi)核支持 docker。
yum安裝
docker 要求 centos 系統(tǒng)的內(nèi)核版本高于 3.10 ,查看上文的前提條件來(lái)驗(yàn)證你的centos 版本是否支持 docker 。
# 查看內(nèi)核版本 $ uname -a
#安裝 docker $ yum -y install docker
#啟動(dòng) docker 后臺(tái)服務(wù) $ service docker start
# 由于本地沒(méi)有hello-world這個(gè)鏡像,所以會(huì)下載一個(gè)hello-world的鏡像,并在容器內(nèi)運(yùn)行。 $ docker run hello-world
腳本安裝
使用 sudo 或 root 權(quán)限登錄 centos。
確保 yum 包更新到最新。
$ sudo yum update
獲取并執(zhí)行 docker 安裝腳本。
$ curl -fssl https://get.docker.com -o get-docker.sh # 執(zhí)行這個(gè)腳本會(huì)添加 docker.repo 源并安裝 docker。 $ sudo sh get-docker.sh
啟動(dòng)docker
$ sudo systemctl start docker
# 驗(yàn)證 docker 是否安裝成功并在容器中執(zhí)行一個(gè)測(cè)試的鏡像。 $ sudo docker run hello-world $ docker ps
鏡像加速
開(kāi)始讓我配置國(guó)內(nèi)鏡像源的時(shí)候我是拒絕的,但是使用之后發(fā)現(xiàn)那下載速度 duang~
的一下就上去了。所以強(qiáng)烈建議大家配置國(guó)內(nèi)鏡像源。
打開(kāi)/創(chuàng)建 /etc/docker/daemon.json
文件,添加以下內(nèi)容:
{ "registry-mirrors": ["http://hub-mirror.c.163.com"] }
zookeeper集群搭建
zookeeper鏡像:zookeeper:3.4
鏡像準(zhǔn)備
$ docker pull zookeeper:3.4
查找鏡像可以去
docker pull images:tag // 代表拉取 tag
版本的 image
鏡像
建立獨(dú)立zookeeper容器
我們首先用最簡(jiǎn)單的方式創(chuàng)建一個(gè)獨(dú)立的zookeeper
節(jié)點(diǎn),然后我們根據(jù)這個(gè)例子創(chuàng)建出其他的節(jié)點(diǎn)。
$ docker run --name zookeeper -p 2181:2181 -d zookeeper:3.4
默認(rèn)的,容器內(nèi)配置文件在, /conf/zoo.cfg
,數(shù)據(jù)和日志目錄默認(rèn)在 /data
和 /datalog
,需要的話可以將上述目錄映射到宿主機(jī)。
參數(shù)解釋
--name:指定容器名字
-p:為容器暴露出來(lái)的端口分配端口號(hào)
-d:在后臺(tái)運(yùn)行容器并打印容器id
集群搭建
其它節(jié)點(diǎn)的zookeeper
容器創(chuàng)建方式與創(chuàng)建獨(dú)立容器類(lèi)似,需要注意的是,要分別指定節(jié)點(diǎn)的id
和修改文件中多節(jié)點(diǎn)的配置,相應(yīng)的創(chuàng)建命令如下:
新建docker網(wǎng)絡(luò)
$ docker network create zoo_kafka $ docker network ls
zookeeper容器1
$ docker run -d \ --restart=always \ -v /opt/docker/zookeeper/zoo1/data:/data \ -v /opt/docker/zookeeper/zoo1/datalog:/datalog \ -e zoo_my_id=1 \ -p 2181:2181 \ -e zoo_servers="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \ --name=zoo1 \ --net=viemall-zookeeper \ --privileged \ zookeeper:3.4
zookeeper容器2
$ docker run -d \ --restart=always \ -v /opt/docker/zookeeper/zoo2/data:/data \ -v /opt/docker/zookeeper/zoo2/datalog:/datalog \ -e zoo_my_id=2 \ -p 2182:2181 \ -e zoo_servers="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \ --name=zoo2 \ --net=viemall-zookeeper \ --privileged \ zookeeper:3.4
zookeeper容器3
$ docker run -d \ --restart=always \ -v /opt/docker/zookeeper/zoo3/data:/data \ -v /opt/docker/zookeeper/zoo3/datalog:/datalog \ -e zoo_my_id=3 \ -p 2183:2181 \ -e zoo_servers="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \ --name=zoo3 \ --net=viemall-zookeeper \ --privileged \ zookeeper:3.4
這種方式雖然也實(shí)現(xiàn)了我們想要的,但是步驟過(guò)于繁瑣,而且維護(hù)起來(lái)麻煩(懶癌晚期),所以我們使用 docker-compose
的方式來(lái)實(shí)現(xiàn)。
docker-compose 搭建zookeeper集群
新建docker網(wǎng)絡(luò)
$ docker network create viemall-zookeeper $ docker network ls
編寫(xiě) docker-compose.yml 腳本
使用方式:
安裝 docker-compose
# 獲取腳本 $ curl -l https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # 賦予執(zhí)行權(quán)限 $chmod +x /usr/local/bin/docker-compose
任意目錄下新建 docker-compose.yml
文件,復(fù)制以下內(nèi)容
執(zhí)行命令 docker-compose up -d
命令對(duì)照
|命令|解釋|
|-|-|
|docker-compose up|啟動(dòng)所有容器|
|docker-compose up -d|后臺(tái)啟動(dòng)并運(yùn)行所有容器|
|docker-compose up --no-recreate -d|不重新創(chuàng)建已經(jīng)停止的容器|
|docker-compose up -d test2|只啟動(dòng)test2這個(gè)容器|
|docker-compose stop|停止容器|
|docker-compose start|啟動(dòng)容器|
|docker-compose down|停止并銷(xiāo)毀容器|
docker-compose.yml
詳情
version: '2' services: zoo1: image: zookeeper:3.4 # 鏡像名稱(chēng) restart: always # 當(dāng)發(fā)生錯(cuò)誤時(shí)自動(dòng)重啟 hostname: zoo1 container_name: zoo1 privileged: true ports: # 端口 - 2181:2181 volumes: # 掛載數(shù)據(jù)卷 - ./zoo1/data:/data - ./zoo1/datalog:/datalog environment: tz: asia/shanghai zoo_my_id: 1 # 節(jié)點(diǎn)id zoo_port: 2181 # zookeeper端口號(hào) zoo_servers: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 # zookeeper節(jié)點(diǎn)列表 networks: default: ipv4_address: 172.23.0.11 zoo2: image: zookeeper:3.4 restart: always hostname: zoo2 container_name: zoo2 privileged: true ports: - 2182:2181 volumes: - ./zoo2/data:/data - ./zoo2/datalog:/datalog environment: tz: asia/shanghai zoo_my_id: 2 zoo_port: 2181 zoo_servers: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 networks: default: ipv4_address: 172.23.0.12 zoo3: image: zookeeper:3.4 restart: always hostname: zoo3 container_name: zoo3 privileged: true ports: - 2183:2181 volumes: - ./zoo3/data:/data - ./zoo3/datalog:/datalog environment: tz: asia/shanghai zoo_my_id: 3 zoo_port: 2181 zoo_servers: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 networks: default: ipv4_address: 172.23.0.13 networks: default: external: name: zoo_kafka
驗(yàn)證
從圖中我們可以看出,有一個(gè)leader
,兩個(gè)flower
,至此我們的zookeeper
集群就已經(jīng)搭建好了
kafka集群搭建
有了上面的基礎(chǔ),再去搞kafka
集群還是問(wèn)題嗎?其實(shí)就是幾個(gè)變量值不同而已。
有了上邊的例子,就不費(fèi)勁去搞單節(jié)點(diǎn)的kafka
了,直接使用docker-compose
的方式,部署三個(gè)節(jié)點(diǎn),其實(shí)方式大同小異,上邊也說(shuō)到,其實(shí)就是一些屬性不同而已;這時(shí)候我們就不需要再去新建 docker 網(wǎng)絡(luò)了,直接使用前邊搭建 zookeeper
集群時(shí)創(chuàng)建的網(wǎng)絡(luò)即可!
環(huán)境準(zhǔn)備
kafka鏡像:wurstmeister/kafka
kafka-manager鏡像:sheepkiller/kafka-manager
# 不指定版本默認(rèn)拉取最新版本的鏡像 docker pull wurstmeister/kafka docker pull sheepkiller/kafka-manager
編寫(xiě) docker-compose.yml 腳本
使用方式:
安裝 docker-compose
# 獲取腳本 $ curl -l https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # 賦予執(zhí)行權(quán)限 $chmod +x /usr/local/bin/docker-compose
任意目錄下新建 docker-compose.yml
文件,復(fù)制以下內(nèi)容
執(zhí)行命令 docker-compose up -d
命令對(duì)照
|命令|解釋|
|-|-|-|
|docker-compose up|啟動(dòng)所有容器|
|docker-compose up -d|后臺(tái)啟動(dòng)并運(yùn)行所有容器|
|docker-compose up --no-recreate -d|不重新創(chuàng)建已經(jīng)停止的容器|
|docker-compose up -d test2|只啟動(dòng)test2這個(gè)容器|
|docker-compose stop|停止容器|
|docker-compose start|啟動(dòng)容器|
|docker-compose down|停止并銷(xiāo)毀容器|
docker-compose.yml
詳細(xì)內(nèi)容
version: '2' services: broker1: image: wurstmeister/kafka restart: always hostname: broker1 container_name: broker1 privileged: true ports: - "9091:9092" environment: kafka_broker_id: 1 kafka_listeners: plaintext://broker1:9092 kafka_advertised_listeners: plaintext://broker1:9092 kafka_advertised_host_name: broker1 kafka_advertised_port: 9092 kafka_zookeeper_connect: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1 jmx_port: 9988 volumes: - /var/run/docker.sock:/var/run/docker.sock - ./broker1:/kafka/kafka\-logs\-broker1 external_links: - zoo1 - zoo2 - zoo3 networks: default: ipv4_address: 172.23.0.14 broker2: image: wurstmeister/kafka restart: always hostname: broker2 container_name: broker2 privileged: true ports: - "9092:9092" environment: kafka_broker_id: 2 kafka_listeners: plaintext://broker2:9092 kafka_advertised_listeners: plaintext://broker2:9092 kafka_advertised_host_name: broker2 kafka_advertised_port: 9092 kafka_zookeeper_connect: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1 jmx_port: 9988 volumes: - /var/run/docker.sock:/var/run/docker.sock - ./broker2:/kafka/kafka\-logs\-broker2 external_links: # 連接本compose文件以外的container - zoo1 - zoo2 - zoo3 networks: default: ipv4_address: 172.23.0.15 broker3: image: wurstmeister/kafka restart: always hostname: broker3 container_name: broker3 privileged: true ports: - "9093:9092" environment: kafka_broker_id: 3 kafka_listeners: plaintext://broker3:9092 kafka_advertised_listeners: plaintext://broker3:9092 kafka_advertised_host_name: broker3 kafka_advertised_port: 9092 kafka_zookeeper_connect: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1 jmx_port: 9988 volumes: - /var/run/docker.sock:/var/run/docker.sock - ./broker3:/kafka/kafka\-logs\-broker3 external_links: # 連接本compose文件以外的container - zoo1 - zoo2 - zoo3 networks: default: ipv4_address: 172.23.0.16 kafka-manager: image: sheepkiller/kafka-manager:latest restart: always container_name: kafka-manager hostname: kafka-manager ports: - "9000:9000" links: # 連接本compose文件創(chuàng)建的container - broker1 - broker2 - broker3 external_links: # 連接本compose文件以外的container - zoo1 - zoo2 - zoo3 environment: zk_hosts: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1 kafka_brokers: broker1:9092,broker2:9092,broker3:9092 application_secret: letmein km_args: -djava.net.preferipv4stack=true networks: default: ipv4_address: 172.23.0.10 networks: default: external: # 使用已創(chuàng)建的網(wǎng)絡(luò) name: zoo_kafka
驗(yàn)證
我們打開(kāi)kafka-manager
的管理頁(yè)面,訪問(wèn)路徑是,宿主機(jī)ip:9000;
如果所示,填寫(xiě)上zookeeper
集群的地址,劃到最下邊點(diǎn)擊save
點(diǎn)擊剛剛添加的集群,可以看到,集群中有三個(gè)節(jié)點(diǎn)
搭建過(guò)程中遇到的問(wèn)題
掛載數(shù)據(jù)卷無(wú)限重啟,查看log
提示:chown: changing ownership of ‘/var/lib/mysql/....‘: permission denied
解決方式:
在docker run中加入 --privileged=true 給容器加上特定權(quán)限
臨時(shí)關(guān)閉selinux: setenforce 0
添加selinux規(guī)則,改變要掛載的目錄的安全性文本
kafka-manager報(bào)jmx相關(guān)錯(cuò)誤,
解決方法:
在每一個(gè)kafka節(jié)點(diǎn)加上環(huán)境變量 jmx_port=端口
加上之后發(fā)現(xiàn)連不上,又是網(wǎng)絡(luò)連接的問(wèn)題,于是又把每個(gè)jmx端口暴露出來(lái),然后fire-wall放行, 解決問(wèn)題。
kafka_advertised_host_name這個(gè)最好設(shè)置宿主機(jī)的ip,宿主機(jī)以外的代碼或者工具來(lái)連接,后面的端口也需要設(shè)置暴露的端口。
[error] k.m.j.kafkajmx$ - failed to connect to service:jmx:rmi:///jndi/rmi://9.11.8.48:-1/jmxrmi java.lang.illegalargumentexception: requirement failed: no jmx port but jmx polling enabled!
在容器中查看topic
時(shí)報(bào)以下錯(cuò)誤(不僅僅是topic的命令,好像所有的都會(huì)出錯(cuò))
$ bin/kafka-topics.sh --list --zookeeper zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1 # 以下是錯(cuò)誤 error: exception thrown by the agent : java.rmi.server.exportexception: port already in use: 7203; nested exception is: java.net.bindexception: address already in use
解決方法:
在命令前加上unset jmx_port;
指令,上邊的命令改造為:
$ unset jmx_port;bin/kafka-topics.sh --list --zookeeper zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
附:docker常用指令
# 查看所有鏡像 docker images # 查看所有運(yùn)行中的容器 docker ps # 查看所有容器 docker ps -a # 獲取所有容器ip $ docker inspect --format='{{.name}} - {{range .networksettings.networks}}{{.ipaddress}}{{end}}' $(docker ps -aq) # 查看容器內(nèi)部日志 $ docker logs -f <容器id> # 進(jìn)入容器內(nèi)部 $ docker exec -it <容器id> /bin/basj # 創(chuàng)建容器 -d代表后臺(tái)啟動(dòng) docker run --name <容器名稱(chēng)> -e <參數(shù)> -v <掛載數(shù)據(jù)卷> <容器id> # 重啟容器 docker restart <容器id> # 關(guān)閉容器 docker stop <容器id> # 運(yùn)行容器 docker start <容器id>
到此,關(guān)于“Docker搭建Zookeeper和Kafka集群實(shí)例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。