初步认识Zookeeper
单体架构——>分布式架构
单体架构

分布式架构

分布式架构下,当服务越来越多,对应机器的数量越来越多,单靠人工来管理和维护服务及地址的配置地址越来越困难。单点故障开始凸显,一旦服务路由或者负载均衡服务器宕机,依赖它的所有服务均失效。
此时,需要一个能够动态注册和获取服务信息的地方,来统一管理服务名称和其对应的服务器列表,称之为服务配置中心。
服务器配置中心
服务提供者在启动时,将其提供的服务名称、服务地址注册到服务配置中心;
服务消费者通过服务配置中心获得需要调用的服务的机器列表;
通过相应的负载均衡算法,选取其中一台服务器进行调用;
当服务器宕机或下线时,相应的机器需要能够动态的从服务器配置中心移除,并通知相应的服务消费者。否则服务消费者就有可能因为调用到已经失效服务而发生错误。在这个过程中,服务消费者只有在第一次调用时需要查询服务配置中心,然后将查到的信息缓存到本地,后面调用直接使用本地缓存的服务地址列表信息,而不需要重新发起请求到服务配置中心去获取相应的服务地址列表,直到服务的地址列表有变更(机器上线或下线)
中间件
zookeeper 、eurek、consul、Apollo
zookeeper 是一个开源的分布式协调服务,由雅虎公司创建,是google chubby的开源实现。zookeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来, 构成一个高效可靠的原语集(由若干条指令组成的,完成 一定功能的一个过程),并且以一些简单可用的接口提供给用户使用 zookeeper。
tar -zxvf 解压
cp zoo_sample.cfg zoo.cfg
zoo.cfg
dataDir 表示数据文件存放的路径
启动zookeeper 服务端
cd zookeeper-3.4.10/bin/
sh zkServer.sh start
启动动zookeeper 客户端
sh zkCli.sh
常用命令
帮助
help
启动ZK服务:
bin/zkServer.sh start
查看ZK服务状态:
bin/zkServer.sh status
停止ZK服务:
bin/zkServer.sh stop
重启ZK服务:
bin/zkServer.sh restart
连接服务器
zkCli.sh -timeout 0 -r -server ip:port
示例代码
创建orderservice节点 value 为0
create /orderservice 0
查看节点
ls /
查看orderservice 节点
ls /orderservice
在orderservice 下创建节点
create /orderservice/wsdl 1
删除节点(删除必须一层一层的删除)
delete /orderservice/wsdl
获取数据
get /orderservice
创建/orderservice/wsdl节点,value 为wrh
create /orderservice/wsdl wrh
获取节点的值
get /orderservice/wsdl
创建节点
-s:顺序节点 SEQUENCE
-e:临时节点 EPHEMERAL
创建临时节点
create -e /temp temp
临时节点,会话断开,临时节点会消失
创建有序节点
create /seq seq
create -s /seq/ 1
/seq/0000000002
create -s /seq/ 2
/seq/0000000002
查看有序节点
ls /seq[0000000001, 0000000000, 0000000003, 0000000002]
加入事件
get /wrh true
set /wrh value
三台机器分别修改zoo.cfg
修改端口
格式:server.id =IP:PORT:PORT
server.1 =192.168.15.134:8888:9999
server.2 =192.168.15.139:8888:9999
server.3 =192.168.15.140:8888:9999
8888 :访问zookeeper 的端口
9999: 重新选举leader 的端口
server.id =ip:port1 :port2
-
id 是一个数字,表示这个是第几号服务器, 指的是server ID,用来标识该机器在集群中的机器序号
-
ip 是这个服务器的ip地址
-
port1 表示的是这个服务器与集群中的leader服务器交换信息的端口
-
port2 表示的是万一集群中的leader 服务器挂了,需要一个端口来重新选举,选出一个新的leader, 而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于ip 是一样的,所以不同的zookeeper 实例通信端口不能一样,所以要给他们分配不同的端口。
集群模式下,每台机器都需要感知到整个集群是由哪几台服务器组成的,在配置文件中,需要将所有的zookeeper 服务器实例进行添加。如:server.id =ip:port1 :port2
在datadir 目录,新建myid
在每台zookeeper 机器上,我们都需要在数据目录(dataDir)下创建一个myid 文件,内容为每台机器的server id 数字,如server.1 的myid 文件内容就是1. 必须确保每个服务器的myid 文件中的数字不同,并且和自己所在机器的zoo.cfg 中的server.id 保持一致,id的范围1-255
集群时启动zookeeper 可能会出现异常
java.net.NoRouteToHostException: 没有到主机的路由 (Host unreachable)
需关闭防火墙
systemctl stop firewalld
tickTime =2000
初始化 10个tickTime, 最大同步初始化时间
initLimit=10
Leader 和follower 心跳检测的一个最大延迟
syncLimit=5
数据文件目录
dataDir =/tmp/zookeeper
对外开放的客户端端口
clientPort=2181
http://zookeeper.apache.org/doc/r3.4.10/zookeeperStarted.html
如果没有修改过的话,创建事务id 和 更新事务id 是一样的
cZxid = 0x100000004 //创建事务idctime = Sun Dec 16 03:21:30 CST 2018
mZxid = 0x100000004 //更新事务id
mtime = Sun Dec 16 03:21:30 CST 2018
pZxid = 0x100000004 //子节点最后一次修改的事物id ,只有子节点变更以后才会产生pxid的影响
cversion = 0 //乐观锁的概念 当前节点的子节点的版本号
dataVersion = 0 //当前数据内容的版本号
aclVersion = 0 //当前节点ACL权限变更的版本号 这个三个版本号用来控制数据的并发性的
ephemeralOwner = 0x0 //创建临时节点才会有的 绑定当前会话的信息
dataLength = 1 //当前数据的长度
numChildren = 0 //当前子节点的数量
ACL 权限控制,类似linux 权限控制
CREATE/READ/WRITE/DELTE/ADMIN
-
同级节点的唯一性
-
临时节点和持久化节点
-
在会话建立的会话周期中,创建的临时节点,会话结束后会自动删除
-
-
有序节点和无序节点
-
节点会存在父子关系,必须有先后
-
临时节点下不能存在子节点







浙公网安备 33010602011771号