用 ZooKeeper 搭建一个集群

Zookeeper 官网Overview 部分有对 Zookeeper 的概述.

下面是一些我学习 zookeeper 的笔记, 内容不在乎全面, 而在乎精简.

Zookeeper 简介

Zookeeper 是一个开源的, 用于 分布式应用 的 分布式协调服务.(A Distributed Coordination Service for Distributed Applications).

Zookeeper 的 数据模型(Data model) 是 层次的命名空间(the hierarchical namespace). 就像文件系统中的结构一样.
ZooKeeper’s Hierarchical Namespace:
zkNamespace

Zookeeper 的安装方法和 Maven 类似(都是下载压缩包解压), 可以从这里下载一个压缩包. Zookeeper 使用的命令都在解压后的 /bin 目录下. 把 /bin 添加到 PATH 中, 即可全局使用 Zookeeper 的命令.

Zookeeper 有两种模式: standalone mode(单机模式)replicated mode.

standalone mode 仅用于测试环境, standalone mode 下, Zookeeper 配置文件只需要配置下面 3 项即可完成对 Zookeeper 的配置:

# Zookeeper的基本时间单位. tickTime的值的单位是毫秒
tickTime=2000
# 存放 in-memory database snapshots 的地方
dataDir=/var/lib/zookeeper
# 监听客户端连接的端口
clientPort=2181

启动 Zookeeper:

zkServer.sh start

通过客户端连接的 Zookeeper server:

zkCli.sh -server 127.0.0.1:2181

连接上 Zookeeper 服务后, 可以通过 help 命令查看 Zookeeper 客户端可以执行的命令.

2 搭建一个 Zookeeper 集群(ensemble/cluster)

为方便测试, 把 3 个Zookeeper 服务都部署在同一个主机上(因为我只有一个主机).
生产环境应该给每个 Zookeeper 结点分配一个单独的机器, 这样可靠性更高.

/data/soft/zkConfig 下写的 3 个配置文件, 如下所示:

$ cat /data/soft/zkConfig/zoo-quorum-node{1..3}.cfg
####### 配置node1 ######
tickTime=2000
dataDir=/data/soft/zkConfig/node1
clientPort=2281
initLimit=5
syncLimit=2
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
4lw.commands.whitelist=*

####### 配置node2 ######
tickTime=2000
dataDir=/data/soft/zkConfig/node2
clientPort=2282
initLimit=5
syncLimit=2
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
4lw.commands.whitelist=*

####### 配置node3 ######
tickTime=2000
dataDir=/data/soft/zkConfig/node3
clientPort=2283
initLimit=5
syncLimit=2
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
4lw.commands.whitelist=*

以上配置中,
tickTime=2000 表示心跳时间为2秒.
dataDir 指定 Zookeeper 数据存储的目录(结点数据快照, myid等).
clientPort 监听端口(用于客户端连接).
initLimit=5 集群中的 follower服务器 与leader服务器 之间 初始连接 时能容忍的最多心跳数.(initLimit is timeouts ZooKeeper uses to limit the length of time the ZooKeeper servers in quorum have to connect to a leader.)
syncLimit=2 集群中的 follower服务器 与leader服务器 之间 请求和应答 之间能容忍的最多心跳数(syncLimit limits how far out of date a server can be from a leader.)
server.id=host:port1:port2
id 表示集群中server的编号, 只能用 1~255 之间的数字;
host 表示server的地址;
port1 follower 和 leader 通信端口(Quorum port);
port2 leader 选举端口(a dedicated port for ZooKeeper leader election).

4lw.commands.whitelist=* 表示将所有4字命令(Four Letter Words commands) 加入白名单.

接下来在目录 /data/soft/zookeeper下两个脚本.

启动脚本:

$ cat start_zookeeper_quorum.sh
#!/bin/bash
configs=(1 2 3)
for i in ${configs[@]}; do
    zkServer.sh start /data/soft/zkConfig/zoo-quorum-node${i}.cfg
done

停止脚本:

$ cat stop_zookeeper_quorum.sh
#!/bin/bash
configs=(1 2 3)
for i in ${configs[@]}; do
    zkServer.sh stop /data/soft/zkConfig/zoo-quorum-node${i}.cfg
done

~/.zshrc 中配置 3 个别名, 方便启动和关闭 zk 服务:

alias zkconnect='zkCli.sh -server localhost:2281,localhost:2282,localhost:2283'
alias zkquorum_start='sh /data/soft/zookeeper/start_zookeeper_quorum.sh'
alias zkquorum_stop='sh /data/soft/zookeeper/stop_zookeeper_quorum.sh'

现在通过别名 zkquorum_start 启动 zk 集群:

$ zkquorum_start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/soft/zkConfig/zoo-quorum-node1.cfg
Starting zookeeper ... STARTED
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/soft/zkConfig/zoo-quorum-node2.cfg
Starting zookeeper ... STARTED
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/soft/zkConfig/zoo-quorum-node3.cfg
Starting zookeeper ... STARTED

看似成功了, 检查一下:

$ netstat -an | ag "2281|2282|2283"
tcp        0      0 0.0.0.0:2281            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:2282            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:2283            0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:2282          127.0.0.1:41546         TIME_WAIT

好, 已经正常监听 2281|2282|2283 这三个端口了. (ag 可以换成 grep -E, 不过 ag 是一个更高效的搜索命令)

通过客户端 连接 zk 集群:

$ zkconnect
...
[zk: localhost:2281,localhost:2282,localhost:2283(CONNECTED) 0]

连接正常.

备注:
如果想要把 Zookeeper server 放在前台运行, 可以使用 zkServer.sh start-foregroup xxx.cfg 来启动一个结点.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值