ZooKeeper个人理解

6 篇文章 0 订阅
1 篇文章 0 订阅

一、什么是zookeeper

     根源: 从Hadoopd的高可用分出来的子项目,hadoop是做大数据存储的,N个机器同时在线,完成高可用,主备的机器。所以zookeeper刚开始起到的作用就是管家,管理这N个节点,让主备机器通知zookeeper谁闲着。谁负载过了,好让zookeeper来调度。hadoop有个特点同一时间只有一个节点对外提供服务,而另一个节点等待(备胎),如果第一个节点崩掉,另一个节点马上顶上来使用,zookeeper协调服务的上下限。

二、zookeeper能干什么

  特点:区分于nginx/keepalive

   1.保管数据(描述信息(ip,hostname),在线状态=是不是主节点(leader,master,slave))保存为类似与数据库表的一种结构,为客户端从zookeeper里面读取数据。

 注意:但是如果出现宕机怎么动态的更新在线状态等等信息告诉客户端,将在线状态从master-slave切换。所以每台节点的状态你怎么知道?

  心跳检测(N个节点和zookeeper来保持心跳检测。保证哪个活着哪个死了)

   通过心跳检测的方式来监听事件状态,来产生事件通知(obsever观察者模式)

   如果有事件(动作)就会吊起代码,我们的代码来维护数据,也就是将master/salve切换

   换句话说zookeeper在做监听的时候是在每服务器上做的一个zookeeperClient,是这个程序在不停的向zookeeper上报心跳连接。zookeeper一切都由事件来驱动,

  2.可以做更加复杂的负载均衡/协调

  3.一切都可监听

    监听连接状态

    监听数据改变

三、理解

 1.当一台服务器的时候是Standalone,真正的zookeeper必须为集群,当部署zookeeper做集群的时候一般部署奇数台的zookeeper为了方便选举

 2.数据保管的问题

 思考1: 既然zookeeper是集群,所以说数据在每台zookeeper上面都会有数据,那么数据从哪里来?从客户端来,当客户端提交的时候,是往一个节点上提交还是多个zookeeper上提交?

 a.应该是一台服务器上提交合适,当网络数据传输的时候,就要保证网络的传输不出问题,如果是多台服务器上提交则网络稳定性不稳定,其余机器等待不知道何时。

b.然后这一台机器将数据同步到其他节点上面,复制到其他的节点上面

思考2:若另一个客户端改数据了怎么办?

新客户端来改数据的时候是找哪台机器?随便?还是之前接收数据的那台?

不可能找原来接收数据的那台服务器,所以随便找一台就可以,当数据修改完成之后同步给其他的节点。

 思考3:分布式系统的数据一致性问题

 当出现以上情况的时候:老数据存储,新数据来提交的时候,一旦有数据更新的时候把老数据覆盖就行,zookeeper在判断数据的时候有一个version=zxid的概念,这个zxid就是版本的意思,还有一个timestamp时间戳,拿这两个判断,注意,这个时候更新不是覆盖旧数据,类似git,把数据存为不同的版本,同时还能记录是谁改了。所以说新数据来的时候对比其他节点的数据版本号,然后同步。

思考4:分布式系统的事务问题

 极端场景,两个客户端,前后的请求,重叠在ZK集群同步数据的时间窗口。不存在出现同时出现到一个节点的情况(类似线程)

怎么办?

 方案1:分布式锁

   可以实现,但是在这个基础之上增加了系统架构的提高。不用,抛弃

 方案2:只能往一台服务器上写

   只往一台机器上写就OK。但是全部都往一台上面写,怎么控制?zk底层实现,可以向任何一个节点写入数据,这个节点持有数据之后,不去修改,而是转发写入请求,把所有的涉及到事务相关的请求全部中转到一个节点上,这样就避免了分布式事务的问题。所以说这种方式,转发写的请求到一台有写权限的服务器上就可以。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值