服务器之家:专注于服务器技术及软件下载分享
分类导航

云服务器|WEB服务器|FTP服务器|邮件服务器|虚拟主机|服务器安全|DNS服务器|服务器知识|Nginx|IIS|Tomcat|

服务器之家 - 服务器技术 - 服务器知识 - ZooKeeper 原理与服务器集群部署

ZooKeeper 原理与服务器集群部署

2019-07-27 17:51kefeng.wang博客王克锋 服务器知识

ZooKeeper 是大型分布式系统中可靠的协调系统,它以树状结构存储数据,以领导选举和信息同步机制保证了集群的高可用性,以事件通知机制协助事件订阅者及时捕获数据的变化,可协助实现

ZooKeeper 是大型分布式系统中可靠的协调系统,它以树状结构存储数据,以领导选举和信息同步机制保证了集群的高可用性,以事件通知机制协助事件订阅者及时捕获数据的变化,可协助实现 Dubbo、Kafka 等架构。本文以 CentOS 和 Windows 为例,总结了 ZooKeeper 集群的部署操作,并以自带的脚本命令操作其数据。

ZooKeeper 原理与服务器集群部署

1.概述

ZooKeeper 是 Hadoop 的一个子项目,是大型分布式系统中可靠的协调系统。分布式应用程序以此实现更高级别的服务,可用于分布式系统的配置维护、名字服务、分布式同步、组服务等:

用于 Dubbo: 作为配置中心;

用于 Kafka: 作为 Broker/Producer/Consumer 共享的配置中心。

官网首页: https://zookeeper.apache.org/

官网文档: https://zookeeper.apache.org/doc/current/

1.1 ZAB协议

ZooKeeper 原理与服务器集群部署

集群间通过 ZAB(ZooKeeper Atomic Broadcast)协议保持数据一致性,该协议包括两个阶段:

1.1.1 领导选举(Leader Election)

选举出一个 Leader(所有写操作传送给 Leader),其他机器被称为 Follower;

当前 Leader 崩溃或失去大多数 Follower 后,会选举出新的 Leader;

1.1.2 信息同步(Atomic broadcast)

用于同步 Leader 与 Follower 之间的信息,保证数据一致。

1.2 内部原理

https://zookeeper.apache.org/doc/current/zookeeperOver.html

存储方式与标准文件系统非常相似,每个节点称作 znode,本身包含数据,还可以拥有子节点。

客户端以TCP连接一台节点,该节点故障时,客户端会切换至其他节点。

客户端可以订阅某些节点的事件(watcher机制),当节点内容或其子节点有变化时,客户端会收到通知。

ZooKeeper 原理与服务器集群部署

高性能:多读少写的情况下,速度很快;存储于内存中,并有持久存储中的事务日志和快照;

高可用性(无中心化结构可避免单点故障): 个别节点故障不影响整体使用;

监视机制: 客户端可以监视一个结点(node),当结点断开或有修改时,客户端会收到通知;

顺序一致性: 来自客户端的更新将按照它们发送的顺序进行应用。

原子性: 保证数据完整、一致,更新成功或失败,没有部分结果。

单系统映像: 无论服务器连接到哪个服务器,客户端都会看到相同的服务视图。

可靠性: 一旦更新被应用,它将一直持续到客户覆盖更新。

及时性: 系统的客户观点在一定的时间范围内保证是最新的。

1.3 系统要求

ZooKeeper 以 Java 版本运行,Java 版本要求为 1.6+;

支持的操作系统包括: GNU/Linux, Solaris, FreeBSD, Windows。

2.Linux 下安装

https://zookeeper.apache.org/doc/current/zookeeperStarted.html

2.1 下载并解压(35M)

#https://archive.apache.org/dist/zookeeper/

#https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/

wgethttps://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz

sudorm-rf/opt/zookeeper-3.4.11

sudotar-zxfzookeeper-3.4.11.tar.gz-C/opt

sudochown-Rroot:root/opt/zookeeper-3.4.11

sudorm-rf/opt/zookeeper-3.4.11/bin/*.cmd

2.2 设置环境变量

##sudovim/etc/profile##所有用户有效

exportZOOKEEPER_HOME=/opt/zookeeper-3.4.11

exportPATH=$PATH:$ZOOKEEPER_HOME/bin

文件保存后,Linux用户重新登录后生效。

2.3 准备目录与配置文件

#sudovim$ZOOKEEPER_HOME/bin/zkInit.sh

#sudo-Esh$ZOOKEEPER_HOME/bin/zkInit.sh

forINDEXin{1..3};do

sudorm-rf$ZOOKEEPER_HOME/{data,logs}/$INDEX

sudomkdir-p$ZOOKEEPER_HOME/{data,logs}/$INDEX

echo$INDEX|sudotee$ZOOKEEPER_HOME/data/$INDEX/myid>/dev/null

#zoo.cfg参考:grep-v"^#"$ZOOKEEPER_HOME/conf/zoo_sample.cfg

cat>$ZOOKEEPER_HOME/conf/zoo-$INDEX.cfg<

tickTime=2000##ZooKeeper的最小时间单位(ms)

initLimit=10##投票选举新leader的初始化时间(以tickTime为单位)

syncLimit=5##Leader检测Follower可用性心跳的超时时间(以tickTime为单位)

clientPort=218$INDEX##客户端用来连接ZooKeeper的端口

dataDir=$ZOOKEEPER_HOME/data/$INDEX##数据目录(存储内存数据库快照)

dataLogDir=$ZOOKEEPER_HOME/logs/$INDEX##日志目录(存储事务日志)

server.1=localhost:2281:2291

server.2=localhost:2282:2292

server.3=localhost:2283:2293

EOF

done

其中的 clientPort=218$INDEX 是提供给客户端连接的端口(2181,2182,2183);

其中的 server.N = hostname : port1 : port2:

N(1,2,3): “必须”是一个数字(表示这是第几号server),否则报错 java.lang.NumberFormatException: For input string: "xxx"

hostname(localhost): 是该 server 所在的域名或IP地址,为了通用,可替换为域名zk{n}.company.com 并在 hosts 里配置;

port1(2281,2282,2283): 当前 server 是 leader 时,监听此端口接受 followers 的连接,注意followers不会监听此端口(直到它升级为 leader)

port2(2291,2292,2293): 是选举 leader 时所使用的端口。

必须生成文件 $ZOOKEEPER_HOME/data/%n/myid,其内容为 zoo.cnf 中的 N(服务器ID), 否则抛出异常 java.lang.IllegalArgumentException: $ZOOKEEPER_HOME/data/{n}/myid file is missing

2.4 服务的配置并启动

##sudovim/usr/lib/systemd/system/zookeeper@.service

##其中的%i将来会被替换为具体的1/2/3

[Unit]

Description=ZooKeeper

After=syslog.targetnetwork.target

[Service]

Type=forking

Environment="ZOOCFG=zoo-%i.cfg"

ExecStart=/opt/zookeeper-3.4.11/bin/zkServer.shstart

ExecStop=/opt/zookeeper-3.4.11/bin/zkServer.shstop

[Install]

WantedBy=multi-user.target

配置为自动启动,并立即启动:

sudosystemctldaemon-reload

sudosystemctlenablezookeeper@{1,2,3}

sudosystemctlstartzookeeper@{1,2,3}

sudonetstat-natp|grepLISTEN|grep-E"218|228|229"

#sudosystemctlstopzookeeper@{1,2,3}

2.5 防火墙放行

如果非本机应用需要连接 ZooKeeper,必须把所有 clientPort 端口放行。

###sudovim/etc/sysconfig/iptables

-AINPUT-mstate--stateNEW-mtcp-ptcp--dport2181-jACCEPT

-AINPUT-mstate--stateNEW-mtcp-ptcp--dport2182-jACCEPT

-AINPUT-mstate--stateNEW-mtcp-ptcp--dport2183-jACCEPT

###重启生效:sudosystemctlrestartiptables

2.6 客户端验证

zkCli.sh-serverlocalhost:2181##进入命令行状态

help##显示所有命令格式

quit##退出命令行状态

history##显示历史命令

lspath[watch]

createpathdataacl

deletepath[version]

setpathdata[version]

getpath[watch]

statpath[watch]

syncpath

listquotapath

setquota-n|-bvalpath

delquota[-n|-b]path

addauthschemeauth

setAclpathacl

getAclpath

printwatcheson|off

redocmdno

也可集连接和命令于一行:

zkCli.sh-serverlocalhost:2181ls/

2.7 清空数据【慎用】

sudosystemctlstopzookeeper@{1,2,3}

sudorm-rf$ZOOKEEPER_HOME/{logs,data}/{1,2,3}/version-*

sudosystemctlstartzookeeper@{1,2,3}

2.8 卸载服务【慎用】

sudosystemctlstopzookeeper@{1,2,3}

sudosystemctldisablezookeeper@{1,2,3}

sudorm-rf$ZOOKEEPER_HOME

3.Windows 下安装(可用于开发)

3.1 下载

https://archive.apache.org/dist/zookeeper/

https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/

https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz

3.2 安装

3.2.1 解压

3.2.2 修改系统环境变量

setZOOKEEPER_HOME={???}zookeeper-3.4.11

setPATH=%ZOOKEEPER_HOME%in

3.2.3 修改 confzoo-%n.cfg

cd/d%ZOOKEEPER_HOME%

del/qbin*.sh

rd/s/qdatalogs

for%nin(1,2,3)do@mkdirlogs%n

for%nin(1,2,3)do@mkdirdata%n

for%nin(1,2,3)do@echo%n>data%nmyid

for%nin(1,2,3)do@copy/bconfzoo_sample.cfgconfzoo-%n.cfg

修改文件 confzoo-%n.cfg 如下(分别替换其中的 %n 为 1,2,3):

tickTime=2000

initLimit=10

syncLimit=5

clientPort=218%n

dataDir=D:/Software/Architecture/zookeeper-3.4.11/data/%n

dataLogDir=D:/Software/Architecture/zookeeper-3.4.11/logs/%n

server.1=localhost:2281:2291

server.2=localhost:2282:2292

server.3=localhost:2283:2293

参数说明与 Linux 中相关内容一样。

3.2.4 修改脚本

删除 binzkEnv.cmd 中的 set ZOOCFG=%ZOOCFGDIR%zoo.cfg 一行;

for%nin(1,2,3)do@copy/bbinzkServer.cmdbinzkServer%n.cmd

修改各个文件 zkServer%n.cmd 在 call "%~dp0zkEnv.cmd" 之前加一行:

set ZOOCFG=%~dp0%..confzoo-%n.cfg,注意替换 %n 分别为 1/2/3

3.3 启动服务

zkServer1.cmd

zkServer2.cmd

zkServer3.cmd

3.4 客户端验证

zkCli.cmd-servercentos:2181##连接Linux上服务

zkCli.cmd-serverlocalhost:2181##连接本机上服务

##更多内容参见前面Linux中相应部分

4.集群部署(生产环境)

管理员指南: https://zookeeper.apache.org/doc/current/zookeeperAdmin.html

要求至少为三台 ZooKeeper 服务器,最好是奇数个服务器(以便多数正常机器处理少数机器的故障),通常三台足够了,如果想更可靠,可增加至五台;

为避免各服务器同时发生故障,最好部署在不同机器、不同网络交换机(电路、冷却系统等)、甚至不同机房;

为避免内存交换,要设置足够大的 JVM 堆,比如 4G 机器可指定 3G。

延伸 · 阅读

精彩推荐