阶段一,执行事务node
阶段二,提交事务git
中断事务阶段github
2PC的缺点算法
阶段一,CanCommit,事务询问数据库
阶段二,PreCommit,事务预提交apache
阶段三,DoCommit,真正的事务提交编程
中断事务阶段缓存
3PC优缺点服务器
拜占庭将军问题,拜占庭帝国的不一样军队处于不一样的地理问题,他们之间只能经过通信员进行通信,可是通信员是不可靠的,可能篡改消息网络
因为加密算法和校验算法的出现,全部实际的分布式系统之间的通信,不存在数据被篡改的可能。
ZooKeeper能够作什么
能够基于它实现负载均衡、集群管理、Master选举、分布式队列、分布式锁、命名服务、数据发布/订阅等功能
Zookeeper能保证的分布式一致性特性
Zookeeper的设计目标
Zookeeper的基本概念
全部事务请求都由Leader服务器来处理分发,若是集群中的其余服务器收到了来自客户端的请求,这些非Leader服务器会首先将这个事务请求转发给Leader服务器,Leader负责将请求封装成Proposal(提议)分发给集群中全部Follower,一旦收到超过半数的正确反馈,Leader就会再次向全部的Follower分发Commit消息,要求他们将前一个Prosocal提交
两种基本模式:崩溃恢复模式和消息广播模式
运行分析,每个进程都有可能处于如下三种状态之一
直接看个人github代码:https://github.com/leon66666/zookeeper-client
(1)数据发布和订阅
分为推(push)模式和拉(pull)模式,push模式服务端主动把数据更新推送给全部订阅的客户端,而拉模式是由客户端定时轮询拉取的方式来获取最新数据
应用场景:分布式系通通一配置,例如机器列表信息、运行时的开关配置、数据库配置信息等,这些全局配置交给Zookeeper统一管理
这些配置具备如下特色:
(2)负载均衡
DDNS,动态DNS解析。局域网内部通常采用host绑定的方式来进行ip和域名的映射。一旦机器规模变大,这种作法就会至关的不方便。
经过Zookeeper实现,每一个应用均可以建立一个属于本身的数据节点做为域名配置的根节点,在这个节点上,每一个应用均可以将本身的域名配置上去。经过注册Watcher实现域名变动通知功能。
上图为总体的DDNS系统架构。
(3)命名服务
即分布式环境下,生成全局惟一ID的方法。你们通常会联想到UUID,是通用惟一识别码的简称。主流ORM框架HIbernate就有对UUID的直接支持。
可是,UUID有以下缺点:
利用Zookeeper来实现这类全局惟一ID的生成。当客户端建立一个顺序子节点的时候,zookeeper会自动之后缀的形式在其子节点上添加一个序号,利用了zookeeper顺序节点的特性
(4)分布式协调/通知
Zookeeper实现分布式协调通知,一般的作法是不一样的客户端都对Zookeeper上同一个数据节点进行Watcher注册。监听节点数据的变化。
(5)通用的分布式系统机器间通讯方法
分布西系统机器间通讯包括:心跳检测、工做进度报告、系统调度
(6)集群管理
集群管理需求点
传统的基于agent的管理方式,集群中每台机器部署一个agent,负责本机器的监控和向中心系统汇报
利用zookeeper监控集群
zookeeper监控应用:分布式日志收集系统
(7)Master选举
在集群的全部机器中选举出一台机器做为master
(8)分布式锁
最多见的是用数据库实现。例如行锁,表锁,事务处理,乐观锁等等。可是每每分布式系统的性能瓶颈都集中在数据库的操做上。
(9)分布式队列
(1)hadoop。大型分布式计算框架
(2)HBase。是一个面向海量数据的高可靠性、高性能、面向列、可伸缩的分布式存储系统
(3)Kafka。开源的分布式消息系统,是一个吞吐量极高的分布式消息系统。主要用于实现低延迟的发送和收集大量的事件和日志数据。
(4)dubbo
(1)一次会话的建立过程
(2)服务器地址列表
(1)会话状态。整个会话的运行期间,会在不一样的状态之间进行切换。这些状态包括connecting,connected,reconnecting,reconnected,close。
(2)session是zookeeper的会话实体。包含如下属性
(3)会话管理。由SessionTracker负责管理
(4)会话重连
(1)预启动
(2)初始化
(3)leader选举
(4)leader和follower启动期交互过程
(1)选举概述。服务器启动时期的Leader选举
(2)选举概述。服务器运行期间的leader选举
在进行选举的过程当中,每台zookeeper server服务器有如下四种状态:LOOKING、FOLLOWING、LEADING、OBSERVING,其中出于OBSERVING状态的server不参加投票过程,只有出于LOOKING状态的机子才参加投票过程,一旦投票结束,server的状态就会变成FOLLOWER或者LEADER
(3)leader选举的算法分析。3.4.0版本开始,只保留了tcp版本的FastLeaderElection。废弃了LeaderElection和udp版本的FastLeaderElection
(1)会话建立请求
(2)setData请求
(3)事务请求转发。全部非Leader服务器收到了客户端发来的事务请求,都会将请求转发到Leader服务器来处理
(4)getData等非事务请求的流程
(1)内存数据
(2)事务日志
(3)snapshot,数据快照。用来记录Zookeeper服务器某一个时刻的全量内存数据内容,并将其写入到指定的磁盘文件中
(4)初始化。服务器启动期间,会进行数据初始化过程,将磁盘上的数据加载到内存中
(5)数据同步
peerLastZxID:该follower服务器最后处理的Zxid
minComminttedLog :Leader服务器提议缓存队列ComminttedLog中最小的Zxid
maxComminttedLog:Leader服务器提议缓存队列ComminttedLog中最大的Zxid
(1)基本配置。必需配置
(2)高级配置
(1)开启远程JMX
经过上述配置,就能够容许远程机器和zookeeper服务器进行jmx链接了
(2)经过JConsole链接zookeeper
JConsole是一个Java内置的基于JMX的图形化管理工具,是最经常使用的JXM链接器。
TaoKeeper监控系统,能够在实时监控和数据统计两方面保障Zookeeper的稳定性。github地址:https://github.com/alibaba/taokeeper
(1)集群组成。最好的数量是奇数,不过偶数能够的
(2)容灾。三机房部署,2机房部署
(3)扩容与缩容。Zookeeper集群扩容须要整个集群机器的重启。总体重启和逐台重启