172.22.12.20 | 172.22.12.21 | 172.22.12.22 | 172.22.12.23 | 172.22.12.24 |
---|---|---|---|---|
zoo1:2181 | zoo2:2182 | zoo3:2183 | zkui:9090 (admin/manager) | |
kafka1:9092 | kafka2:9092 | kafka3:9092 | kafdrop:9000 | |
influxdb:8086 | grafana:3000 (admin/chanhu) | |||
storm-nimbus1 | storm-nimbus2 | storm-nimbus3 | portainer:9002(admin/chanhu@123) | |
storm-supervisor1 | storm-supervisor2 | storm-supervisor3 | ||
storm-ui:8080 |
docker安裝
yum update -y yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce docker-ce-cli containerd.io systemctl start docker
docker-compose安裝
yum install epel-release yum install -y python-pip pip install --upgrade pip pip install docker-compose
修改每一臺宿主機的hosts文件
vim /etc/hosts 172.22.12.20 datacloud0 172.22.12.21 datacloud1 172.22.12.22 datacloud2 172.22.12.23 datacloud3 172.22.12.24 datacloud4
zookeeper集群
在20,21,22三臺機器部署zk集群,分別編寫docker-compose文件
集群中如果只剩一臺是正常運行的,則集群失效
以其中一臺為例:
zoo: image: zookeeper:3.4.14 restart: always hostname: zoo1 container_name: zoo1 ports: - 2181:2181 - 2888:2888 - 3888:3888 volumes: - "./zoo/data:/data" - "./zoo/datalog:/datalog" environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=172.22.12.21:2888:3888 server.3=172.22.12.22:2888:3888
"./zoo/data:/data"為數(shù)據(jù)目錄掛載,必須配置
環(huán)境變量配置, ZOO_MY_ID 三臺分別是1、2、3, ZOO_SERVERS 配置的是集群地址,其中當前機器為0.0.0.0
kakfa集群
在20,21,22三臺機器部署kafka集群,分別編寫docker-compose文件(可以和zk的docker-compose文件寫在一起)
以其中一臺為例:
kafka: image: wurstmeister/kafka:2.12-2.2.2 restart: always hostname: kafka1 container_name: kafka1 ports: - "9092:9092" environment: KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://172.22.12.20:9092 KAFKA_ADVERTISED_HOST_NAME: 172.22.12.20 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: 172.22.12.20:2181,172.22.12.21:2181,172.22.12.22:2181 volumes: - ./kafka/logs:/kafka
沒有太多需要注意的地方, KAFKA_ZOOKEEPER_CONNECT 正確配置好zk集群地址,還有ADVERTISED相關(guān)配置為當前容器。
influxdb
influxdb: image: influxdb:1.7 restart: always container_name: influxdb ports: - "2003:2003" - "8086:8086" - "8089:8089" - "8091:8091" volumes: - "./influxdb:/var/lib/influxdb" environment: - INFLUXDB_GRAPHITE_ENABLED=true
"./influxdb:/var/lib/influxdb"為數(shù)據(jù)目錄掛載, 必須配置 。INFLUXDB_GRAPHITE_ENABLED啟動graphite功能。
influxdb簡單操作:
docker-compose相關(guān)操作
docker-compose [-f <文件名>] up -d docker-compose [-f <文件名>] down
zkui/kafdrop/grafana
在23機器上,部署這三個web界面:
zkui: image: maauso/zkui restart: always container_name: zkui ports: - 9090:9090 environment: ZKLIST: 172.22.12.20:2181,172.22.12.21:2181,172.22.12.22:2181 kafdrop: image: obsidiandynamics/kafdrop:latest restart: always container_name: kafdrop ports: - "9000:9000" environment: KAFKA_BROKERCONNECT: 172.22.12.20:9092,172.22.12.20:9092,172.22.12.20:9092 grafana: image: grafana/grafana:master restart: always container_name: grafana ports: - "3000:3000" volumes: - "./grafana:/var/lib/grafana"
因為是web頁面,配置好相關(guān)服務(wù)地址,啟動就行了
其中g(shù)rafana需要配置目錄掛載,主要是記錄自定義的數(shù)據(jù)源和面板配置等(這里需要chmod -R 777 grafana/)
storm集群
storm集群由 nimbus、supervisor、ui 三部分組成
nimbus為主節(jié)點,supervisor為從節(jié)點,前者將任務(wù)發(fā)到zookeeper上,后者到zookeeper上獲取任務(wù)。ui為web頁面。
20、21、22三臺機器分別部署nimbus和supervisor節(jié)點各三個,且建議單獨建立docker-compose腳本文件,在zookeeper啟動后執(zhí)行。
docker-compose腳本大致如下:
nimbus: image: storm:2.2.0 container_name: nimbus1 command: storm nimbus restart: always hostname: nimbus1 ports: - 6627:6627 volumes: - "./storm.yaml:/conf/storm.yaml" - "./nimbus/data:/data" - "./nimbus/logs:/logs" supervisor: image: storm:2.2.0 container_name: supervisor1 command: storm supervisor hostname: supervisor1 depends_on: - nimbus links: - nimbus:nimbus restart: always volumes: - "./storm.yaml:/conf/storm.yaml" - "./supervisor/data:/data" - "./supervisor/logs:/logs"
nimbus、supervisor、ui都是使用同一個storm鏡像,只是啟動參數(shù)時command不同。
這里指定nimbus和supervisor的hostname,原因是默認情況下它們注冊到zookeeper時的host為docker容器隨機生成的uuid,
如果nimbus和supervisor重啟了,其容器uuid也會重置,這時就和zookeeper中已經(jīng)保存的uuid沖突,發(fā)生錯誤。
網(wǎng)上的方案是:1.停掉storm集群后刪除zookeeper上的storm節(jié)點并重啟zookeeper+storm集群;2.單獨建一個無狀態(tài)的zookeeper來給storm集群使用
這里采取的方案是指定nimbus和supervisor注冊時的host,其重啟時不會產(chǎn)生變化
啟動時需要指定一些環(huán)境變量,這里采用本地配置文件映射的方式,storm.yaml配置如下:
storm.zookeeper.servers: - "172.22.12.20" - "172.22.12.21" - "172.22.12.22" nimbus.seeds: - "nimbus1" - "nimbus2" - "nimbus3" storm.log.dir: "/logs" storm.local.dir: "/data" storm.cluster.mode: distributed
storm.zookeeper.servers為zookeeper地址,默認取端口2181。nimbus.seeds為nimbus集群地址,這里取docker-compose中自定義的hostname。
storm-ui啟動單例即可,docker-compose配置如下:
storm-ui: image: storm:2.2.0 container_name: storm-ui command: storm ui depends_on: - nimbus links: - nimbus:nimbus restart: always ports: - 8080:8080 volumes: - "./storm.yaml:/conf/storm.yaml" - "./ui/data:/data" - "./ui/logs:/logs" extra_hosts: - "nimbus1:172.22.12.20" - "nimbus2:172.22.12.21" - "nimbus3:172.22.12.22" - "supervisor1:172.22.12.20" - "supervisor2:172.22.12.21" - "supervisor3:172.22.12.22"
其中 extra_hosts 為容器啟動后自定義的host映射,這樣ui頁面啟動后才能通過注冊上來的別名host對應(yīng)到真正的ip地址。
部署docker容器時經(jīng)常會遇到需要映射宿主機的配置文件到容器里,這樣容器重啟后配置就不會重置。
比如storm配置:- "./storm.yaml:/conf/storm.yaml" 但是映射后如果本地沒有正確格式的storm.yaml就會啟動失敗,除了去官網(wǎng)下載安裝包拿到其配置文件以外,可以先啟動一個臨時容器并拷貝其配置文件到宿主機。
docker run -d --name nimbus-tmp storm:2.2.0 storm nimbus
docker cp nimbus-tmp:/conf/storm.yaml 本地文件夾路徑/
canal部署
canal部署前需要對其要連接的mysql做相應(yīng)配置:
[mysqld] log-bin=mysql-bin # 開啟 binlog binlog-format=ROW # 選擇 ROW 模式 server_id=1 # 配置 MySQL replaction 需要定義,不要和 canal 的 slaveId 重復(fù)
canal的docker-compose配置如下:
canal-server: image: canal/canal-server:v1.1.3 container_name: canal-server ports: - 11111:11111 environment: - canal.instance.mysql.slaveId=12 - canal.auto.scan=false - canal.destinations=datacloud - canal.instance.master.address=10.23.16.32:3307 - canal.instance.dbUsername=root - canal.instance.dbPassword=chinaunicom@dengfy - canal.instance.filter.regex=river\\..* volumes: - ./canal-server/logs/:/admin/canal-server/logs/
其中 slaveId 需要和mysql中配置不同, destinations 為自定義的實例名, canal.instance.filter.regex 為需要監(jiān)控的數(shù)據(jù)庫表過濾。
portainer部署
portainer時docker容器的可視化管理工具,可以管理上述的幾臺機器的docker容器,查看日志,修改啟動腳本,停止容器等。
首先要對每一臺機器開啟docker api接口:
1.vim /usr/lib/systemd/system/docker.service
在ExecStart啟動項添加-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
2.重啟docker服務(wù) systemctl daemon-reload systemctl restart docker
在其中一臺機器上部署portainer容器:
portainer: image: portainer/portainer:1.24.1 restart: always container_name: portainer_datacloud ports: - "8000:8000" - "9002:9000" volumes: - "./portainer/data:/data" - "/var/run/docker.sock:/var/run/docker.sock"
"/var/run/docker.sock:/var/run/docker.sock" 此條映射關(guān)系是單機模式下使用,我們采用的是遠程api調(diào)用,因此可以不加。
打開ip:9002后,注冊用戶登錄,settings>endpoints>Add endpoint>選擇docker方式。
其中Endpoint URL填寫目標ip:2375,Public IP添加目標ip,提交后即可看到其所有容器信息。
到此這篇關(guān)于docker-compose部署zk+kafka+storm集群的實現(xiàn)的文章就介紹到這了,更多相關(guān)docker compose部署集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!