基础知识
- ZNode
持久节点:创建一直存在
临时节点:客户端关闭,则节点被移除
有序节点:创建时自动在节点名跟上自增的整形数字。可以创建同名的节点。
无序节点:不能创建同名节点 - ACL权限机制
分三个维度:
schema,id,permission
schema:world,auth,digest,ip
permission:create,read,write,delete,admin(设置子节点的权限) - Watcher监听
-
原生客户端:
- new ZooKeeper(connectAddr, sessionTimeout, watcher);
- 由于zookeeper的监控都是一次性的,所以每次必须设置监控。
- EventType:None(成功连上服务器)、NodeCreated、NodeDataChanged、NodeChildrenChanged、NodeDeleted ZkClient:
- subscribeDataChanges
- subscribeChildChanges Curator:
- client.getData().usingWatche().forPath(),一次性监听
- PathChildrenCache,监听路径下子节点的变动
- NodeCache,监听本节点的变动
- TreeCache,两者结合
分布式一致性问题
-
CAP理论
一致性、可用性、分区容错性
特点:一个分布式系统最多只能同时满足其中的两项,分区容错性不能放弃。 -
BASE理论
基本可用(卡顿、降级)、软状态(排队)、最终一致性
-
2PC算法
两阶段提交:第一阶段,执行事务,写undo、redo日志,但是没有进行提交;事务管理器进行统一提交操作。要么都成功,要么都失败。多用于数据库分布式事务。
缺点:同步阻塞、单点问题、数据不一致、容错性不好。事务管理器崩溃则导致单点问题和数据不一致的情况发生。 -
3PC算法
增加第一步,询问所有节点是否健康正常运行。
-
Paxos算法
角色:提议者、接收者。
原则:少数服从多数、角色轮换。 -
ZAB协议
角色:Leader(处理读写请求、参与投票)、Follower(处理读请求、写请求交给Leader,参与投票)、Observer(处理读请求,不参与投票)
状态:LOOKING(当前集群没有产生Leader)、LEADING、FOLLOWING、OBSERVING
包括2种模式:崩溃恢复(Leader选举)、消息广播(提案投票)
-
崩溃恢复:
- 节点启动时,会先投自己一票,投票信息(myid,ZXID)
- 收集各个节点的投票
- 处理投票(比较ZXID、myid、界号)并更新投票信息,进行第二次投票
- 统计投票,超过半数接收到同样的投票信息,则确定Leader
- 改变服务器状态 消息广播:
- Leader接收到事务请求后,给消息提供一个自增ID,实现有序。
- 通过先进先出队列把提案分发给follower
- follower收到提案,写到本地,并返回ack
- Leader把ack加入到AckSet中,超过半数ack数量之后,则会触发本身commit操作,并会向follower发送commit消息。
应用场景
-
分布式锁
第一种实现:
尝试创建lock临时节点,成功则拿到锁,失败则阻塞,通过监听节点是否删除,删除则重新尝试拿锁。
缺点:羊群效应,所有节点都会触发删除监听事件,去争夺一把锁。第二种实现:
尝试创建lock临时有序节点,获得所有临时节点,进行升序排序,如果当前节点排第一个则返回成功,不是则找到本身节点的前一个节点,通过监听前一个节点是否删除,删除则重新尝试拿锁。
区别:创建的是临时有序节点,只需要判断当前节点的前一个节点是否有删除变动。 -
服务注册与发现
服务注册:创建临时有序节点,value包含ip和端口信息。
服务发现:从服务器端拿到所有服务列表,通过监听子节点变化来更新服务列表。
负载:通过算法选择服务列表中的服务。