1、分布式协调技术主要用来解决分布式环境中多个进场之间的同步控制,让他们有序的去访问某种临界资源,方式早餐"脏数据的后果"。
2、为了防止分布式系统中各个进程之间相互干扰,我们需要一种分布式协调技术进行调度,这个分布式协调的核心是分布式锁技术。
1、在分布式环境中应该能保证一个方法在同一时间只能被一个线程执行。
2、高可用的获取和释放锁。
3、高性能的获取和释放锁。
4、具备可重入的特性。
5、具备锁失效机制,防止死锁。
6、具备非阻塞特性,即没有获取到锁则直接返回获取锁失败。
1、zookeeper是一种分布式协调服务,用于管理大型主机。他能是开发人员可以专注于实现逻辑,而不用担心实现特性。
2、数据模型很想数据结构中的二叉树,也很想文件系统中的目录。
3、树是由节点所组成,zookeeper也是基于节点,名称为znode。
4、但是不同于树,而是使用路径来访问,类似目录 如 /动物/猫
5、znode的组成
6、zookeeper规定,每个节点最多只能存储1Mb数据。
7、zookeeper操作
create
delete
exist
getData
getChild
8、事务实现,时间通知,watch
,类似观察者模式。发生操作的时候,会触发客户端的异步通知。
可以把Watch看成是特定操作的事件通知,当我们执行zookeeper的操作命令时,会自动触发反馈。
具体的操作如下,如调用 getData
方法,watch参数是true
,服务端接收到请求,并且获取相关数据,在哈希表中插入相应的路径。
1、为了防止单机模式宕机的风险,集群的Zookeeper采用的一主多从的工作模式。在更新数据时,请求首先会更新到主节点,然后再同步到各个子节点。
2、Zookeeper采用ZAB(Zookeeper Atomic Broadcast)的方式进行数据同步。
3、ZAB模式下的三种状态
4、最大ZXID:节点本地最大的事务编号。包含epoch和计数两部分。
5、ZAB的奔溃恢复。假如主节点奔溃了,Zookeeper会自动选举新的主节点。此时集群中的节点处于Looking状态,它们会各自发起投票,投票中包含自己的服务器ID和最新的事务ZXID。节点会将接收到的ZXID与自己的ID进行比较,如果比自己大,说明对方的数据比较新,然后继续进行投票。投给目前自己已知的最大节点ID。每次投票完了之后,Zookeeper会自动统计票数,得到票数至少达到一半以上,则选择其成为准Leader。只有超过半数的子节点回复已经知道ACK的信息,正式确认准Leader为Leader。
首先客户端发送写入数据给任意一个Follower。
Follower请求写入数据转发给Leader。
Leader 采用二阶段提交的方式,发送purpose广播给Follower。
Follower接收到 Purpose,写入日志,发送ACK给Leader。
Leader接收到半数以上的ACK,返回成功给客户端,并且广播Commit请求给Follower。
Znode分为四种节点,包括临时节点、临时顺序节点、持久节点、持久顺序节点。顺序节点的意思是自动给节点添加一个编号,使之有序。
Zookeeper有三种部署方式,包括单机部署、集群部署、伪集群部署。
注:集群伪大于等于三个节点,如3,5,7,9,为奇数。
docker-compose.yml
version: '3.1'
services:
zoo1:
image: zookeeper
restart: always
hostname: zoo1
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888
version: '2'
services:
zoo1:
image: zookeeper
restart: always
container_name: zoo1
ports:
- "2181:2181"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo2:
image: zookeeper
restart: always
container_name: zoo2
ports:
- "2182:2181"
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo3:
image: zookeeper
restart: always
container_name: zoo3
ports:
- "2183:2181"
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
# docker exec -it zookeeper_zoo1_1 /bin/bash
# cd bin/
# ls -al
# ./zkServer.sh status
Mode: follower
1 、配置文件路径 /conf/zoo.cfg
clientPort=2181
dataDir=/data
dataLogDir=/datalog
tickTime=2000
配置文件路径 /con/zoo.cfg
clientPort=2181
dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purInterval=0
maxClientCnxns=60
server.1=192.169.0.1:2888:3888
server.2=192.169.0.2:2888:3888
server.3=192.169.0.3:2888:3888
# zkCli.sh -server localhost:2181