美文网首页
2019-04-27 分布式协调工具-zookeeper

2019-04-27 分布式协调工具-zookeeper

作者: 不给起这个名字 | 来源:发表于2019-04-29 20:14 被阅读0次

    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

    相关文章

      网友评论

          本文标题:2019-04-27 分布式协调工具-zookeeper

          本文链接:https://www.haomeiwen.com/subject/ghklnqtx.html