? ? ? ? 对于一个分布式系统,不能同时满足以下三点
? ? ? ? ? ? ? ? 一致性(Consistency):对某个指定的客户端来说,读操作保证能够返回最新的写操作结果。(服务A接收请求,将结果同步到服务B上,直到服务B给出正确的响应结果,才将结果返回给用户,服务A阻塞等待牺牲可用性)
????????????????可用性(Availability):非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)。(服务A接收请求处理后,服务B异步完成处理,提高系统性能)
????????????????分区容错性(Partition Tolerance):当出现网络分区后,系统能够继续履行职责。
????????????????
实际的互联网应用中我们一定要选择P,因为分布式系统中我们不可能建立一个网络不出现任何故障的集群;
因此互联网项目中一般是CP应用或者是AP应用;
CP应用:数据分区,所有节点同步完所有数据后给予客户端响应
AP应用:数据分区,接收请求的节点完成数据更新后给予客户端响应(数据同步通过异步或其它形式,若出现同步问题,可以采用补偿的形式保证最终一致性)
AC应用:数据不分区,所有的数据再一个应用上。单体应用;
? ? ? ? ? ? ? ? 基础概念
? ? ? ? ? ? ? ? SID:机器id? ? ? ?
? ? ? ? ? ? ? ? epoch:任期编号? ? ? ?
? ? ? ? ? ? ? ? counter:索引序号(每增加一直值索引序号增加1)
? ? ? ? ? ? ? ? zid:事务id(epoch+counter)
? ? ? ? ? ? ? ? 节点角色
????????????????Leader:通过选举确定一台机器,为客户端提供读写功能
????????????????Follower:提供读功能,参与选举
????????????????Observer:提供读功能,不参与选举,也不参与过半成功策略。因此observer是在不影响写性能下,提升集群的读性能
? ? ? ? ? ? ? ? 选举规则:优先比较zid,在比较SID(zid>SID)
? ? ? ? ? ? ? ? 选举过程
? ? ? ? ? ? ? ? ? ? ? ? 初始化状态(集群初始化):
????????????????????????????????1 节点启动时,epoch以及counter相同,依据SID进行判断,自身节点最大时,想自己投一票并向其它节点拉票;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2 当获得票数超过节点数一半时成为leader;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3 leader将资深epoch节点+1同步给其它节点;并向其它节点发送心跳
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4 新加入的节点加入后即使发现资深SID较大,但已经有leader了,会以follower的身份加入:
? ? ? ? ? ? ? ? 每个节点都是队列维护日志数据;
? ? ? ? ? ? ? ? 1、leader接收数据,保存日志为未提交状态,并将日志同步到follower;
? ? ? ? ? ? ? ? 2、follower接收请求后保存日志(未提交状态),并告诉leader保存成功;
? ? ? ? ? ? ? ? 3、半数以上follower节点保存成功,leader节点把日志提交,发出提交命令;
? ? ? ? ? ? ? ? 1、新的leader由于zid较大成为leader,新的leader会将自己有的日志未提交的数据同步给follower节点处理掉;
? ? ? ? ? ? ? ? 2、旧的leader将日志存储后没有广播日志就挂了,新任leader没有此条日志,旧的leader启动时以follower启动时再加入集群会将没有广播的那条消息丢弃;
????????