zookeeper出现之前,分布式服务遇到的问题?
一、在分布式项目中,会把项目分成N多个服务,每个服务都会做集群,那么就会出现问题
1.地址如何管理(协议地址的维护)、每个服务部署多台机器就有多个地址(集群)
集群的多个地址如何选择访问哪个地址(负载均衡)
2.集群多台服务(节点)如何保证数据的一致性?
3.怎么保证JOB任务只在一台服务器上执行(幂等性问题)
4.如果群集中某台服务(节点)挂了,其他的节点如何感知并接替任务(心跳检测、选举机制)
5.存在共享资源的安全性(分布式锁的问题)
以上的问题需要分布式协调机制来处理,就出现了zookeeper,zk的特性为分布式协调解决以上问题。
zookeeper是什么?
一、zookeeper是分布式协调工具
二、Zookeeper数据结构 树状存储结构、以节点(znode)方式存储 (相当于文件夹层级)
1.zk以节点的方式存储,那么节点有什么特点?
a)节点有4种类型
持久节点(永久存放在硬盘上)、持久顺序节点(节点上有一个顺序编号)
临时节点(zk会话连接断开就会删除,不能存在子节点)
临时顺序节点
b)同级节点的名称必须唯一(不允许重复),删除节点时必须先删除子节点
2. 节点的结构如图,比如有一个订单服务的集群
image.png
服务地址使用临时节点,与zk连接保持一致,能够动态感知服务的上下线(如果服务挂了会自动删除节点)
三、zk的特性
1.zk能够监听到节点的变化(Watcher机制)
a)如订单服务将服务地址注册到zk上,营销服务可以订阅(Watcher)zk注册中心,监听到订单服务的地址变化(存在哪些服务地址,监听服务地址的变化)
image.png
2.zk的集群是一个leader,多个follower组成的集群方式
a)集群的角色分三种,Leader(能读写(增删改)、Follower(只读)、Observer(特殊的follower,只监听,不参与投票选举(能提高性能),其他和Follower一样,只读)
b)集群时对节点的操作:如果是读请求,可以任意节点处理数据。如果是写请求, 那么请求会转发给Leader去处理。Follower会同步Leader的数据(保证每个节点的数据一致)
c)zk选举:如何Leader节点挂了,会从Follower中重新投票选择作Leader,只要半数通过就可以。
d)zookeeper集群的数目,一般为奇数个
Leader选举算法采用了Paxos协议;
Paxos核心思想:当多数Server写成功,则任务数据写成功如果有3个Server,则两个写成功即可;如果有4或5个Server,则三个写成功即可。
Server数目一般为奇数(3、5、7)如果有3个Server,则最多允许1个Server挂掉;如果有4个Server,则同样最多允许1个Server挂掉由此,
我们看出3台服务器和4台服务器的的容灾能力是一样的,所以为了节省服务器资源,一般我们采用奇数个数,作为服务器部署个数。
3.zk保存节点数据的一致性是通知2pc原理
a)增删改操作时会有事务机制,leader会把事务发给每个Follower节点,Follower节点会给leader一个ack通知(表示能提交事务),leader收到一半以上的Follower的ack通知,就会执行commit提交事务
选举和保证节点数据的一致性原理是zab(zixd、epoch、myid),支持崩溃恢复和原子广播协议
zk的节点特性和集群方式解决了大量分布式出现的问题
1.地址如何管理(协议地址的维护)
a)每个服务的地址都存到zk的节点中,服务只要注册了zk,就能获取到所有的服务地址信息,并且Watcher机制能够快速的感知服务的上下线
2.集群的多个地址如何选择访问哪个地址(负载均衡)?
a)每个服务名称创建一个节点,集群的服务地址存到子节点中,只要找到这地址再进行算法选择一个地址就能实现负载均衡(轮询、随机、权重等策略)
3.集群多台服务(节点)如何保证数据的一致性?
a)zk节点能够能过Watcher机制监动态监听节点的变化,某台机器完成任务修改节点,其他机器就会收到节点通知,进而同步信息。
4.怎么保证JOB任务只在一台服务器上执行(幂等性问题)
a)可通过节点的唯一性,哪台服务创建到节点就执行任务,其他服务不执行
(节点创建成功后,再创建会报错)
5.如果群集中某台服务(节点)挂了,其他的节点如何感知并接替任务(心跳检测、选举机制、高可用)
a)zk的集群机制会进行心跳检测,Leader节点如果检测超过一半以上的Follower感知断开,就会重新选举新的Leader,保证高可用
6.存在共享资源的安全性(分布式锁的问题)
使用zk临时节点(连接断开后就会删除) +事件通知(wacther)
1、使用zk创建临时节点("/path")
2、哪个服务器能创建节点成功,相当于就拿到锁,就能执行任务。用完之后关闭 zk连接(可设置连接多久后关闭zk连接,防止死锁)就会自动删除节点(释放锁)
3、没拿到锁的服务器使用wacther等待(节点被删除就收到通知),收到通知就去获取锁的资源
zookeeper:分布式开源框架,分布式协调工具
应用场景:
1、Dubbo rpc远程调用框架+zookeeper注册中心(服务命名)
zk节点存的就是服务地址(ip+端口号)
2、消息中件间 -- 发布订阅--(用watcher事件通知实现)
zk节点发生改变,都会有事件通知
3、分布式事件通知(用watcher实现)
4、master选举-- 主备
(主服务器先创建节点节点,主挂了,通过事件通知让其他服务器创建节点,谁先创建成功就为主)
5、zookerper分布式锁
(redis和springcloud也能实现分布式锁)
6、使用zookerper分布式配置中心
7、zookeeper实现本地动态负载均衡(Dubbo服务负载均衡原理)
原理 --例:创建it_order父节点,存放127.0.0.1:8080子节点和127..:8081子节点
支付服务调用订单服务,会先获取it_order上所有的子节点(名称就是ip+端口),然后再通过负载均衡算法获取某一下子节点(就是服务的访问地址)
8.消息中间集群管理
activeMQ集群需要用到zookeeper
网友评论