分布式开源协调服务之zookeeper(单节点和集群)
简介:
ZooKeeper是源代码开放的分布式协调服务,由雅虎创建,是Google的开源实现。ZooKeeper是Apache的子项目,之前是Hadoop项目的一部分,使用Java实现。
Zookeeper作用:
假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐一的去修改,非常麻烦。如果把这些配置全部放到zookeeper当中,保存在某个目录节点,然后所有相应的程序对这个目录节点进行监听,一旦信息发生变化,每个程序就会收到zookeeper的通知,然后通过zookeeper获取新的配置信息应用到系统当中
分布式系统中zookeeper实现配置管理+集群管理:
https://www.cnblogs.com/iforever/p/9095095.html
优点:
1、客户端发起事务请求,请求的结果在整个Zookeeper集群中所有的机器上的应用情况是一致的
2、同时能够保证客户端请求的顺序,,每个请求都会分配全局且唯一的递增编号。此编号的作用反映了事务操作的先后顺序。
3、全部数据保存在内存中,直接服务于所有的非实物请求。其中读的操作场景性能非常优秀
应用场景:
主要用于Hadoop、Storm、消息中间件、RPC服务框架、分布式同步系统,不适合存储大量的数据。
**
Zookeeper工作原理
1、ZooKeeper的核心是广播,这个机制保证了各个Server之间的同步。
2、实现这个机制的协议叫做Zab协议。
3、Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。
4、当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader(单机)的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。
5、为了保证事务的顺序一致性,ZooKeeper采用了递增的事务id号 (zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。
ZooKeeper官网地址
http://zookeeper.apache.org/doc/current/zookeeperOver.html
ZooKeeper安装
& ZooKeeper的安装包括单机模式安装,以及集群模式安装。
& 单机模式较简单,是指只部署一个zk进程,客户端直接与该zk进程进行通信。
& 在开发测试环境下,通过来说没有较多的物理资源,因此我们常使用单机模式。当然在单台物理机上也可以部署集群模式,但这会增加单台物理机的资源消耗。故在开发环境中,我们一般使用单机模式。
& 但是要注意,生产环境下不可用单机模式,这是由于无论从系统可靠性还是读写性能,单机模式都不能满足生产的需求。
所需软件:
1.下载地址:apache-zookeeper-3.5.5-bin.tar.gz
https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/apache-zookeeper-3.5.5-bin.tar.gz
2.jdk-8u171-linux-x64.tar.gz 网盘:两个版本随意拿取
链接:https://pan.baidu.com/s/190wXWHGEpKONlPnOYe6ZZw
提取码:732q
[root@cong11 ~]# ls
apache-zookeeper-3.5.5-bin.tar.gz jdk-8u171-linux-x64.tar.gz
1、配置hosts
[root@cong11 ~]# vim /etc/hosts
地址 和 名称 #对应
2、部署jdk
由于zookeeper依赖java环境,所以我们需要安装jdk,官网建议最低安装jdk 1.8版本
1、解压jdk
[root@cong11 ~]# tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/
2、配置jdk环境变量
[root@cong11 ~]# vim /etc/profile #在文件最后加入一下行
JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
3、刷新变量
[root@cong11 ~]# source /etc/profile #使环境变量生效
4、查看java环境
[root@cong11 ~]# java -version
3、部署ZooKeePer
1、解压安装包
[root@cong11 ~]# tar -zxf apache-zookeeper-3.5.5-bin.tar.gz -C /usr/local/
2、创建快照日志存放目录
[root@cong11 ~]# mkdir -p /data/zk/data
3、创建事务日志存放目录
[root@cong11 ~]# mkdir -p /data/zk/datalog
【注意】:如果不配置datalog,那么事务日志也会写在data目录中。这样会严重影响zk的性能。因为在zk吞吐量很高的时候,产生的事务日志和快照日志太多。
4、生成配置文件
[root@cong11 ~]# cd /usr/local/apache-zookeeper-3.5.5-bin/conf/
[root@cong11 conf]# ls
configuration.xsl log4j.properties zoo_sample.cfg
[root@cong11 conf]# cp zoo_sample.cfg zoo.cfg
#复制一份zoo_sample.cfg文件并命名为zoo.cfg
5、修改主配置文件zoo.cfg
[root@cong11 conf]# vim zoo.cfg
dataDir=/data/zk/data #修改这一行为我们创建的目录
dataLogDir=/data/zk/datalog #添加这一行
6、添加path环境变量
这里必须是修改配置文件添加path环境变量,不然启动报错
[root@cong11 ~]# vim /etc/profile #将以下变量添加至最后一行
export ZOOKEEPER_HOME=/usr/local/apache-zookeeper-3.5.5-bin
export PATH=$ZOOKEEPER_HOME/bin:$PATH
[root@cong11 ~]# source /etc/profile
7、启动Zookeeper
[root@cong11 ~]# zkServer.sh start #以下是输出结果
ZooKeeper JMX enabled by default
Using config: /usr/local/apache-zookeeper-3.5.5-bin/bin/../conf/zoo.cfg
Starting zookeeper ... already running as process 2058.
8、验证
[root@cong11 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/apache-zookeeper-3.5.5-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone
可以看到端口,我们是单节点部署(standalone)
9、启动客户端:
[root@cong11 ~]# zkCli.sh
常用的命令
1、使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]
2、创建一个新的 znode ,使用 create /zkPro myData
[zk: localhost:2181(CONNECTED) 2] create /zkPro myData
Created /zkPro
[zk: localhost:2181(CONNECTED) 3] ls / #再次查看内容
[zkPro, zookeeper]
3、使用 get 命令获取的znode中的字符串
[zk: localhost:2181(CONNECTED) 4] get /zkPro
myData
4、使用set命令修改字符串
[zk: localhost:2181(CONNECTED) 5] set /zkPro myData2
[zk: localhost:2181(CONNECTED) 6] get /zkPro
myData2
5、删除创建的znode
[zk: localhost:2181(CONNECTED) 7] delete /zkPro
[zk: localhost:2181(CONNECTED) 8] ls /
[zookeeper] #可以看见我们创建的/zkPro被删除
了解编程人员使用zookeeper
网址:https://blog.csdn.net/dongdong9223/article/details/81349965
ZooKeePer集群搭建
Zookeeper节点部署越多,服务的可靠性越高,建议部署奇数个节点,因为zookeeper集群是以宕机个数过半才会让整个集群宕机的。
搭建集群可以选择在一台真实机上搭建多台zookeeper服务这种伪集群模式,我们这里选择在3台虚拟机上搭建zookeeper集群,测试环境可以使用伪集群模式,(生产环境不能使用)。
1、三台环境同时部署
[root@centos1 ~]# ls
apache-zookeeper-3.5.5-bin.tar.gz jdk-8u181-linux-x64.tar.gz
2、配置hosts文件(依次更改hosts主机名)
[root@localhost ~]# hostnamectl set-hostname centos1、2、3
[root@centos1 ~]# vi /etc/hosts #添加主机和名称对应
192.168.1.10 centos1
192.168.1.20 centos2
192.168.1.30 centos3
3、解压jdk,配置环境变量
[root@centos1 ~]# tar xf jdk-8u181-linux-x64.tar.gz
[root@centos1 ~]# vim /etc/profile 在最后一行添加
JAVA_HOME=/root/jdk1.8.0_181
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
[root@centos1 ~]# source /etc/profile
[root@centos1 ~]# java -version ##查看java环境
4、解压ZooKeePer
[root@centos1 ~]# tar -zxf apache-zookeeper-3.5.5-bin.tar.gz -C /usr/local/
[root@centos1 ~]# mkdir -p /data/zk/data #创建快照存放目录
[root@centos1 ~]# mkdir -p /data/zk/datalog #创建事务存日志放目录
5、生成配置文件
[root@centos1 ~]# cd /usr/local/apache-zookeeper-3.5.5-bin/conf/
[root@centos1 conf]# ls
configuration.xsl log4j.properties zoo_sample.cfg #模板文件需要更改
[root@centos1 conf]# cp zoo_sample.cfg zoo.cfg 这样的话配置文件就生效了
6、修改zoo.cfg主配置文件
[root@centos1 conf]# vi zoo.cfg
dataDir=/data/zk/data #修改这一行为我们创建的目录
dataLogDir=/data/zk/datalog #添加这一行
##在最后一行添加以下参数,和主机名要一致
server.1=contos1:2888:3888
server.2=contos2:2888:3888
server.3=contos3:2888:3888
#server.服务编号=服务地址、LF(集群之间)通信端口、leader选举端口
启动集群
Centos1上操作:(一会这台centos1服务器会成为主,可以这么理解)
[root@localhost ~]# echo 1 > /data/zk/data/myid //设置id号为1
[root@localhost ~]# zkServer.sh start //启动
[root@centos3 ~]# netstat -anput|grep 2181
Cetos2上操作:
[root@centos2 ~]# echo 2 > /data/zk/data/myid //id为2
[root@centos2 ~]# zkServer.sh start
[root@centos3 ~]# netstat -anput|grep 2181
Centos3上操作:
[root@centos3 ~]# echo 3 > /data/zk/data/myid //id为3
[root@centos3 ~]# zkServer.sh start
[root@centos3 ~]# netstat -anput|grep 2181
centos1为主(可以理解为谁先启动,谁是主)
那么如果主坏了,其他的服务器会对比id号进行选主(id号谁大,谁是主)
#如果不会像以上说法一致,只有一种情况(有缓存)
如果主从切换跟原理不一致的时候,删除缓存 Rm -rf /data/zk/datalog/* # Rm -rf /date/zk/date/version-2 你在主从任何节点,删除或者写三台都会同步。他们是协调kafka集群的
查看状态
**设置开机启动**
[root@centos1 etc]# echo "zkServer.sh start" >> /etc/rc.local
[root@centos1 etc]# chmod +x /etc/rc.local 加执行权限