是一个硬件或软件组件分布在不同的网络计算机上,彼此之间通过消息传递进行通信和协调系统。
分布式系统的特点:
分布性对等性并发性缺乏全局时钟故障总是会发生分布式环境的各种问题:
通信异常网络分区(俗称脑裂)三态(成功、失败、超时)节点故障分布式系统-CAP定理
分区容错性一致性可用性一致性和可用性平衡方案:最终一致性,案例:zookeeperzookeeper优点:
开源、免费高效、可靠的解决数据一致性问题工业界大型分布式系统官方应用简单易用zookeeper特性:
最终一致性:保证最终数据能够达到一直,这是zookeeper最重要的功能顺序性:从一个客户端发起的事务请求,最终会严格地按照其发送顺序被应用到zookeeper可靠性:一旦服务器成功的应用一个事务,并完成了客户端的相应,那么该事务所引起的服务端状态变更将被一直保留下去实时性:zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口原子性:一次数据更新要么成功,要么失败单一试图:无论客户端连接哪个服务器,看到的数据模型都是一致的zookeeper架构
zookeeper角色:
leader:更新系统状态,处理事务请求,负责进行投票的发起和决议follower:处理客户端非事务请求并向客户端返回结果,将写事务请求转发给leader,同步leader的状态,选主过程中参与投票observer:接收客户端读请求,将客户端写请求转发给leader,不参与投票过程,只同步leader的状态。目的是为了扩展系统,提高读取速度。clent:请求发起方。zookeeper写入:
数据写入最终一致性核心算法ZAB算法leader负责处理写事务请求follower负责向leader转发写请求,相应leader发出的决议服务器四种状态:
LOOKING:寻找leader状态,处于改状态需要进入选举流程LEADING:领导者状态FOLLOWING:跟随着状态OBSERVER:观察者状态事务id:用ZXID表示,是一个64位的数字,由leader统一分配,全局唯一,不断递增。
zookeeper选举(全新启动期间)
每个server发出一个投票,内容为(myid,ZXID)接收来自各server的投票处理投票统计投票改变服务器状态zookeeper选举(运行期间)
所有server切换状态位LOOKING,每个server发送一个投票,内容为(myid,ZXID)接收来自各server的投票处理投票统计投票改变服务器状态数据模型Znode
zookeeper特有的数据节点znode,视图结构类似linux文件系统,没有目录和文件的概念znode是zookeeper中数据的最小单元znode上可以保存数据,通过挂载子节点构成一个树状的层次化命名空间znode树的根由“/”斜杠开始znode节点类型:
持久节点persistent临时节点ephemeral顺序节点sequential组合节点类型:
持久节点persistent持久顺序节点persistent-sequential临时节点ephemeral临时顺序节点ephemeral-sequentialznode版本:
dataversion:当前数据节点数据内容版本号cversion:当前数据节点的版本号aversion:当前数据节点ACL权限变更版本号如何保证分布式数据原子性操作
悲观锁乐观锁使用version实现乐观锁机制中的写入校验 //获取当前请求中的version version = setDataRequest.getVersion; //获取当前服务器上该数据的最新的version int currentVersion = nodeRecord.stat.getVersion(); if(version != -1 && version != currentVersion){ throw new KeeperException.BadVerrsionException(path); } version = currentVersion + 1;znode状态
统一命名服务
分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同服务; 类似于域名于ip之间对应关系,域名更容易记住;通过名称来获取资源或服务的地址,提供者等信息 按照层次结构组值服务/应用名称 可将服务名称以及地址信息写到zookeeper上,客户端通过zookeeper获取可用服务列表(dubbo) 全局唯一id 依赖zookeeper的顺序节点可以轻松生成全局唯一id配置管理
分布式环境下,配置文件管理和同步是一个常见问题 集群所有节点的配置信息是一直的,比如hadoop对配置文件修改后,希望能够快速同步到各个节点上 配置管理可交给zookeeper实现 可将配置信息写入zookeeper的一个znode上;各个节点监听这个znode一旦znode中的数据被修改,将通知各个节点更新集群管理
分布式系统中,实时掌握每个节点的状态是有必要的 可以根据节点状态做出一些调整 可交由zookeeper实现 将节点信息写入一个znode上监听这个znode可获取它的实时状态变化 节点动态上下线master选举分布式锁
zookeeper是强一致的; 多个客户端同时在zookeeper上创建相同znode,只有一个创建成功。 实现锁的独占性 多个客户端同时在zookeeper上创建相同znode,创建成功的哪个客户端得到锁,其他客户端等待 控制锁的时序 各个客户端在某个znode下创建znode(类型为ephemeral_sequential,临时顺序节点),这样该znode可掌握全局访问时序分布式队列
先入先出队列 队列按照fifo的方式进行入队和出队操作,例如实现生产者和消费者的模型(可用分布式锁实现) 同步队列 当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员全部到达,这就是同步队列一个聚合计算开始之前需要并行计算的很多子任务全部实现才能进行为这个集合计算创建一个znode,同时监听这个znode,其他并行子任务在这个znode下创建要给临时节点,每次znode变化都会发出通知,接收到通知统计子节点个数,直到达到所有的子任务数。