欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Docker搭建Zookeeper&Kafka集群的實現(xiàn)

 更新時間:2019年08月29日 09:30:03   作者:Jacian  
這篇文章主要介紹了Docker搭建Zookeeper&Kafka集群的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

最近在學(xué)習(xí)Kafka,準(zhǔn)備測試集群狀態(tài)的時候感覺無論是開三臺虛擬機或者在一臺虛擬機開辟三個不同的端口號都太麻煩了(嗯。。主要是懶)。

環(huán)境準(zhǔn)備

一臺可以上網(wǎng)且有CentOS7虛擬機的電腦

為什么使用虛擬機?因為使用的筆記本,所以每次連接網(wǎng)絡(luò)IP都會改變,還要總是修改配置文件的,過于繁瑣,不方便測試。(通過Docker虛擬網(wǎng)絡(luò)的方式可以避免此問題,當(dāng)時實驗的時候沒有了解到)

Docker 安裝

如果已經(jīng)安裝Docker請忽略此步驟

  • 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 ,查看上文的前提條件來驗證你的CentOS 版本是否支持 Docker 。

# 查看內(nèi)核版本
$ uname -a
#安裝 Docker
$ yum -y install docker
#啟動 Docker 后臺服務(wù)
$ service docker start
# 由于本地沒有hello-world這個鏡像,所以會下載一個hello-world的鏡像,并在容器內(nèi)運行。
$ 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í)行這個腳本會添加 docker.repo 源并安裝 Docker。
$ sudo sh get-docker.sh

啟動Docker

$ sudo systemctl start docker
# 驗證 docker 是否安裝成功并在容器中執(zhí)行一個測試的鏡像。
$ sudo docker run hello-world
$ docker ps

鏡像加速

開始讓我配置國內(nèi)鏡像源的時候我是拒絕的,但是使用之后發(fā)現(xiàn)那下載速度 duang~ 的一下就上去了。所以強烈建議大家配置國內(nè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

查找鏡像可以去 https://hub.docker.com/

docker pull images:TAG // 代表拉取 TAG 版本的 image 鏡像

建立獨立Zookeeper容器

我們首先用最簡單的方式創(chuàng)建一個獨立的Zookeeper節(jié)點,然后我們根據(jù)這個例子創(chuàng)建出其他的節(jié)點。

$ docker run --name zookeeper -p 2181:2181 -d zookeeper:3.4

默認(rèn)的,容器內(nèi)配置文件在, /conf/zoo.cfg,數(shù)據(jù)和日志目錄默認(rèn)在 /data/datalog,需要的話可以將上述目錄映射到宿主機。

參數(shù)解釋

--name:指定容器名字
-p:為容器暴露出來的端口分配端口號
-d:在后臺運行容器并打印容器ID

集群搭建

其它節(jié)點的Zookeeper容器創(chuàng)建方式與創(chuàng)建獨立容器類似,需要注意的是,要分別指定節(jié)點的id和修改文件中多節(jié)點的配置,相應(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

這種方式雖然也實現(xiàn)了我們想要的,但是步驟過于繁瑣,而且維護(hù)起來麻煩(懶癌晚期),所以我們使用 docker-compose 的方式來實現(xiàn)。

docker-compose 搭建zookeeper集群

新建docker網(wǎng)絡(luò)

$ docker network create viemall-zookeeper
$ docker network ls

編寫 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

命令對照
|命令|解釋|
|-|-|
|docker-compose up|啟動所有容器|
|docker-compose up -d|后臺啟動并運行所有容器|
|docker-compose up --no-recreate -d|不重新創(chuàng)建已經(jīng)停止的容器|
|docker-compose up -d test2|只啟動test2這個容器|
|docker-compose stop|停止容器|
|docker-compose start|啟動容器|
|docker-compose down|停止并銷毀容器|

docker-compose.yml下載地址:https://github.com/JacianLiu/docker-compose/tree/master/zookeeper
docker-compose.yml詳情

version: '2'
services:
 zoo1:
  image: zookeeper:3.4 # 鏡像名稱
  restart: always # 當(dāng)發(fā)生錯誤時自動重啟
  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é)點ID
   ZOO_PORT: 2181 # zookeeper端口號
   ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 # zookeeper節(jié)點列表
  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

驗證

從圖中我們可以看出,有一個Leader,兩個Flower,至此我們的Zookeeper集群就已經(jīng)搭建好了

Kafka集群搭建

有了上面的基礎(chǔ),再去搞Kafka集群還是問題嗎?其實就是幾個變量值不同而已。

有了上邊的例子,就不費勁去搞單節(jié)點的Kafka了,直接使用docker-compose的方式,部署三個節(jié)點,其實方式大同小異,上邊也說到,其實就是一些屬性不同而已;這時候我們就不需要再去新建 Docker 網(wǎng)絡(luò)了,直接使用前邊搭建 Zookeeper 集群時創(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

編寫 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

命令對照
|命令|解釋|
|-|-|-|
|docker-compose up|啟動所有容器|
|docker-compose up -d|后臺啟動并運行所有容器|
|docker-compose up --no-recreate -d|不重新創(chuàng)建已經(jīng)停止的容器|
|docker-compose up -d test2|只啟動test2這個容器|
|docker-compose stop|停止容器|
|docker-compose start|啟動容器|
|docker-compose down|停止并銷毀容器|

docker-compose.yml下載地址:https://github.com/JacianLiu/docker-compose/tree/master/zookeeper
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

驗證

我們打開kafka-manager的管理頁面,訪問路徑是,宿主機ip:9000;


如果所示,填寫上Zookeeper集群的地址,劃到最下邊點擊save

點擊剛剛添加的集群,可以看到,集群中有三個節(jié)點

搭建過程中遇到的問題

掛載數(shù)據(jù)卷無限重啟,查看log提示:chown: changing ownership of ‘/var/lib/mysql/....‘: Permission denied

解決方式:

  • 在docker run中加入 --privileged=true 給容器加上特定權(quán)限
  • 臨時關(guān)閉selinux: setenforce 0
  • 添加selinux規(guī)則,改變要掛載的目錄的安全性文本

kafka-manager報jmx相關(guān)錯誤,

解決方法:

  • 在每一個kafka節(jié)點加上環(huán)境變量 JMX_PORT=端口
  • 加上之后發(fā)現(xiàn)連不上,又是網(wǎng)絡(luò)連接的問題,于是又把每個jmx端口暴露出來,然后fire-wall放行, 解決問題。
  • KAFKA_ADVERTISED_HOST_NAME這個最好設(shè)置宿主機的ip,宿主機以外的代碼或者工具來連接,后面的端口也需要設(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時報以下錯誤(不僅僅是topic的命令,好像所有的都會出錯)

$ bin/kafka-topics.sh --list --zookeeper zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
# 以下是錯誤
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
# 查看所有運行中的容器
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代表后臺啟動
docker run --name <容器名稱> -e <參數(shù)> -v <掛載數(shù)據(jù)卷> <容器ID>
# 重啟容器
docker restart <容器ID>
# 關(guān)閉容器
docker stop <容器id>
# 運行容器
docker start <容器id>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Portainer部署Docker容器的項目實踐

    使用Portainer部署Docker容器的項目實踐

    這篇文章主要介紹了使用Portainer部署Docker容器的項目實踐,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Docker容器應(yīng)用日志查看方法

    Docker容器應(yīng)用日志查看方法

    今天小編就為大家分享一篇關(guān)于Docker容器應(yīng)用日志查看方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 詳解Docker Swarm 在持續(xù)集成測試中的應(yīng)用

    詳解Docker Swarm 在持續(xù)集成測試中的應(yīng)用

    本文主要介紹如何利用 Docker Swarm 集群功能和 Selenium Grid 腳本分發(fā)功能,來搭建一個可以動態(tài)擴容的 Selenium 自動化腳本執(zhí)行環(huán)境,感興趣的小伙伴們可以參考一下
    2018-10-10
  • docker如何開啟2375端口提供外部訪問docker

    docker如何開啟2375端口提供外部訪問docker

    這篇文章主要介紹了docker如何開啟2375端口提供外部訪問docker問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 如何修改Docke上傳/下載并發(fā)線程數(shù)來解決docker: unexpected EOF.錯誤問題

    如何修改Docke上傳/下載并發(fā)線程數(shù)來解決docker: unexpected EOF.錯誤問題

    下載或上傳鏡像時,有可能因為網(wǎng)絡(luò)問題導(dǎo)致報出docker: unexpected EOF.的錯誤,這時候可以考慮通過修改上傳/下載并發(fā)線程數(shù)來解決,本文給大家分享兩種方法幫助大家解決,需要的朋友一起看看吧
    2023-03-03
  • 詳解如何在 Docker 中設(shè)置 Go 并部署應(yīng)用

    詳解如何在 Docker 中設(shè)置 Go 并部署應(yīng)用

    在本教程中,我們將學(xué)習(xí)如何使用 docker 部署 golang web 應(yīng)用程序。 具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • 查找每個Docker鏡像的層和層大小的兩種方法

    查找每個Docker鏡像的層和層大小的兩種方法

    本文主要介紹了查找每個Docker鏡像的層和層大小的兩種方法,這對于識別可能導(dǎo)致鏡像整體大小的大型層,以及確定哪些層可以被刪除或優(yōu)化以減少鏡像的大小是非常有用的,感興趣的可以了解一下
    2023-10-10
  • docker安裝kong網(wǎng)關(guān)的方法示例

    docker安裝kong網(wǎng)關(guān)的方法示例

    這篇文章主要介紹了docker安裝kong網(wǎng)關(guān)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • 云原生之使用Docker部署homer靜態(tài)主頁的方法步驟

    云原生之使用Docker部署homer靜態(tài)主頁的方法步驟

    本文主要介紹了云原生之使用Docker部署homer靜態(tài)主頁的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • 詳解Centos7 下建立 Docker 橋接網(wǎng)絡(luò)

    詳解Centos7 下建立 Docker 橋接網(wǎng)絡(luò)

    本篇文章主要介紹了詳解Centos7 下建立 Docker 橋接網(wǎng)絡(luò),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01

最新評論