您好,登錄后才能下訂單哦!
最近在學習Kafka
,準備測試集群狀態的時候感覺無論是開三臺虛擬機或者在一臺虛擬機開辟三個不同的端口號都太麻煩了(嗯。。主要是懶)。
環境準備
一臺可以上網且有CentOS7虛擬機的電腦
為什么使用虛擬機?因為使用的筆記本,所以每次連接網絡IP都會改變,還要總是修改配置文件的,過于繁瑣,不方便測試。(通過Docker虛擬網絡的方式可以避免此問題,當時實驗的時候沒有了解到)
Docker 安裝
如果已經安裝Docker請忽略此步驟
yum安裝
Docker 要求 CentOS 系統的內核版本高于 3.10 ,查看上文的前提條件來驗證你的CentOS 版本是否支持 Docker 。
# 查看內核版本 $ uname -a
#安裝 Docker $ yum -y install docker
#啟動 Docker 后臺服務 $ service docker start
# 由于本地沒有hello-world這個鏡像,所以會下載一個hello-world的鏡像,并在容器內運行。 $ docker run hello-world
腳本安裝
使用 sudo 或 root 權限登錄 Centos。
確保 yum 包更新到最新。
$ sudo yum update
獲取并執行 Docker 安裝腳本。
$ curl -fsSL https://get.docker.com -o get-docker.sh # 執行這個腳本會添加 docker.repo 源并安裝 Docker。 $ sudo sh get-docker.sh
啟動Docker
$ sudo systemctl start docker
# 驗證 docker 是否安裝成功并在容器中執行一個測試的鏡像。 $ sudo docker run hello-world $ docker ps
鏡像加速
開始讓我配置國內鏡像源的時候我是拒絕的,但是使用之后發現那下載速度 duang~
的一下就上去了。所以強烈建議大家配置國內鏡像源。
打開/創建 /etc/docker/daemon.json
文件,添加以下內容:
{ "registry-mirrors": ["http://hub-mirror.c.163.com"] }
Zookeeper集群搭建
Zookeeper鏡像:zookeeper:3.4
鏡像準備
$ docker pull zookeeper:3.4
查找鏡像可以去 https://hub.docker.com/
docker pull images:TAG // 代表拉取 TAG
版本的 image
鏡像
建立獨立Zookeeper容器
我們首先用最簡單的方式創建一個獨立的Zookeeper
節點,然后我們根據這個例子創建出其他的節點。
$ docker run --name zookeeper -p 2181:2181 -d zookeeper:3.4
默認的,容器內配置文件在, /conf/zoo.cfg
,數據和日志目錄默認在 /data
和 /datalog
,需要的話可以將上述目錄映射到宿主機。
參數解釋
--name:指定容器名字
-p:為容器暴露出來的端口分配端口號
-d:在后臺運行容器并打印容器ID
集群搭建
其它節點的Zookeeper
容器創建方式與創建獨立容器類似,需要注意的是,要分別指定節點的id
和修改文件中多節點的配置,相應的創建命令如下:
新建docker網絡
$ 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
這種方式雖然也實現了我們想要的,但是步驟過于繁瑣,而且維護起來麻煩(懶癌晚期),所以我們使用 docker-compose
的方式來實現。
docker-compose 搭建zookeeper集群
新建docker網絡
$ 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 # 賦予執行權限 $chmod +x /usr/local/bin/docker-compose
任意目錄下新建 docker-compose.yml
文件,復制以下內容
執行命令 docker-compose up -d
命令對照
|命令|解釋|
|-|-|
|docker-compose up|啟動所有容器|
|docker-compose up -d|后臺啟動并運行所有容器|
|docker-compose up --no-recreate -d|不重新創建已經停止的容器|
|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 # 當發生錯誤時自動重啟 hostname: zoo1 container_name: zoo1 privileged: true ports: # 端口 - 2181:2181 volumes: # 掛載數據卷 - ./zoo1/data:/data - ./zoo1/datalog:/datalog environment: TZ: Asia/Shanghai ZOO_MY_ID: 1 # 節點ID ZOO_PORT: 2181 # zookeeper端口號 ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 # zookeeper節點列表 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
集群就已經搭建好了
Kafka集群搭建
有了上面的基礎,再去搞Kafka
集群還是問題嗎?其實就是幾個變量值不同而已。
有了上邊的例子,就不費勁去搞單節點的Kafka
了,直接使用docker-compose
的方式,部署三個節點,其實方式大同小異,上邊也說到,其實就是一些屬性不同而已;這時候我們就不需要再去新建 Docker 網絡了,直接使用前邊搭建 Zookeeper
集群時創建的網絡即可!
環境準備
Kafka鏡像:wurstmeister/kafka
Kafka-Manager鏡像:sheepkiller/kafka-manager
# 不指定版本默認拉取最新版本的鏡像 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 # 賦予執行權限 $chmod +x /usr/local/bin/docker-compose
任意目錄下新建 docker-compose.yml
文件,復制以下內容
執行命令 docker-compose up -d
命令對照
|命令|解釋|
|-|-|-|
|docker-compose up|啟動所有容器|
|docker-compose up -d|后臺啟動并運行所有容器|
|docker-compose up --no-recreate -d|不重新創建已經停止的容器|
|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: 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文件創建的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: # 使用已創建的網絡 name: zoo_kafka
驗證
我們打開kafka-manager
的管理頁面,訪問路徑是,宿主機ip:9000;
如果所示,填寫上Zookeeper
集群的地址,劃到最下邊點擊save
點擊剛剛添加的集群,可以看到,集群中有三個節點
搭建過程中遇到的問題
掛載數據卷無限重啟,查看log
提示:chown: changing ownership of ‘/var/lib/mysql/....‘: Permission denied
解決方式:
kafka-manager報jmx相關錯誤,
解決方法:
[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) # 查看容器內部日志 $ docker logs -f <容器ID> # 進入容器內部 $ docker exec -it <容器ID> /bin/basj # 創建容器 -d代表后臺啟動 docker run --name <容器名稱> -e <參數> -v <掛載數據卷> <容器ID> # 重啟容器 docker restart <容器ID> # 關閉容器 docker stop <容器id> # 運行容器 docker start <容器id>
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。