您现在的位置是:首页 > 游戏资讯
Zookeeper系列-1Zookeeper简介及部署
星际游娱坊
2025-03-04【游戏资讯】152人已围观
简介CSDN地址:学习目标理解Zookeeper的核心功能理解Zookeeper的数据模型和znode结构掌握Zookeeper在不同操作系统上的部署第1章Zookeeper简介1.1概念ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是H...
CSDN地址:
学习目标理解Zookeeper的核心功能
理解Zookeeper的数据模型和znode结构
掌握Zookeeper在不同操作系统上的部署
第1章Zookeeper简介1.1概念ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。它包含一个简单的原语集,提供Java和C的接口。ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
上面是百度百科对Zookeeper的解释,实际上,Zookeeper就是一个第三方的存储软件,它是一个独立的项目,相当于一个上帝视角,站在上帝的角度为我们的业务系统提供数据存储(比如注册中心和配置中心的功能),已经动态监听的功能(当zk上的数据发生变化,它会通过watch机制告诉我们的业务系统)。
通过上面的介绍,我相信大家应该能对Zookeeper(后面统一称为zk)有个大概的认识,那我们接着来聊一聊它作为一个上帝,要提供哪些核心功能:
首先它要存储数据,所以它必须提供一个数据结构去存储。至于它的数据结构是什么样的后面会讲。
数据存储上来之后,当数据发生变化,我得告知业务系统。怎么告知,什么时候告知,告知哪些业务系统都得考虑,这里怎么告知肯定是通过网络通信协议去做的,什么时候告知是通过watcher机制去观察的,告知谁是在我们zk上有个session保存我要告知的业务系统的。
因为zk是用在分布式系统上的,为了保证高可用性,zk通常也会做集群,那zk做集群的话也会牵扯到数据一致性,怎么保证zk的每个节点数据是同步的呢?后面也会讲解,大家别慌。
OK,以上就是zk要实现的核心功能,围绕着这三个核心功能,我们再去分析原理,推导核心流程,这样我相信大家就不会觉得在学习过程中一头雾水了。
一步步来,我们现在认识zk是个什么玩意儿了,然后再浅尝辄止认识认识它的整体结构,最后这篇文章我们再搭建一下zk的服务玩一下它的api。那本文就算达到目的了。当我们熟悉了它的使用,再去掌握它的原理,那这块技术才算拿下。
1.2数据结构zookeeper提供的名称空间非常类似于标准文件系统,key-value的形式存储。名称key由斜线/分割的一系列路径元素,zookeeper名称空间中的每个节点都是由一个路径标识。
1.3重要特性1.3.1节点状态信息节点除了存储数据内容以外,还存储了数据节点本身的一些状态信息,通过get命令可以获得状态信息的详细内容,如图所示。
版本-保证分布式数据原子性。zookeeper为数据节点引入了版本的概念,每个数据节点都有三类版本信息,对数据节点任何更新操作都会引起版本号的变化,版本有点和我们经常使用的乐观锁类似。这里有两个概念说一下,一个是乐观锁,一个是悲观锁。
悲观锁:是数据库中一种非常典型且非常严格的并发控制策略。假如一个事务A正在对数据进行处理,那么在整个处理过程中,都会将数据处于锁定状态,在这期间其他事务无法对数据进行更新操作。
乐观锁:乐观锁和悲观锁正好想法,它假定多个事务在处理过程中不会彼此影响,因此在事务处理过程中不需要进行加锁处理,如果多个事务对同一数据做更改,那么在更新请求提交之前,每个事务都会首先检查当前事务读取数据后,是否有其他事务对数据进行了修改。如果有修改,则回滚事务再回到zookeeper,version属性就是用来实现乐观锁机制的“写入校验”。
1.3.2watcher机制zookeeper提供了分布式数据的发布/订阅功能,zookeeper允许客户端向服务端注册一个watcher监听,当服务端的一些指定事件触发了watcher,那么服务端就会向客户端发送一个事件通知。zookeeper提供以下几种命令来对指定节点设置监听。
get[-s][-w]path:监听指定path节点的修改和删除事件。同样该事件也是一次性触发。
get-w/node在其他窗口执行下面命令,会触发相关事件create/node/node1delete/node/node1
stat[-w]path:作用和get完全相同。
addWatch[-mmode]pathThenumberofmillisecondsofeachticktickTime=2000synchronizationphasecantakeinitLimit=10singarequestandgettinganacknowledgementsyncLimit=5donotuse/tmpforstorage,/tmphereisjust修改路径dataDir=D:\\\\datatheportatwhichtheclientswillconnectclientPort=2181increasethisifyouneedtohandlemoreclientsadministratorguidebeforeturningonautopurge."0"todisableautopurgefeature增加下面两条setJAVA=D:\ProgramFiles(x86)\_111\bin\javasetJAVA_HOME=D:\ProgramFiles(x86)\_111
启动
1.4.2Centos7集群版1.4.2.1环境准备IP
hostname
部署资源
192.168.8.74
jt2
zookeeper
192.168.8.75
jt3
zookeeper
192.168.8.76
jt4
zookeeper
1、修改主机名:
2、配置名字解析IP:分别修改三台服务器的的/etc/hosts文件,添加如下映射:
3、重启:reboot
4、免密登录:生成秘钥:(jt执行)
分发密钥至各机器节点
ssh-copy-idroot@jt2ssh-copy-idroot@jt3ssh-copy-idroot@jt4
修改管理节点上的~/.ssh/config(当前用户目录下的.ssh/config)文件,简化SSH远程连接时的输入信息:
管理节点是会有root和cuser多个用户,ssh远程连接默认会以当前用户身份进行登陆,如果我们是root身份进行远程连接,还是需要输入密码,我们可以修改配置使用root远程连接时也不用输入密码。
切换root身份,suroot
编辑config
vi~/.ssh/config
添加如下内容:(这里的配置一定要注意前面的空格,否则会报错)
Hostjt2Hostnamejt2UserrootHostjt3Hostnamejt3UserrootHostjt4Hostnamejt4Userroot
修改文件权限:
chmod600~/.ssh/config
如果没有权限的话:
先进入~目录:cd~创建.ssh目录:创建config文件viconfig
禁用SELINUX:
vi/etc/selinux/configSELINUX=disabled
5、互相免密
在其他两台服务器上重复上面的操作
1.4.2.2zookeeper部署软件
版本
安装节点
下载地址
jdk
jt2、jt3、jt4
zookeeper
jt2、jt3、jt4
三台服务器都要操作
1、防火墙关闭
设置开机启用防火墙:设置开机禁用防火墙:启动防火墙:systemctlstartfirewalld关闭防火墙:systemctlstopfirewalld检查防火墙状态:systemctlstatusfirewalld
2、解压
3、更改文件夹名称
/zookeeper
4、拷贝配置文件
cd/usr/local/jingtian/zookeeper/confcpzoo_
=/usr/local/jingtian/zookeeper/=60=1=jt2:2888:3888=jt3:2888:3888=jt4:2888:3888
①、tickTime:基本事件单元,这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔tickTime时间就会发送一个心跳;最小的session过期时间为2倍tickTime
②、dataDir:存储内存中数据库快照的位置,除非另有说明,否则指向数据库更新的事务日志。注意:应该谨慎的选择日志存放的位置,使用专用的日志存储设备能够大大提高系统的性能,如果将日志存储在比较繁忙的存储设备上,那么将会很大程度上影像系统性能。
③、client:监听客户端连接的端口。
④、initLimit:允许follower连接并同步到Leader的初始化连接时间,以tickTime为单位。当初始化连接时间超过该值,则表示连接失败。
⑤、syncLimit:表示Leader与Follower之间发送消息时,请求和应答时间长度。如果follower在设置时间内不能与leader通信,那么此follower将会被丢弃。
⑥、=B:C:D
A:其中A是一个数字,表示这个是服务器的编号;
B:是这个服务器的ip地址;
C:Zookeeper服务器之间的通信端口;
D:Leader选举的端口。
我们需要修改的第一个是dataDir,在指定的位置处创建好目录。
第二个需要新增的是=B:C:D配置,其中A对应下面我们即将介绍的myid文件。B是集群的各个IP地址,C:D是端口配置。
5、创建dataDir目录,这个目录的地址要跟里面配的地址一致
mkdirdata
6、在dataDir目录下创建myid文件
vimyid
然后在该文件中写入服务器编号,jt2服务器写0
7、配置环境变量
vi/etc/profile
exportZK_HOME=/usr/local/jingtian/zookeeperexportPATH=$PATH:$ZK_HOME/bin
8、执行:source/etc/profile
9、启动服务
启动:./停止:./重启:./查看集群节点状态:./批量启动将复制到/user/local/jingtian/目录下执行:则就会启动
10、
所有机器都需要配置这个=jt5:2888:3888:observer
最后一个配置=jt5:2888:3888:observer,需要在所有节点都增加。
1.4.3源码编译1.4.3.1单机版然后针对各个目录这里我来解释一下,先了解下为下一章了解源码做个准备:
文件
说明
bin
包含访问zookeeper服务器和命令行客户端的脚本
conf
启动zookeeper默认的配置文件目录
zookeeper-assembly
基础服务打包目录
zookeeper-client
客户端,目前只支持c
zookeeper-contrib
附加的功能,比如zookeeper可视化客户端工具
zookeeper-docs
zookeeper文档
zookeeper-it
供fatjar使用,进行系统测试依赖的类
zookeeper-jute
zookeeper序列化组件
zookeeper-recipes
zookeeper提供的一些功能例子,包括选举election,lock和queue
zookeeper-server
zookeeper服务端
1、导入到ideal中
2、在zookeeper-server的resources目录下添加文件
构建时间=2022-08-02
3、然后通过maven编译
4、复制配置文件
ThenumberofticksthattheinitialThenumb=/tmp/=60=1
5、修改zookeeper-server的pom文件
6、修改启动参数
VMoptions中是conf中文件的全部经
7、然后启动ZookeeperServerMain
源码的启动流程这里简单说一下
1、启动ZookeeperServerMain的main方法
publicstaticvoidmain(String[]args){ZooKeeperServerMainmain=newZooKeeperServerMain();//核心流程(args);}protectedvoidinitializeAndRun(String[]args)throwsConfigException,IOException,AdminServerException{//核心流程runFromConfig(config);}publicvoidrunFromConfig(ServerConfigconfig)throwsIOException,AdminServerException{//StartAdminserver//启动服务管理器(JettyAdminServer)-启动JettyadminServer=();(zkServer);//这是启动Jetty容器();booleanneedStartZKServer=true;if(()!=null){//cnxnFactory负责zk的网络请求,createFactory中//从系统配置中读取ZOOKEEPER_SERVER_CNXN_FACTORY,默认是没有这个配置的,因此默认是使用NIOServerCnxnFactorycnxnFactory=();//0.0.0.0/0.0.0.0:2181,单个客户端连接数超过限制,请求的传入连接队列的最大长度,-1不限制((),(),false);//这才是启动ZookeeperServer服务的核心逻辑(zkServer);//'tneedtostartitagaininsecureCnxnFactory.//是否需要启动Zookeeper服务,Zookeeper服务已经启动了,不需要再次启动,设置为falseneedStartZKServer=false;}}2、
publicvoidstartup(ZooKeeperServerzks,booleanstartServer)throwsIOException,InterruptedException{//NIO启动对应线程,四种线程start();//设置Zookeeper的ServerCnxnFactory(客户端与服务端进行通信的对象,就是当前对象NIOServerCnxnFactory)setZooKeeperServer(zks);if(startServer){//加载会话和数据();//启动Zookeeper服务,在这里会创建一个SessionTrackerImpl线程,并执行该线程//这个线程就是用来管理Session的属性的//同时也会构建核心业务调用链();}}publicsynchronizedvoidstartup(){//创建Session的核心管理线程SessionTrackerImplif(sessionTracker==null){createSessionTracker();}//启动SessionTrackerImpl线程startSessionTracker();//构建核心业务调用链setupRequestProcessors();registerJMX();//设置zkserver的状态为运行setState();notifyAll();}1.4.3.2集群版1、在单机的基础之上增加启动类
2、在conf目录下增加配置文件、、,配置如下
ThenumberofticksthattheinitialThenumb=D:/桌面/景天/idealwork/Zookeeper//data/zkdata1集群配置=127.0.0.1:12881:13881=127.0.0.1:12882:13882=127.0.0.1:12883:13883
ThenumberofticksthattheinitialThenumb=D:/桌面/景天/idealwork/Zookeeper//data/zkdata2集群配置=127.0.0.1:12881:13881=127.0.0.1:12882:13882=127.0.0.1:12883:13883
ThenumberofticksthattheinitialThenumb=D:/桌面/景天/idealwork/Zookeeper//data/zkdata3集群配置=127.0.0.1:12881:13881=127.0.0.1:12882:13882=127.0.0.1:12883:13883
3、建立zkdata1、zkdata2、zkdata3目录,并增加相应文件
4、启动QuorumPeerMain1、QuorumPeerMain2、QuorumPeerMain3
因为我的myid的目录是带有中文的,所以会报错
for(Objectkey:()){Objectvalue=(key);(key,newString(().getBytes("ISO8859-1"),"UTF-8"));}下文预告了解Zookeeper原生核心API的使用
掌握Curator的使用
很赞哦!(199)