Zookeeper(三):單機版與集羣安裝(Docker版)

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

都看到這了,道友們如果覺得有幫助,點個讚唄!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章