您当前的位置:首页 > 电脑百科 > 安全防护 > 服务器/网站

ZooKeeper 原理与服务器集群部署

时间:2019-07-31 09:17:13  来源:  作者:

ZooKeeper 是大型分布式系统中可靠的协调系统,它以树状结构存储数据,以领导选举和信息同步机制保证了集群的高可用性,以事件通知机制协助事件订阅者及时捕获数据的变化,可协助实现 Dubbo、Kafka 等架构。本文以 centoswindows 为例,总结了 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/ 
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz 
sudo rm -rf /opt/zookeeper-3.4.11 
sudo tar -zxf zookeeper-3.4.11.tar.gz -C /opt 
sudo chown -R root:root /opt/zookeeper-3.4.11 
sudo rm -rf /opt/zookeeper-3.4.11/bin/*.cmd 

2.2 设置环境变量

## sudo vim /etc/profile ## 所有用户有效 
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.11 
export PATH=$PATH:$ZOOKEEPER_HOME/bin 

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

2.3 准备目录与配置文件

# sudo vim $ZOOKEEPER_HOME/bin/zkInit.sh 
# sudo -E sh $ZOOKEEPER_HOME/bin/zkInit.sh 
for INDEX in {1..3}; do 
 sudo rm -rf $ZOOKEEPER_HOME/{data,logs}/$INDEX 
 sudo mkdir -p $ZOOKEEPER_HOME/{data,logs}/$INDEX 
 echo $INDEX | sudo tee $ZOOKEEPER_HOME/data/$INDEX/myid > /dev/null 
 
 # zoo.cfg 参考: grep -v "^#" $ZOOKEEPER_HOME/conf/zoo_sample.cfg 
 cat > $ZOOKEEPER_HOME/conf/zoo-$INDEX.cfg << EOF 
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 服务的配置并启动

## sudo vim /usr/lib/systemd/system/zookeeper@.service 
## 其中的 %i 将来会被替换为具体的 1/2/3 
[Unit] 
Description=ZooKeeper 
After=syslog.target network.target 
 
[Service] 
Type=forking 
Environment="ZOOCFG=zoo-%i.cfg" 
ExecStart=/opt/zookeeper-3.4.11/bin/zkServer.sh start 
ExecStop=/opt/zookeeper-3.4.11/bin/zkServer.sh stop 
 
[Install] 
WantedBy=multi-user.target 

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

sudo systemctl daemon-reload 
sudo systemctl enable zookeeper@{1,2,3} 
sudo systemctl start zookeeper@{1,2,3} 
sudo netstat -natp | grep LISTEN | grep -E "218|228|229" 
# sudo systemctl stop zookeeper@{1,2,3} 

2.5 防火墙放行

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

### sudo vim /etc/sysconfig/iptables 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2182 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2183 -j ACCEPT 
### 重启生效: sudo systemctl restart iptables 

2.6 客户端验证

zkCli.sh -server localhost:2181 ## 进入命令行状态 
help ## 显示所有命令格式 
quit ## 退出命令行状态 
history ## 显示历史命令 
 
ls path [watch] 
createpath data acl 
delete path [version] 
set path data [version] 
get path [watch] 
stat path [watch] 
sync path 
 
listquota path 
setquota -n|-b val path 
delquota [-n|-b] path 
 
addauth scheme auth 
setAcl path acl 
getAcl path 
 
printwatches on|off 
redo cmdno 

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

zkCli.sh -server localhost:2181 ls / 

2.7 清空数据【慎用】

sudo systemctl stop zookeeper@{1,2,3} 
sudo rm -rf $ZOOKEEPER_HOME/{logs,data}/{1,2,3}/version-* 
sudo systemctl start zookeeper@{1,2,3} 

2.8 卸载服务【慎用】

sudo systemctl stop zookeeper@{1,2,3} 
sudo systemctl disable zookeeper@{1,2,3} 
sudo rm -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 修改系统环境变量

set ZOOKEEPER_HOME={???}zookeeper-3.4.11 
set PATH=%ZOOKEEPER_HOME%bin 

3.2.3 修改 confzoo-%n.cfg

cd/d %ZOOKEEPER_HOME% 
del /q bin*.sh 
rd/s/q data logs 
for %n in (1,2,3) do @mkdir logs%n 
for %n in (1,2,3) do @mkdir data%n 
for %n in (1,2,3) do @echo %n> data%nmyid 
for %n in (1,2,3) do @copy/b confzoo_sample.cfg confzoo-%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 %n in (1,2,3) do @copy/b binzkServer.cmd binzkServer%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 -server centos:2181 ## 连接 Linux 上服务 
zkCli.cmd -server localhost:2181 ## 连接本机上服务 
## 更多内容参见前面 Linux 中相应部分 

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

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

  • 要求至少为三台 ZooKeeper 服务器,最好是奇数个服务器(以便多数正常机器处理少数机器的故障),通常三台足够了,如果想更可靠,可增加至五台;
  • 为避免各服务器同时发生故障,最好部署在不同机器、不同网络交换机(电路、冷却系统等)、甚至不同机房;
  • 为避免内存交换,要设置足够大的 JVM 堆,比如 4G 机器可指定 3G;


Tags:ZooKeeper 服务器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
ZooKeeper 是大型分布式系统中可靠的协调系统,它以树状结构存储数据,以领导选举和信息同步机制保证了集群的高可用性,以事件通知机制协助事件订阅者及时捕获数据的变化,可协助实...【详细内容】
2019-07-31  Tags: ZooKeeper 服务器  点击:(225)  评论:(0)  加入收藏
▌简易百科推荐
在最近的一波攻击中,黑客利用多个插件中未修补的漏洞攻击了 160 万个 WordPress 网站。 易受攻击的插件对 WordPress 网站产生了的巨大攻击数据。 Wordfence 最近发现 WordPr...【详细内容】
2021-12-16  蚁安    Tags:WordPress   点击:(9)  评论:(0)  加入收藏
事件起因从安全分析系统里面发现一条带有病毒的下载,然后针对这条记录展开了一系列的分析分析过程1.登录到被感染服务器,查看系统状况,hadoop 这个用户在 2020/6/18 20:32 从这...【详细内容】
2021-11-23  Z2990Lig    Tags:SSH   点击:(32)  评论:(0)  加入收藏
1、除了服务器需要用的一些正规软件,其它都不要安装。2、在用户中把administrator改名,这样做的目的是即使对方暴破了我们的密码用户名也不容易猜住,相当于又加了一道关卡。...【详细内容】
2021-11-01  IT小哥吧    Tags:服务器   点击:(37)  评论:(0)  加入收藏
账户安全(1)更名administrator本地用户并禁用guest账户步骤:点击“开始”,找到“管理工具”,点击里面的“计算机管理”,找到“本地用户和组” (2)设定账户锁定策略尝试5次失败...【详细内容】
2021-10-12  Kali与编程  今日头条  Tags:Windows主机   点击:(62)  评论:(0)  加入收藏
本文主要介绍以Microsoft的Windows Server 2019 ,版本:Datacenter(Domain Controller)安全加固保护.企业随着规模不断扩大,业务增多,信息安全建设是企业里一条只有重点没有终点...【详细内容】
2021-09-17  Vireshark    Tags:服务器安全   点击:(64)  评论:(0)  加入收藏
目录常见共享命令IPC$IPC$的利用条件1:开启了139、445端口2:目标主机开启了IPC$共享3:IPC连接报错IPC空连接空连接可以做什么?(毫无作用)IPC$非空连接IPC$非空连接可以做什么?di...【详细内容】
2021-09-16  网络说安全    Tags:系统安全   点击:(86)  评论:(0)  加入收藏
昨天一个老哥找到我,说他的服务器这几天一直被CC攻击,问我这边有没有什么解决的方法? 近年来,网络攻击事件越来越频繁,最常见的就是CC攻击和DDOS攻击,主要的区别就是针对的对象不...【详细内容】
2021-09-10  小蚁GDRAGON    Tags:cc攻击   点击:(58)  评论:(0)  加入收藏
网站页面上的登录操作,通常都是输入帐号密码,传输至网站后台验证。在网站页面、数据传输中,通过技术手段,都可以得到用户输入的信息,并可以修改,从而发起网络攻击。典型的如:使用自...【详细内容】
2021-08-30  修丹道的程序猿    Tags:登录方式   点击:(62)  评论:(0)  加入收藏
网络安全研究人员披露了一类影响主要 DNS 即服务 (DNSaaS) 提供商的新漏洞,这些漏洞可能允许攻击者从企业网络中窃取敏感信息。基础设施安全公司 Wiz 的研究人员 Shir Tamar...【详细内容】
2021-08-12  零日时代    Tags:漏洞   点击:(66)  评论:(0)  加入收藏
001暴力破解1. 指定用户名爆破密码传统型爆破思路,用户名可以通过猜测或者信息收集获得。猜测:admin、网站域名等信息收集:新闻发布人、whoami等2. 指定密码爆破用户名如果是后...【详细内容】
2021-07-23  KaliMa  今日头条  Tags:登陆框   点击:(85)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条