枕上从妨一夜睡,灯前读尽十年诗。这篇文章主要讲述zookeeper安装配置集群相关的知识,希望能为你提供帮助。
一.简介:
下面我要讲讲zookeeper的实际运用场景:
1.1 场景一:有一组服务器向客户端提供某种服务(例如:我前面做的分布式网站的服务端,就是由四台服务器组成的集群,向前端集群提供服务),我们希望客户端每次请求服务端都可以找到服务端集群中某一台服务器,这样服务端就可以向客户端提供客户端所需的服务。对于这种场景,我们的程序中一定有一份这组服务器的列表,每次客户端请求时候,都是从这份列表里读取这份服务器列表。那么这分列表显然不能存储在一台单节点的服务器上,否则这个节点挂掉了,整个集群都会发生故障,我们希望这份列表时高可用的。高可用的解决方案是:这份列表是分布式存储的,它是由存储这份列表的服务器共同管理的,如果存储列表里的某台服务器坏掉了,其他服务器马上可以替代坏掉的服务器,并且可以把坏掉的服务器从列表里删除掉,让故障服务器退出整个集群的运行,而这一切的操作又不会由故障的服务器来操作,而是集群里正常的服务器来完成。这是一种主动的分布式???数据结构???,能够在外部情况发生变化时候主动修改数据项状态的数据机构。Zookeeper框架提供了这种服务。这种服务名字就是:统一命名服务,它和javaEE里的JNDI服务很像。
1.2 场景二:分布式锁服务。当分布式系统操作数据,例如:读取数据、分析数据、最后修改数据。在分布式系统里这些操作可能会分散到集群里不同的节点上,那么这时候就存在数据操作过程中一致性的问题,如果不一致,我们将会得到一个错误的运算结果,在单一进程的程序里,一致性的问题很好解决,但是到了分布式系统就比较困难,因为分布式系统里不同服务器的运算都是在独立的进程里,运算的中间结果和过程还要通过网络进行传递,那么想做到数据操作一致性要困难的多。Zookeeper提供了一个锁服务解决了这样的问题,能让我们在做分布式数据运算时候,保证数据操作的一致性。
1.3 场景三:配置管理。在分布式系统里,我们会把一个服务应用分别部署到n台服务器上,这些服务器的配置文件是相同的(例如:我设计的分布式网站框架里,服务端就有4台服务器,4台服务器上的程序都是一样,配置文件都是一样),如果配置文件的配置选项发生变化,那么我们就得一个个去改这些配置文件,如果我们需要改的服务器比较少,这些操作还不是太麻烦,如果我们分布式的服务器特别多,比如某些大型互联网公司的hadoop集群有数千台服务器,那么更改配置选项就是一件麻烦而且危险的事情。这时候zookeeper就可以派上用场了,我们可以把zookeeper当成一个高可用的配置存储器,把这样的事情交给zookeeper进行管理,我们将集群的配置文件拷贝到zookeeper的文件系统的某个节点上,然后用zookeeper监控所有分布式系统里配置文件的状态,一旦发现有配置文件发生了变化,每台服务器都会收到zookeeper的通知,让每台服务器同步zookeeper里的配置文件,zookeeper服务也会保证同步操作原子性,确保每个服务器的配置文件都能被正确的更新。
1.4 场景四:为分布式系统提供故障修复的功能。集群管理是很困难的,在分布式系统里加入了zookeeper服务,能让我们很容易的对集群进行管理。集群管理最麻烦的事情就是节点故障管理,zookeeper可以让集群选出一个健康的节点作为master,master节点会知道当前集群的每台服务器的运行状况,一旦某个节点发生故障,master会把这个情况通知给集群其他服务器,从而重新分配不同节点的计算任务。Zookeeper不仅可以发现故障,也会对有故障的服务器进行甄别,看故障服务器是什么样的故障,如果该故障可以修复,zookeeper可以自动修复或者告诉系统管理员错误的原因让管理员迅速定位问题,修复节点的故障。大家也许还会有个疑问,master故障了,那怎么办了?zookeeper也考虑到了这点,zookeeper内部有一个“选举领导者的??算法??”,master可以动态选择,当master故障时候,zookeeper能马上选出新的master对集群进行管理。
二.下面我要讲讲zookeeper的特点:
2.2 zookeeper提供了丰富的“构件”,这些构件可以实现很多协调数据结构和协议的操作。例如:分布式队列、分布式锁以及一组同级节点的“领导者选举”算法。
2.3 zookeeper是高可用的,它本身的稳定性是相当之好,分布式集群完全可以依赖zookeeper集群的管理,利用zookeeper避免分布式系统的单点故障的问题。
2.4 zookeeper采用了松耦合的交互模式。这点在zookeeper提供分布式锁上表现最为明显,zookeeper可以被用作一个约会机制,让参入的进程不在了解其他进程的(或网络)的情况下能够彼此发现并进行交互,参入的各方甚至不必同时存在,只要在zookeeper留下一条消息,在该进程结束后,另外一个进程还可以读取这条信息,从而解耦了各个节点之间的关系。
2.5 zookeeper为集群提供了一个共享存储库,集群可以从这里集中读写共享的信息,避免了每个节点的共享操作编程,减轻了分布式系统的开发难度。
2.6 zookeeper的设计采用的是观察者的设计模式,zookeeper主要是负责存储和管理大家关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/Slave 管理模式。
由此可见zookeeper很利于分布式系统开发,它能让分布式系统更加健壮和高效。
三.安装环境:
[root@node1docker]# tree ├── jdk-8u161-linux-x64.tar.gz └──zookeeper-3.4.11.tar.gz |
五.安装JDK环境
[root@node2
~]# tar zxvf
jdk-8u161-linux-x64.tar.gz
[root@node2
docker]# mv jdk1.8.0_161/ /usr/local/java
[root@node2
docker]# vim /etc/profile
#文件最后增加以下内容
#java env exportJAVA_HOME=/usr/local/java exportCLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar exportPATH=$PATH:$JAVA_HOME/bin |
docker]# source /etc/profile
六.安装zookeeper集群
[root@node1
docker]# tar zxvf zookeeper-3.4.11.tar.gz
[root@node1
docker]# mv zookeeper-3.4.11 /usr/local/zookeeper
[root@node2
docker]# cd /usr/local/zookeeper/conf
# zk启动默认加载的是zoo.cfg文件。
[root@node2 conf]#
cp zoo_sample.cfg zoo.cfg
[root@node2 conf]#
cat zoo.cfg
#间隔都是使用tickTime的倍数来表示的,例如initLimit=10就是tickTime的十倍等于2W毫秒 tickTime=2000 # The number ofticks that can pass between, sending a request and getting anacknowledgement # 心跳最大延迟时间,如果leader在规定的时间内无法获取到follow的心跳检测响应,则认为节点已脱离 syncLimit=5 # the directorywhere the snapshot is stored. do not use /tmp for storage, /tmp here isjust. example sakes. # 用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里 dataDir=/opt/zookeeper/data #the port at which the clients will connect,ZK端口 clientPort=2181 # the maximumnumber of client connections. increase this if you need to handle moreclients # 允许连接的客户端数目,0-不限制,通过 IP 来区分不同的客户端 maxClientCnxns=60 #将管理机器把事务日志写入到“ dataLogDir ”所指定的目录,而不是“dataDir ”所指定的目录。避免日志和快照之间的竞争 dataLogDir=/opt/zookeeper/log # The number ofsnapshots to retain in dataDir #用于配置zookeeper在自动清理的时候需要保留的快照数据文件数量和对应的事务日志文件,最小值时三,如果比3小,会自动调整为3 #autopurge.snapRetainCount=3 # Purge taskinterval in hours. Set to "0" to disable auto purge feature #配套snapRetainCount使用,用于配置zk进行历史文件自动清理的频率,如果参数配置为0或者小于零,就表示不开启定时清理功能,默认不开启 #autopurge.purgeInterval=1 ##集群配置 # The number ofticks that the initial, synchronization phase can take #follow服务器在启动的过程中会与leader服务器建立链接并完成对数据的同步,leader服务器允许follow在initLimit时间内完成,默认时10.集群量增大时 #同步时间变长,有必要适当的调大这个参数, 当超过设置倍数的 tickTime 时间,则连接失败 initLimit=10 #server.A=B:C:D:其中 A 数字,表示是第几号服务器. dataDir目录下必有一个myid文件,里面只存储A的值,ZK启动时读取此文件,与下面列表比较判断是哪个server # B是服务器 ip ;C表示与 Leader 服务器交换信息的端口;D 表示的是进行选举时的通信端口。 server.1=192.168.2.223:2888:3888 server.2=192.168.2.224:2888:3888 server.3=182.168.2.225:2888:3888 # 配置成observer模式 #peerType=observer # 注意观察者角色的末尾,需要拼接上observer #server.4=10.2.143.38:2886:3886:observer |
conf]# mkdir -p /opt/zookeeper/data,log
集群环境中:
1、在dataDir文件夹下创建的myid文件,并写入标识1-n任意值
2、需在zoo.cfg文件最后添加一下配置
server.1=192.168.2.223:2888:3888
server.2=192.168.2.224:2888:3888
server.3=182.168.2.225:2888:3888
单机模式: server.1,1是指在dataDir文件夹下创建的myid文件内容(在dataDir文件中执行:echo
"1" > myid)
单机模式只需要一个主机即可,
集群模式注意:server.1,1是指在dataDir文件夹下创建的myid文件内容(在dataDir文件中执行:echo "1"
> myid)
server.2,2是指在dataDir文件夹下创建的myid文件内容(在dataDir文件中执行:echo
"2" > myid)
server.3,3是指在dataDir文件夹下创建的myid文件内容(在dataDir文件中执行:echo
"3" > myid)
[root@node1
opt]# echo "1" > /opt/zookeeper/data/myid
配置环境变量,
[root@node1 bin]#
echo "export ZK_HOME=/usr/local/zookeeper" > > /etc/profile
[root@node1 bin]#
echo "export PATH=$PATH:$ZK_HOME/bin" > > /etc/profile
[root@node1 bin]#
source /etc/profile
[root@node1
~]# zkServer.sh start
[root@node1
~]# zkServer.sh status
因为涉及到Leader(Master)选举的问题,需要先启动master,然后再启动其他的
集群中的角色:
leader服务器:zookeeper集群的核心
follower服务器:zookeeper集群状态的跟随者
observer服务器:观察者
[root@node1 ~]#
zkCli.sh -server 192.168.2.223:2181
七. cli使用
首先,我们可以是用命令 zkCli.sh 进入 zookeeper 的命令行客户端,这种是直接连接本机 的 zookeeper 服务器,
还有一种方式,可以连接其他的 zookeeper 服务器,只需要我们在命 令后面接一个参数-server 就可以了。
例如: zkCli.sh –server 192.168.2.224:2181
进入命令行之后,键入 help 可以查看简易的命令帮助文档,
【zookeeper安装配置集群】
推荐阅读
- filebeat收集json日志
- Windows RDP远程桌面 提示出现身份验证错误 要求的函数不受支持 解决方法
- Centos7.9搭建rabbitmq+haproxy+keepalived高可用集群
- -Linux系统启动原理及故障排除
- Ubuntu Server 创建普通用户只能访问自己的home文件夹
- keepalived多实例高可用配置
- 如何在PHP中生成随机、唯一的字母数字字符串
- 如何在C#中查找StringBuilder的长度()
- 如何在Golang中找到指针的长度()