Tuesday, December 24, 2019

從 高可用 到 微服務 初探 (二) 搭建 zookeeper 偽群集

zookeeper 大概就是
目前只介紹這個東西的用途,可以得知我們的我們的服務都註冊到zookeeper 裡面的一個節點,然後我們可以透過去請求 zookeeper 先取得節點的可用伺服器清單,然後client 再去訪問可用的伺服器清單,這個就是 zookeeper 大概用途,下面沒有涉及什麼選舉演算法等等,只有對zookeeper 初步介紹搭建。
這邊文章後下回 spring cloud 來實作微服務(ps 不是這個文

zookeeper 應用場景

  • 分布式協調
  • 分布式所
  • 元数据/配置信息管理
  • HA高可用
分布式协调这个其实是 zookeeper 很经典的一个用法,简单来说,就好比,你 A 系统发送个请求到 mq,然后 B 系统消息消费之后处理了。那 A 系统如何知道 B 系统的处理结果?用 zookeeper 就可以实现分布式系统之间的协调工作。A 系统发送请求之后可以在 zookeeper 上对某个节点的值注册个监听器,一旦 B 系统处理完了就修改 zookeeper 那个节点的值,A 系统立马就可以收到通知,完美解决。
分布式锁举个栗子。对某一个数据连续发出两个修改操作,两台机器同时收到了请求,但是只能一台机器先执行完另外一个机器再执行。那么此时就可以使用 zookeeper 分布式锁,一个机器接收到了请求之后先获取 zookeeper 上的一把分布式锁,就是可以去创建一个 znode,接着执行操作;然后另外一个机器也尝试去创建那个 znode,结果发现自己创建不了,因为被别人创建了,那只能等着,等第一个机器执行完了自己再执行。
元数据/配置信息管理zookeeper 可以用作很多系统的配置信息的管理,比如 kafka、storm 等等很多分布式系统都会选用 zookeeper 来做一些元数据、配置信息的管理,包括 dubbo 注册中心不也支持 zookeeper 么?
HA高可用性这个应该是很常见的,比如 hadoop、hdfs、yarn 等很多大数据系统,都选择基于 zookeeper 来开发 HA 高可用机制,就是一个重要进程一般会做主备两个,主进程挂了立马通过 zookeeper 感知到切换到备用进程。

環境設定

下載 zookeeper 3.4.14
cd : /opt
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar zxvf zookeeper-3.4.14.tar.gz


安裝目錄 : /opt/zookeeper
mkdir /opt/zookeeper
cd /opt/zookeeper 
tar -zxvf  /opt/zookeeper-3.4.11.tar.gz 
cp -rf /opt/zookeeper/zookeeper-3.4.11   /opt/zookeeper/zk1
cp -rf /opt/zookeeper/zookeeper-3.4.11   /opt/zookeeper/zk2
cp -rf /opt/zookeeper/zookeeper-3.4.11   /opt/zookeeper/zk3
rm -rf  /opt/zookeeper/zookeeper-3.4.11 

到這邊已經產生了三個節點

 /opt/zookeeper/zk1
 /opt/zookeeper/zk2
 /opt/zookeeper/zk3

zoo.cfg 配置

節點1

#zookeeper时间单元,单位为毫秒
tickTime=2000
#集群中的follower服务器(F)与leader服务器(L)之间 初始连接 时能容忍的最多心跳数(tickTime的数量)。
initLimit=10
# 集群中的follower服务器(F)与leader服务器(L)之间 请求和应答 之间能容忍的最多心跳数(tickTime的数量)。
syncLimit=5
# data数据目录
dataDir=/opt/zookeeper/zk1/data
# 客户端连接端口
clientPort=2181
# 客户端最大连接数
#maxClientCnxns=60
# 需要保留的快照数目
#autopurge.snapRetainCount=3
# 是否开启自动清理事务日志和快照功能 0 不开启,1表示开启
#autopurge.purgeInterval=1
#集群配置 
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

節點2

#zookeeper时间单元,单位为毫秒
tickTime=2000
#集群中的follower服务器(F)与leader服务器(L)之间 初始连接 时能容忍的最多心跳数(tickTime的数量)。
initLimit=10
# 集群中的follower服务器(F)与leader服务器(L)之间 请求和应答 之间能容忍的最多心跳数(tickTime的数量)。
syncLimit=5
# data数据目录
dataDir=/opt/zookeeper/zk2/data
# 客户端连接端口
clientPort=2182
# 客户端最大连接数
#maxClientCnxns=60
# 需要保留的快照数目
#autopurge.snapRetainCount=3
# 是否开启自动清理事务日志和快照功能 0 不开启,1表示开启
#autopurge.purgeInterval=1
#集群配置 
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

節點3

#zookeeper时间单元,单位为毫秒
tickTime=2000
#集群中的follower服务器(F)与leader服务器(L)之间 初始连接 时能容忍的最多心跳数(tickTime的数量)。
initLimit=10
# 集群中的follower服务器(F)与leader服务器(L)之间 请求和应答 之间能容忍的最多心跳数(tickTime的数量)。
syncLimit=5
# data数据目录
dataDir=/opt/zookeeper/zk3/data
# 客户端连接端口
clientPort=2183
# 客户端最大连接数
#maxClientCnxns=60
# 需要保留的快照数目
#autopurge.snapRetainCount=3
# 是否开启自动清理事务日志和快照功能 0 不开启,1表示开启
#autopurge.purgeInterval=1
#集群配置 
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
CentOS Linux开启和关闭防火墙命令有两种,一种是临时的,重启即复原;另外一种是永久性的,重启不会复原。
1) 临时生效,重启后复原
开启: service iptables start
关闭: service iptables stop
2) 永久性生效,重启后不会复原
开启: chkconfig iptables on
关闭: chkconfig iptables off

myid 配置

需要在 data 裡面新增 一個 myid 文件各一個
echo '1'  >  /opt/zookeeper/zk1/data/myid
echo '2'  >  /opt/zookeeper/zk2/data/myid
echo '3'  >  /opt/zookeeper/zk3/data/myid

日誌路徑 配置

修改 bin 目錄的 zkEnv.sh
把 ZOO_LOG_DIR 設為
ZOO_LOG_DIR="../logs/"

啟動

/opt/zookeeper/zk1/bin/zkServer.sh start
/opt/zookeeper/zk2/bin/zkServer.sh start
/opt/zookeeper/z3/bin/zkServer.sh start

client 連接

隨機訪問任意server
create /test 123
/opt/zookerper/zk1/bin/zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183

client 創建一個 test znode

隨機訪問任意節點
create /test /123

client 查看 test znode

get /test 

查看 log

當有節點異動都可從這個 log 進行觀看
logs$ tail -f zookeeper.out
參考