zookeeper出现之前,分布式服务遇到的问题?
一、在分布式项目中,会把项目分成N多个服务,每个服务都会做集群,那么就会出现问题
1.地址如何管理(协议地址的维护)、每个服务部署多台机器就有多个地址(集群)?
集群的多个地址如何选择访问哪个地址(负载均衡)?
2.集群多台服务(节点)如何保证数据的一致性?
3.怎么保证JOB任务只在一台服务器上执行(幂等性问题)?
4.如果群集中某台服务(节点)挂了,其他的节点如何感知并接替任务?(心跳检测、选举机制)
5.存在共享资源的安全性(分布式锁的问题)?
以上的问题需要分布式协调机制来处理,就出现了zookeeper,zk的特性为分布式协调解决以上问题。
zookeeper是什么?
一、zookeeper是分布式协调工具
二、Zookeeper数据结构 树状存储结构、以节点(znode)方式存储 (相当于文件夹层级)
1.zk以节点的方式存储,那么节点有什么特点?
a)节点有4种类型
持久节点(永久存放在硬盘上)、持久顺序节点(节点上有一个顺序编号)
临时节点(zk会话连接断开就会删除,不能存在子节点)
临时顺序节点
b)同级节点的名称必须唯一(不允许重复),删除节点时必须先删除子节点
2. 节点的结构如图,比如有一个订单服务的集群
服务地址使用临时节点,与zk连接保持一致,能够动态感知服务的上下线(如果服务挂了会自动删除节点)
三、zk的特性
1.zk能够监听到节点的变化(Watcher机制)
a)如订单服务将服务地址注册到zk上,营销服务可以订阅(Watcher)zk注册中心,监听到订单服务的地址变化(存在哪些服务地址,监听服务地址的变化)
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
即刻关注,掂过柱碌