ZooKeeper专题(五)——异常处理

By timebusker on March 31, 2017

异常类型

ZK将异常分成两大类,可恢复的和不可恢复的。

可恢复异常

  • 可恢复异常是短暂的且经常出现的,短暂的网络波动或者服务异常都将导致这个问题。

  • 当客户端和ZK的连接断的时候,会产生Disconnected事件和ConnectionLossException,来表示此连接断开。

  • 客户端会不断重试对ZK的重新连接,一旦重连后,会继续设置之前的watch。

  • exists是个特殊的操作,它可以针对不存在的结点。

  • 当出现Disconnected的时候,客户端不该有会导致数据不一致的进一步操作。

不可恢复异常

  • 当连接超时或者网络中断的时候,会出现此类型的异常。

leader选举

ZK提供了对客户端的一致性,保证所有操作都是有序的。但是客户端可能会因为各种原因导致产生不一致的行为。 比如当客户端负载过高或者出现时钟漂移的情况。举例来说:
1. 客户端C1成为/leader 2. C1在更新数据库之前,由于负载过高或者垃圾回收(stop world collection),ZK任务C1超时 3. C2成为新的/leader后更新数据库 4. C1恢复正常,但是此时连接已经失效,但C1已经更新了数据库。

这样会导致出现脏数据。 一种解决方法是使用fencing的技术,引入fencing token(类似版本号),使用ZXID可以当fencing token。 在C1更新数据库前,它持有的fencing token一定比较低,那么就不该发生此次更新。