Zookeeper系列:基於 Docker 安裝 Zookeeper(三)


Zookeeper系列:基於 Docker 安裝 Zookeeper(三)


概述

Zookeeper 部署有三種方式,單機模式、集群模式、偽集群模式,以下采用 Docker 的方式部署

注意: 集群為大於等於3個奇數,如 3、5、7,不宜太多,集群機器多了選舉和數據同步耗時長,不穩定。

單機模式

docker-compose.yml

<code>version: '3.1'services:    zoo1:        image: zookeeper        restart: always        hostname: zoo1        ports:            - 2181:2181        environment:            ZOO_MY_ID: 1            ZOO_SERVERS: server.1=zoo1:2888:3888/<code>

驗證是否安裝成功

  • 以交互的方式進入容器
<code>docker exec -it zookeeper_zoo1_1 /bin/bash/<code>
  • 使用客戶端連接到服務端
<code>bash-4.3# ./bin/zkCli.sh -server 192.168.75.130:2181Connecting to 192.168.75.130:21812017-11-09 07:45:58,365 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT2017-11-09 07:45:58,374 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=zoo12017-11-09 07:45:58,374 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_1312017-11-09 07:45:58,380 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation2017-11-09 07:45:58,381 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/usr/lib/jvm/java-1.8-openjdk/jre2017-11-09 07:45:58,381 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/zookeeper-3.4.10/bin/../build/classes:/zookeeper-3.4.10/bin/../build/lib/*.jar:/zookeeper-3.4.10/bin/../lib/slf4j-log4j12-1.6.1.jar:/zookeeper-3.4.10/bin/../lib/slf4j-api-1.6.1.jar:/zookeeper-3.4.10/bin/../lib/netty-3.10.5.Final.jar:/zookeeper-3.4.10/bin/../lib/log4j-1.2.16.jar:/zookeeper-3.4.10/bin/../lib/jline-0.9.94.jar:/zookeeper-3.4.10/bin/../zookeeper-3.4.10.jar:/zookeeper-3.4.10/bin/../src/java/lib/*.jar:/conf:2017-11-09 07:45:58,381 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64:/usr/lib/jvm/java-1.8-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib2017-11-09 07:45:58,381 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/tmp2017-11-09 07:45:58,381 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=2017-11-09 07:45:58,381 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Linux2017-11-09 07:45:58,382 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=amd642017-11-09 07:45:58,382 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=4.4.0-98-generic2017-11-09 07:45:58,386 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=root2017-11-09 07:45:58,386 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/root2017-11-09 07:45:58,386 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/zookeeper-3.4.102017-11-09 07:45:58,389 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.75.130:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@3eb07fd32017-11-09 07:45:58,428 [myid:] - INFO  [main-SendThread(192.168.75.130:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server 192.168.75.130/192.168.75.130:2181\\. Will not attempt to authenticate using SASL (unknown error)Welcome to ZooKeeper!JLine support is enabled2017-11-09 07:45:58,529 [myid:] - INFO  [main-SendThread(192.168.75.130:2181):ClientCnxn$SendThread@876] - Socket connection established to 192.168.75.130/192.168.75.130:2181, initiating session[zk: 192.168.75.130:2181(CONNECTING) 0] 2017-11-09 07:45:58,573 [myid:] - INFO  [main-SendThread(192.168.75.130:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server 192.168.75.130/192.168.75.130:2181, sessionid = 0x15f9fbc12ec0000, negotiated timeout = 30000WATCHER::WatchedEvent state:SyncConnected type:None path:null/<code>
  • 使用服務端工具檢查服務器狀態
<code>bash-4.3# ./bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgMode: standalone/<code>

集群模式

準備 3 臺 Ubuntu Server 系統,並分別配置 Zookeeper

第一臺主機

docker-compose.yml

<code>version: '3.1'services:    zoo1:        image: zookeeper        restart: always        environment:            ZOO_MY_ID: 1            ZOO_SERVERS: server.1=192.168.75.130:2888:3888 server.2=192.168.75.134:2888:3888 server.3=192.168.75.135:2888:3888        network_mode: host/<code>

驗證測試

<code>root@UbuntuBase:/usr/local/docker/zookeeper# docker exec -it zookeeper_zoo1_1 /bin/bashbash-4.3# ./bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgMode: leader/<code>

第二臺主機

docker-compose.yml

<code>version: '3.1'services:    zoo2:        image: zookeeper        restart: always        environment:            ZOO_MY_ID: 2            ZOO_SERVERS: server.1=192.168.75.130:2888:3888 server.2=192.168.75.134:2888:3888 server.3=192.168.75.135:2888:3888        network_mode: host/<code>

驗證測試

<code>root@UbuntuBase:/usr/local/docker/zookeeper# docker exec -it zookeeper_zoo2_1 /bin/bashbash-4.3# ./bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgMode: follower/<code>

第三臺主機

docker-compose.yml

<code>version: '3.1'services:    zoo3:        image: zookeeper        restart: always        environment:            ZOO_MY_ID: 3            ZOO_SERVERS: server.1=192.168.75.130:2888:3888 server.2=192.168.75.134:2888:3888 server.3=192.168.75.135:2888:3888        network_mode: host/<code>

驗證測試

<code>root@UbuntuBase:/usr/local/docker/zookeeper# docker exec -it zookeeper_zoo3_1 /bin/bashbash-4.3# ./bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgMode: follower/<code>

偽集群模式

最新版本的zookeeper安裝有問題,所以使用zookeeper:3.4.14

目錄結構

<code>-zookeeper    -docker-compose.yml    -zoo1        -data        -datalog    -zoo2        -data        -datalog    -zoo3        -data        -datalog/<code> 

docker-compose.yml

<code>version: '3.1'services:  zoo1:    image: zookeeper:3.4.14    restart: always    hostname: zoo1    container_name: zookeeper_1    #domainname:     ports:      - 2181:2181    volumes:      - ./zookeeper/zoo1/data:/data      - ./zookeeper/zoo1/datalog:/datalog    environment:      ZOO_MY_ID: 1      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888  zoo2:    image: zookeeper:3.4.14    restart: always    hostname: zoo2    container_name: zookeeper_2    ports:      - 2182:2181    volumes:      - ./zookeeper/zoo2/data:/data      - ./zookeeper/zoo2/datalog:/datalog    environment:      ZOO_MY_ID: 2      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888  zoo3:    image: zookeeper:3.4.14    restart: always    hostname: zoo3    container_name: zookeeper_3    ports:      - 2183:2181    volumes:      - ./zookeeper/zoo3/data:/data      - ./zookeeper/zoo3/datalog:/datalog    environment:      ZOO_MY_ID: 3      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888/<code>

驗證是否安裝成功

  • 分別以交互方式進入容器查看
<code>docker exec -it zookeeper_zoo1_1 /bin/bash/<code>
<code>docker exec -it zookeeper_zoo2_1 /bin/bash/<code>
<code>docker exec -it zookeeper_zoo3_1 /bin/bash/<code>
  • 使用服務端工具檢查服務器狀態
<code>root@UbuntuBase:/usr/local/docker/zookeeper# docker exec -it zookeeper_zoo1_1 /bin/bashbash-4.3# ./bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgMode: follower/<code>
<code>root@UbuntuBase:/usr/local/docker/zookeeper# docker exec -it zookeeper_zoo2_1 /bin/bashbash-4.3# ./bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgMode: follower/<code>
<code>root@UbuntuBase:/usr/local/docker/zookeeper# docker exec -it zookeeper_zoo3_1 /bin/bashbash-4.3# ./bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgMode: leader/<code>

從上面的驗證結果可以看出:zoo1 為跟隨者,zoo2 為跟隨者,zoo3 為領導者

Zookeeper 配置說明

Zookeeper 的三種端口號

  • 2181:客戶端連接 Zookeeper 集群使用的監聽端口號
  • 3888:選舉 leader 使用
  • 2888:集群內機器通訊使用(Leader 和 Follower 之間數據同步使用的端口號,Leader 監聽此端口)

Zookeeper 集群模式配置文件

配置文件路徑:/conf/zoo.cfg

<code>clientPort=2181dataDir=/datadataLogDir=/datalogtickTime=2000initLimit=5syncLimit=2autopurge.snapRetainCount=3autopurge.purgeInterval=0maxClientCnxns=60server.1=192.168.0.1:2888:3888server.2=192.168.0.2:2888:3888server.3=192.168.0.3:2888:3888/<code>
  • clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
  • dataDir:Zookeeper 保存數據的目錄。
  • dataLogDir:Zookeeper 保存日誌的目錄。
  • tickTime:這個時間是作為 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每隔 tickTime 時間就會發送一個心跳。
  • initLimit:配置 Zookeeper 接受客戶端(這裡所說的客戶端不是用戶連接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集群中連接到 Leader 的 Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 initLimit(默認為 10) 個心跳的時間(也就是 tickTime)長度後 Zookeeper 服務器還沒有收到客戶端的返回信息,那麼表明這個客戶端連接失敗。總的時間長度就是 5 * 2000 = 10 秒
  • syncLimit:配置 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2 * 2000 = 4 秒
  • 定時清理(Zookeeper 從 3.4.0 開始提供了自動清理快照和事務日誌的功能)以下兩個參數配合使用:autopurge.purgeInterval:指定了清理頻率,單位是小時,需要填寫一個 1 或更大的整數,默認是 0,表示不開啟自己清理功能。autopurge.snapRetainCount:指定了需要保留的文件數目。默認是保留 3 個。
  • maxClientCnxns:限制連接到 Zookeeper 的客戶端的數量,限制併發連接的數量,它通過 IP 來區分不同的客戶端。此配置選項可以用來阻止某些類別的 Dos 攻擊。將它設置為 0 或者忽略而不進行設置將會取消對併發連接的限制。
  • server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器。B 是這個服務器的 IP 地址。C 表示的是這個服務器與集群中的 Leader 服務器交換信息的端口(2888);D 表示的是萬一集群中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通信的端口(3888)。如果是偽集群的配置方式,由於 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。

注意: server.A 中的 A 是在 dataDir 配置的目錄中創建一個名為 myid 的文件裡的值(如:1)

Zookeeper 常用命令

zkServer

  • 啟動服務
<code>./zkServer.sh start/<code>
  • 停止服務
<code>./zkServer.sh stop/<code>
  • 重啟服務
<code>./zkServer.sh restart/<code>
  • 執行狀態
<code>./zkServer.sh status/<code>

zkClient

  • 客戶端連接服務器並進入 Bash 模式
<code>./zkCli.sh -server :<port># 命令參數ZooKeeper -server host:port cmd args    stat path [watch]    set path data [version]    ls path [watch]    delquota [-n|-b] path    ls2 path [watch]    setAcl path acl    setquota -n|-b val path    history     redo cmdno    printwatches on|off    delete path [version]    sync path    listquota path    rmr path    get path [watch]    create [-s] [-e] path data acl    addauth scheme auth    quit     getAcl path    close     connect host:port/<port>/<code>
  • 創建節點(Bash 模式)
<code>create /test "hello zookeeper"/<code>
  • 查詢節點(Bash 模式)
<code>get /test# 輸出如下Hello ZookeepercZxid = 0x100000004ctime = Fri Oct 19 05:11:47 GMT 2018mZxid = 0x100000004mtime = Fri Oct 19 05:11:47 GMT 2018pZxid = 0x100000004cversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 15numChildren = 0/<code>
  • 刪除節點(Bash 模式)
<code>delete /test/<code>


分享到:


相關文章: