1.master选举
什么是master选举,假设我们有一个系统A,向外提供服务,并且这个服务必须24小时不间断提供,于是我们选择采用集群,master slave的架构方式,集群中有主机,有备机,由主机向外提供服务,备机负责监听主机的状态,一旦主机宕机,备机必须立刻接管主机继续向外提供服务,这种从备机中选出主机的过程就是master选举。
架构:
左边紫色代表zookeeper集群,右边代表三台工作服务器。
它们启动时会首先去Servers节点下创建一个临时节点,并把自己的基本信息写入节点,这个过程叫服务注册;
系统中的其他服务可以获取Servers节点下的字节点列表,来了解当前系统哪些服务器可用,这个过程叫服务发现;
然后这些服务器会尝试去创建Master节点,谁能创建成功,谁就是Master。
所有的备用服务器(slave)必须关注Master节点的删除事件。
程序实现流程:
系统核心类:
LeaderSelectorZkClient:调度类,启动和停止WorkServer
WorkServer:主工作类
RunningData:描述WorkServer
2.数据的发布和订阅
发布订阅模式是一种一对多的关系,多个订阅对象同时监听某一主题对象,这个主题对象在自身状态发生变化时,会通知所有订阅者对象,使它们能够更新自己的状态,发布方可以和订阅方独立封装,独立改变,当一个对象的改变需要同时改变其他对象,而且他不知道具体有多少个对象需要改变时,可以使用发布订阅模式。
发布订阅模式在分布式系统中的典型应用有配置管理和服务发现。
配置管理:如果集群中的机器拥有某些相同的配置,并且这些配置信息需要动态的改变,可以对配置作统一的管理,让这些机器各自订阅配置信息的改变。
服务发现:对集群中的服务上下线作统一管理,每个工作服务器都可以作为数据的发布方,向集群注册自己的基本信息,而让某些监控服务器作订阅方,订阅工作服务器的基本信息。
架构图:
左侧代表zookeeper集群,右侧代表服务器集群,前三个蓝色代表工作服务器,绿色代表管理服务器,最后一个代表控制服务器。
zookeeper中有三类节点
1.Config节点用于配置管理
2.Servers节点用于服务发现,每个Work Server启动时,都会在Server节点下注册一个临时节点
3.command节点
服务器集群:
1.Work Server
可以通过订阅config节点的改变来更新自己的配置
2.Manager Server
通过config节点,下发配置信息
当Monitor,通过监控Servers节点的子节点列表的改变来更新自己内存中工作服务器列表的信息
3.Control Server
通过Control Server由command节点作为中介,来向Manager Server发送控制指令(Control Server向command节点写入命令信息,Manager Server订阅command节点的数据改变事件来监听并执行命令。)
Manager Server 主体流程
Work Server 主体流程
系统核心类
SubscribeZkClient:用于启动WorkServer和ManagerServer
WorkServer:对应WorkServer
ServerConfig:用于记录WorkServer的配置信息
ManageServer:对应ManagerServer
ServerData:用于记录WorkServer的基本信息
3.负载均衡
负载均衡:可以把某种资源的访问,分摊给不同的计算设备,从而减轻单点访问压力。
架构图:
浅紫色代表zookeeper集群,右侧上方两个工作服务器,下面两个代表客户端,每台工作服务器启动都会去zookeeper Servers节点下注册一个临时节点,每台客户端启动都会去Servers节点获取可用工作服务器的列表,并通过负载均衡算法,得出一台工作服务器,并与之建立网络连接,客户端与服务端的网络连接采用netty。
客户端实现流程:
服务端实现流程:
Server端核心类
Server:服务端接口
ServerImpl:服务端实现类
RegistProvider:服务端启动注册过程
DefaultRegistProvider:注册过程实现类
ZookeeperRegistContext:zookeeper上下文
ServerHandler:处理与客户端之间的连接
BalanceUpdateProvide:当有客户端建立连接和断开连接都需要修改负载信息
DefaultBalanceUpdateProvide:实现类
ServerRunner:调度类
Client端核心类
Client、ClientImpl:客户端类
ClientHandle:处理与服务器之间的通讯
BalanceProvider:为客户端提供负载均衡的算法
AbstractBalanceProvider:抽象的实现
DefaultBalanceProvider:默认的实现
ServerData:服务端和客户端公用的类,服务端会把自己的基本信息个负载打包成ServerData放到zookeeper中,客户端需要去服务端拿到信息,取得他的地址和负载信息
ClientRunner:客户端调度类
4.分布式锁
常说的锁事单进程,多线程的锁,在多线程并发编程中,用于线程之间的数据同步,保护共享资源的访问,
而分布式锁指在分布式环境下,保护跨进程,跨主机,跨网络的共享资源,实现互斥访问,保证一致性。
架构图
locker是zookeeper中的一个数据节点,node_1,node_2,node_3,代表locker下的一些列顺序节点,client_1,client_2,client_3代表客户端,Server代表需要互斥访问的服务。
实现思路:在获取锁的时候,在locker节点下创建顺序节点,在释放锁的时候,把自己创建的节点删除。
核心流程图
<h3>5.分布式队列</h3>
左侧为zookeeper集群,右侧为消费者和生产者,生产者在queue节点下创建顺序节点,来存放数据,消费者通过读取这些节点来消费数据。
offer核心流程
poll核心流程
<h3>6.命名服务</h3>
有两个应用方向,一个是,可以利用zookeeper的树形分层结构,可以把系统中各种服务的名称,地址以及目录信息,存放在zookeeper中,需要的时候去zookeeper中读取,另一个是利用zookeeper顺序节点的特性,制作分布式的序列号生成器。