ZooKeeper怎么玩之一:为什么需要ZK

学习新东西首先需要搞清楚为什么学它,这是符合我们的一个认知过程。

ZooKeeper是什么

ZooKeeper是一个分布式协调服务,它致力去解决如何在分布式环境下保持数据一致性的问题。

分布式环境下遇到的问题

共享的资源在并发的情况下会出现竞争,在线程间可以使用Java提供的锁机制来协调这些资源,那么在分布式的环境下,如何来协调这些资源呢?

如何协调分布式环境下的资源,首先应该明确由单机环境转到分布式环境下遇到了什么问题?

  1. 分布式环境下无法保证顺序

    在单机环境如果想让A先执行,B后执行,先调用A后调用B就可以了;由于网络是不可靠的,分布式环境中则不同,在网络延迟的情况下A可能比B执行要晚。

  2. 分布式环境下无法明确执行结果

    单机中调用A成功和失败很明确;而在分布式环境中,即使调用A执行成功了,而在网络传输中超时了,此时无法判断A是否执行成功了,需要通过重试的方式才能判断A有没有执行成功。

  3. 分布式环境下无法保证数据一致性

    分布式环境如果很多台服务器提供相同的服务,如何保证服务的某一个改动要么同时生效,要么失败,是分布式和单机环境的最重要的区别。

没有ZooKeeper之前的世界是什么样子

  1. 保证事务顺序一致性

    如果事务A在一台服务器上优先于事务B先执行,则在所有的服务器上事务A都将优先于事务B执行。由于网络是不可靠的,如果没有ZooKeeper如何保证在所有服务器上事务顺序一致将是一个很复杂的问题,而ZooKeeper使我们专注于业务逻辑,而不用过分关注于分布式协调。

  2. 保证单调一致性

    单调一致性是最终一致性的变种。在任何情况下,用户一旦读到某个数据的某次更新后的值,就不会再读到比这个值更旧的值了。