异常类型
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一定比较低,那么就不该发生此次更新。
FEATURED TAGS
CSS
JAVA
JQuery
JQGrid
Linux
Java并发编程实战
开发工具
JAVA设计模式
ZooKeeper专题
Nginx
Hive
SparkSQL
MyBatis
Scala
博客专栏
消息中间件
Kafka
Spring相关
Hadoop
Flume
实践记录
KVM
PostgreSQL
Oracle
Thinking-In-Java
JAVA杂记
MySQL
SQL
Effective-Java
Shell
Sqoop
Spark
MongoDB
SpringBoot
RequireJS
HBase
Node.js
Vue.js
JVM调优
Greenplum
Spark-Streaming
机器学习基础
读书笔记
Docker
Spark-ML
Maven
高数知识整理
技术知识汇总
FastDFS
Redis
软考中级