Zookeeper的安裝
簡介
ZK的部署主要有三種方式:一,單機版;二,僞集羣;三,集羣部署。
- 單機模式:宕機導致服務不可用(單點問題)。
- 僞集羣模式:在同一臺機器中,使用不同端口模仿不同服務器的部署方式;多用於演示功能,實際生產中仍然存在單機模式的問題。
- 集羣模式:實現了ZK服務的高可用,節點宕機不影響整個服務的運行(宕機節點數小於半數)。注意事項:ZK節點數最佳爲大於等於3的奇數,且節點數不易過多,過多節點情況下,選舉與數據同步會影響ZK整個服務的性能。
原因參見:道人的上一篇文章ZK的基本原理
安裝部署
這裏推薦ZK的安裝版本在3.5版本以下(例3.4.14就可以),3.5版本集羣部署的時候有坑,總是部署失敗,有哪位大神可以給道人解釋下這是什麼原因嗎?
道人介紹下兩種常見的安裝部署方式,一:常規部署;二:Docker部署。
一:常規部署
(1)單機模式
ZK的下載地址 :http://mirrors.hust.edu.cn/apache/zookeeper/
傳輸文件到服務器
sftp:/floatuse> put D:\download\chrome\zookeeper-3.4.14.tar.gz /floatuse
sftp: C:\Users\15939\Documents\NetSarang Computer\6\Xshell\Sessions\/floatuse does not exist
Uploading zookeeper-3.4.14.tar.gz to remote:/floatuse/zookeeper-3.4.14.tar.gz
sftp:/floatuse> /sec
[root@localhost floatuse]# ls
test01 test02 zookeeper-3.4.14.tar.gz
// 解壓縮
[root@localhost floatuse]# tar -zxvf zookeeper-3.4.14.tar.gz
[root@localhost floatuse]# ls
test01 test02 zookeeper-3.4.14 zookeeper-3.4.14.tar.gz
// 進入config目錄下,將zoo_sample.cfg改爲zoo.cfg
[root@localhost zookeeper-3.4.14]# cd conf/
[root@localhost conf]# ls
configuration.xsl log4j.properties zoo_sample.cfg
[root@localhost conf]# mv zoo_sample.cfg zoo.cfg
[root@localhost conf]# ls
configuration.xsl log4j.properties zoo.cfg
zoo.cfg配置文件參數說明
修改部分:
- dataDir=/floatuse/zookeeper/data
- dataLogDir=/floatuse/zookeeper/dataLog
- 端口 clientPort=2191
[root@localhost conf]# vi zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/floatuse/zookeeper/data
dataLogDir=/floatuse/zookeeper/dataLog
# the port at which the clients will connect
clientPort=2191
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
參數說明
- tickTime:這個時間是作爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
- dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏。(道人這裏修改了路徑)
- dataLogDir:顧名思義就是Zookeeper 保存日誌文件的目錄(道人這裏修改了路徑)。
- clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。(默認端口爲2181,由於道人該臺虛機上,啓動了zk容器[做了接口映射],所以修改爲2191)
// 啓動服務
[root@localhost zookeeper-3.4.14]# ./bin/zkServer.sh
// 連接客戶端
[root@localhost zookeeper-3.4.14]# ./bin/zkCli.sh
...
// 添加了一個Znode
[zk: localhost:2181(CONNECTED) 3] create /tusan 'tusanhonghong'
Created /tusan
[zk: localhost:2181(CONNECTED) 4] ls /
[zookeeper, tusan]
(2)集羣模式
提供的服務器(虛機)有 :192.168.32.134;192.168.32.135;192.168.32.136三臺虛機,這裏部署一個三臺機器的ZK集羣。
與單機版部署有以下不同
- 需要設置服務器編號,即zoo.cfg配置文件中dataDir配置的路徑下,myid文件中的值。(其實就是道人上篇文章中講到的節點Zxid–決定了那臺服務器被選爲Leader)。
[root@localhost data]# touch myid
[root@localhost data]# ls
myid
[root@localhost data]# vi myid
2
- 節點需要進行相同的配置(配置文件),zoo.cfg中需配置服務器節點路徑
tickTime=2000
dataDir=/floatuse/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=192.168.32.134:2888:3888
server.2=192.168.32.135:2888:3888
server.3=192.168.32.136:2888:3888
- 最後就是啓動對應的ZK服務,並查看ZK節點狀態(Leader,Follower)。
二:Docker部署
(1)單機模式
部署操作如下:
// 拉取鏡像
[root@localhost ~]# docker pull zookeeper:3.4.14
// 查看鏡像是否pull成功
[root@localhost ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/zookeeper 3.4.14 0ef24c507074 9 days ago 257 MB
docker.io/zookeeper latest f0f71453dc64 13 days ago 252 MB
docker.io/rabbitmq 3-management 5537c2a8f7c5 4 weeks ago 184 MB
docker.io/mysql 5.7 273c7fcf9499 5 weeks ago 455 MB
docker.io/mysql 8 8e8c6f8dc9df 5 weeks ago 546 MB
docker.io/tomcat 8.5.54-jdk8 31a47677561a 5 weeks ago 529 MB
docker.io/tomcat jdk8 31a47677561a 5 weeks ago 529 MB
// 運行容器(命令含義道人會在後續Docker的文章中講到)
[root@localhost ~]# docker run -d -p 2181:2181 --name some-zookeeper --restart always 0ef24c507074
// 查看運行中的容器及其狀態
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3e7c63ec3c4 0ef24c507074 "/docker-entrypoin..." About a minute ago Up About a minute 2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp some-zookeeper
// 進入容器
[root@localhost ~]# docker exec -it d3e7c63ec3c4 bash
// 打開客戶端
root@d3e7c63ec3c4:/zookeeper-3.4.14# ./bin/zkCli.sh
...
...
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
// 查看節點信息
ls /
[zookeeper]
(2)集羣模式
提供的服務器(虛機)有 :192.168.32.134;192.168.32.135;192.168.32.136三臺虛機,這裏部署一個三臺機器的ZK集羣。
有兩種部署方式,一:依次創建並運行ZK容器;二:使用docker-compose插件部署ZK集羣。
依次運行容器,使用-link關聯集羣中節點
[root@localhost ~]# docker run -d -p 2181:2181 --name zookeeper_node1 --privileged --restart always --network zoonet --ip 192.168.32.134 \
> -v /floatuse/zookeeper/node1/volumes/data:/data \
> -v /floatuse/zookeeper/node1/volumes/datalog:/datalog \
> -v /floatuse/zookeeper/node1/volumes/logs:/logs \
> -e ZOO_MY_ID=1 \
> -e "ZOO_SERVERS=server.1=192.168.32.134:2888:3888;2181 server.2=192.168.32.135:2888:3888;2181 server.3=192.168.32.136:2888:3888;2181" 3487af26dee9
7cf11fab2d3b4da6d8ce48d8ed4a7beaab7d51dd542b8309f781e9920c36
[root@localhost ~]# docker run -d -p 2182:2181 --name zookeeper_node2 --privileged --restart always --network zoonet --ip 192.168.32.135 \
> -v /floatuse/zookeeper/node2/volumes/data:/data \
> -v /floatuse/zookeeper/node2/volumes/datalog:/datalog \
> -v /floatuse/zookeeper/node2/volumes/logs:/logs \
> -e ZOO_MY_ID=2 \
> -e "ZOO_SERVERS=server.1=192.168.32.134:2888:3888;2181 server.2=192.168.32.135:2888:3888;2181 server.3=192.168.32.136:2888:3888;2181" 3487af26dee9
a4dbfb694504acfe4b8e11b990877964477bb41f8a230bd191cba7d20996f
[root@localhost ~]# docker run -d -p 2183:2181 --name zookeeper_node3 --privileged --restart always --network zoonet --ip 192.168.32.136 \
> -v /floatuse/zookeeper/node3/volumes/data:/data \
> -v /floatuse/zookeeper/node3/volumes/datalog:/datalog \
> -v /floatuse/zookeeper/node3/volumes/logs:/logs \
> -e ZOO_MY_ID=3 \
> -e "ZOO_SERVERS=server.1=192.168.32.134:2888:3888;2181 server.2=192.168.32.135:2888:3888;2181 server.3=192.168.32.136:2888:3888;2181" 3487af26dee9
b9ae9adf86e9c7f6a3264f883206c6d0e4f6093db3200de80ef39f57160
// 查看容器
[root@localhost ~]# docker ps
docker-compose部署
首先安裝插件
[root@localhost ~]# curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
注意:這裏需要注意下Docker與compose的版本是否匹配
新建網絡
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/25 --gateway 192.168.0.1 zoo_network
docker-compose.yaml文件編輯
[root@localhost zookeeper]# vi docker-compose.yml
version: '3.1'
services:
zoo1:
image: zookeeper:3.4.14
restart: always
privileged: true
hostname: zoo1
ports:
- 2181:2181
volumes: # 掛載數據
- /usr/local/zookeeper-cluster/node1/data:/data
- /usr/local/zookeeper-cluster/node1/datalog:/datalog
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
networks:
default:
ipv4_address: 192.168.32.134
zoo2:
image: zookeeper:3.4.14
restart: always
privileged: true
hostname: zoo2
ports:
- 2182:2181
volumes: # 掛載數據
- /usr/local/zookeeper-cluster/node2/data:/data
- /usr/local/zookeeper-cluster/node2/datalog:/datalog
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
networks:
default:
ipv4_address: 192.168.32.135
zoo3:
image: zookeeper:3.4.14
restart: always
privileged: true
hostname: zoo3
ports:
- 2183:2181
volumes: # 掛載數據
- /usr/local/zookeeper-cluster/node3/data:/data
- /usr/local/zookeeper-cluster/node3/datalog:/datalog
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181
server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
networks:
default:
ipv4_address: 192.168.32.136
networks: # 自定義網絡
default:
external:
name: zoo_network
使用docker-compose啓動集羣
[root@localhost ~]# docker-compose -f docker-compose.yml up -d
都看到這了,道友們如果覺得有幫助,點個讚唄!