异常类型
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一定比较低,那么就不该发生此次更新。