- 浏览: 1595952 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
jsrgzhangzhiyong:
关于null值的转换还是感觉不太友好,就像 mapstruct ...
我也造了个轮子:BeanMapping(属性拷贝) -
he037:
a417930422 写道引用使用EPHEMERAL会引出一个 ...
基于zookeeper的分布式lock实现 -
seancheer:
qianshangding 写道首先节点启动后,尝试读取本地的 ...
zookeeper学习记录三(session,watcher,persit机制) -
雪夜归人:
您好,我想咨询一下,开源的canal都能支持mysql的哪些版 ...
Canal BinlogChange(mysql5.6) -
zhoudengyun:
copy 一份做记录,后续学习,请知悉
阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费
背景
前段时间学习了zookeeper后,在新的项目中刚好派上了用场,我在项目中主要负责分布式任务调度模块的开发,对我自己来说是个不小的挑战。
分布式的任务调度,技术上我们选择了zookeeper,具体的整个分布式任务调度的架构选择会另起一篇文章进行介绍。
本文主要是介绍自己在项目中zookeeper的一些扩展使用,希望可以对大家有所帮助。
项目中使用的zookeeper版本3.3.3,对应的文档地址: http://zookeeper.apache.org/doc/trunk/
扩展一:优先集群
先来点背景知识:
1.zookeeper中的server机器之间会组成leader/follower集群,1:n的关系。采用了paxos一致性算法保证了数据的一致性,就是leader/follower会采用通讯的方式进行投票来实现paxns。
2.zookeeper还支持一种observer模式,提供只读服务不参与投票,提升系统,对应文档: http://zookeeper.apache.org/doc/trunk/zookeeperObservers.html
我们项目特性的决定了我们需要进行跨机房操作,比如杭州,美国,香港,青岛等多个机房之间进行数据交互。
跨机房之间对应的网络延迟都比较大,比如中美机房走海底光缆有ping操作200ms的延迟,杭州和青岛机房有70ms的延迟。
为了提升系统的网络性能,我们在部署zookeeper网络时会在每个机房部署节点,多个机房之间再组成一个大的网络保证数据一致性。(zookeeper千万别再搞多个集群)
最后的部署结构就会是:
- 杭州机房 >=3台 (构建leader/follower的zk集群)
- 青岛机房 >=1台 (构建observer的zk集群)
- 美国机房 >=1台 (构建observer的zk集群)
- 香港机房 >=1台 (构建observer的zk集群)
- 先使用美国机房的集群ip初始化一次zk client
- 通过反射方式,强制在初始化后的zk client中的server列表中又加入杭州机房的机器列表
ZooKeeper zk = null; try { zk = new ZooKeeper(cluster1, sessionTimeout, new AsyncWatcher() { public void asyncProcess(WatchedEvent event) { //do nothing } }); if (serveraddrs.size() > 1) { // 强制的声明accessible ReflectionUtils.makeAccessible(clientCnxnField); ReflectionUtils.makeAccessible(serverAddrsField); // 添加第二组集群列表 for (int i = 1; i < serveraddrs.size(); i++) { String cluster = serveraddrs.get(i); // 强制获取zk中的地址信息 ClientCnxn cnxn = (ClientCnxn) ReflectionUtils.getField(clientCnxnField, zk); List<InetSocketAddress> serverAddrs = (List<InetSocketAddress>) ReflectionUtils .getField(serverAddrsField, cnxn); // 添加第二组集群列表 serverAddrs.addAll(buildServerAddrs(cluster)); } } }
扩展二:异步Watcher处理
最早在看zookeeper的代码时,一直对它的watcher处理比较满意,使用watcher推送数据可以很方便的实现分布式锁的功能。
zookeeper的watcher实现原理也挺简单的,就是在zookeeper client和zookeeper server上都保存一份对应的watcher对象。每个zookeeper机器都会有一份完整的node tree数据和watcher数据,每次leader通知follower/observer数据发生变更后,每个zookeeper server会根据自己节点中的watcher事件推送给响应的zookeeper client,每个zk client收到后再根据内存中的watcher引用,进行回调。
这里会有个问题,就是zk client在处理watcher时,回凋的过程是一个串行的执行过程,所以单个watcher的处理慢会影响整个列表的响应。
可以看一下ClientCnxn类中的EventThread处理,该线程会定时消费一个queue的数据,挨个调用processEvent(Object event) 进行回调处理。
扩展代码:
public abstract class AsyncWatcher implements Watcher { private static final int DEFAULT_POOL_SIZE = 30; private static final int DEFAULT_ACCEPT_COUNT = 60; private static ExecutorService executor = new ThreadPoolExecutor( 1, DEFAULT_POOL_SIZE, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue( DEFAULT_ACCEPT_COUNT), new NamedThreadFactory( "Arbitrate-Async-Watcher"), new ThreadPoolExecutor.CallerRunsPolicy()); public void process(final WatchedEvent event) { executor.execute(new Runnable() {//提交异步处理 @Override public void run() { asyncProcess(event); } }); } public abstract void asyncProcess(WatchedEvent event); }
- zookeeper针对watcher的调用是以单线程串行的方式进行处理,容易造成堵塞影响,monitor的数据同步及时性
- AsyncWatcher为采取的一种策略为当不超过acceptCount=60的任务时,会采用异步线程的方式处理。如果超过60任务,会变为原先的单线程串行的模式
扩展三:重试处理
这个也不多说啥,看一下相关文档就清楚了
- http://wiki.apache.org/hadoop/ZooKeeper/ErrorHandling
-
http://wiki.apache.org/hadoop/ZooKeeper/FAQ#A3
public interface ZooKeeperOperation<T> { public T execute() throws KeeperException, InterruptedException; } /** * 包装重试策略 */ public <T> T retryOperation(ZooKeeperOperation<T> operation) throws KeeperException, InterruptedException { KeeperException exception = null; for (int i = 0; i < maxRetry; i++) { try { return (T) operation.execute(); } catch (KeeperException.SessionExpiredException e) { logger.warn("Session expired for: " + this + " so reconnecting due to: " + e, e); throw e; } catch (KeeperException.ConnectionLossException e) { //特殊处理Connection Loss if (exception == null) { exception = e; } logger.warn("Attempt " + i + " failed with connection loss so " + "attempting to reconnect: " + e, e); retryDelay(i); } } throw exception; }
注意点:Watcher原子性
在使用zookeeper的过程中,需要特别注意一点就是注册对应watcher事件时,如果当前的节点已经满足了条件,比如exist的watcher,它不会触发你的watcher,而会等待下一次watcher条件的满足。
它的watcher是一个一次性的监听,而不是一个永久的订阅过程。所以在watcher响应和再次注册watcher过程并不是一个原子操作,编写多线程代码和锁时需要特别注意
总结
zookeepr是一个挺不错的产品,源代码写的也非常不错,大量使用了queue和异步Thread的处理模式,真是一个伟大的产品。
评论
杭州机房 >=3台 (构建leader/follower的zk集群)
青岛机房 >=1台 (构建observer的zk集群)
美国机房 >=1台 (构建observer的zk集群)
香港机房 >=1台 (构建observer的zk集群)
这个是每个地方构成一个小集群,然后整个构成一个大集群么
如果是那要怎么配置呢
抽象出来一层,青岛机房的集群看成一个节点,这就说明青岛机房对外只有一个IP,这个IP是用负载均衡来实现的。。。不知道我理解的对不对
杭州机房 >=3台 (构建leader/follower的zk集群)
青岛机房 >=1台 (构建observer的zk集群)
美国机房 >=1台 (构建observer的zk集群)
香港机房 >=1台 (构建observer的zk集群)
这个是每个地方构成一个小集群,然后整个构成一个大集群么
如果是那要怎么配置呢
如果共用的话,网络繁忙的时候,就怕zk国内外之间的通讯会卡住。
具体的IP配置想请教下您的做法。
目前我们用了vpn,所以都是走内网ip
具体的IP配置想请教下您的做法。
差不多了,zk的写入tps也就只有1~2w而已
那么到底哪个是对的啊?
重试没错,只不过需要业务实现session expired重试后的一些处理,比如重建临时节点
那么到底哪个是对的啊?
做不到,一般在杭州会部署3个机房的zookeeper,挂了其中一个机房,还可以继续工作.
ReflectionUtils.makeAccessible(serverAddrsField);
请问clientCnxnField和serverAddrsField这两个Field是哪里来的?
如果把杭州的server列表加入到zk对象,因为会服务器列表是shuffle的,那么下次美国客户端就有可能访问到杭州机房的zookeeper服务器呢?我块还不太了解,麻烦指点下,谢谢
clientCnxnField/serverAddrsField这个是zookeeper早期版本的代码
ReflectionUtils.makeAccessible(serverAddrsField);
请问clientCnxnField和serverAddrsField这两个Field是哪里来的?
如果把杭州的server列表加入到zk对象,因为服务器列表是会shuffle的,那么下次美国客户端就有可能访问到杭州机房的zookeeper服务器呢?我块还不太了解,麻烦指点下,谢谢
估计是hbase使用的zookeeper做了扩展,才会无限制做重试了把
1.你说的 paxns 应该是paxos吧?(不知道是不是我理解错误,当然这是吹毛求疵,我只是希望你的文字更精确,别介意哦。)
2.还有我个人了解zookeeper中确切的说应该使用的是zab(zookeeper automic broadcast)当然是paxos优化版本。比如消除了“羊群效应”,正如你前篇文字提到的当节点数据变化时候,不会按照paxos算法将消息发送到所有的client,而是只发送到序号为下一个序号的client,从而缓解服务压力。
我也是刚刚了解zookeeper,我理解不对之处多多指出。还是感谢你的分享。
恩,多谢你的建议。
1. 的确是paxos,是我的笔误,多谢指出。
2. 其实Watcher并不是paxos算法中的一部分。paxos中只包括提出决议和决议通过,这些都是发生在zookeeper内部过程。而Watcher只是在paxos算法完成后,是zookeeper提供的一些便利性工具,正因为这样的callback才允许我们实现了分布式锁机制提供了可能性
如果你看过上一篇分布式lock文章就知道,这里并没有一种百分百可靠&有效的lock方法,选择EPHEMERAL和PERSISTENT同样存在一些问题。基于EPHEMERAL的实现,通过heartbeat并不能100%确保(比如网络断了,jvm依然存在)
1.你说的 paxns 应该是paxos吧?(不知道是不是我理解错误,当然这是吹毛求疵,我只是希望你的文字更精确,别介意哦。)
2.还有我个人了解zookeeper中确切的说应该使用的是zab(zookeeper automic broadcast)当然是paxos优化版本。比如消除了“羊群效应”,正如你前篇文字提到的当节点数据变化时候,不会按照paxos算法将消息发送到所有的client,而是只发送到序号为下一个序号的client,从而缓解服务压力。
我也是刚刚了解zookeeper,我理解不对之处多多指出。还是感谢你的分享。
发表评论
-
yugong QuickStart
2016-03-05 01:52 0几点说明 a. 数据迁移的方案可参见设计文档,oracl ... -
阿里巴巴开源项目: 阿里巴巴去Oracle数据迁移同步工具
2016-03-05 18:29 6514背景 08年左右,阿里巴巴开始尝试MySQL的相关 ... -
愚公performance
2016-03-02 17:29 0性能测试 全量测试 场景1 (单主键, ... -
yugong AdminGuide
2016-03-02 16:40 0环境要求 操作系统 数据库 迁移方案 部署 ... -
Tddl_hint
2014-01-27 13:52 0背景 工作原理 Hint格式 direct模 ... -
tddl5分库规则
2014-01-26 14:41 0背景 工作原理 构建语法树 元数据 基于 ... -
tddl5优化器
2014-01-22 15:12 0背景 工作原理 构建语法树 元数据 抽象语 ... -
Canal BinlogChange(mariadb5/10)
2014-01-20 17:25 4592背景 先前开源了一个 ... -
asynload quickstart
2013-10-08 22:49 0几点说明: 1. asyncload是做为一个j ... -
映射规则配置
2013-09-26 11:25 0背景 因为alibaba的特殊业务,比如: 同 ... -
网友文档贡献
2013-09-18 15:50 01. Otter源代码解析系列 链接:http://e ... -
Manager配置介绍
2013-09-16 13:00 0通道配置说明 多种同步方式配置 a. 单向同步 ... -
canal&otter FAQ
2013-09-05 17:30 0常见问题 1. canal和 ... -
阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
2013-08-22 16:48 40437项目背景 阿里巴巴B2B公司,因为业务的特性 ... -
Otter AdminGuide
2013-08-19 11:06 0几点说明 otter系统自带了manager,所以简化了一 ... -
Otter高可用性
2013-08-17 23:41 0基本需求 网络不可靠,异地机房尤为明显. man ... -
Otter数据一致性
2013-08-17 23:39 0技术选型分析 需要处理一致性的业务场景: 多地修改 ( ... -
Otter扩展性
2013-08-17 22:20 0扩展性定义 按照实现不同,可分为两类: 数据处理自定 ... -
Otter双向回环控制
2013-08-17 21:37 0基本需求 支持mysql/oracle的异构数据库的双 ... -
Otter调度模型
2013-08-17 20:13 0背景 在介绍调度模型之前,首先了解一下otter系统要解 ...
相关推荐
总结起来,ZooKeeper 客户端提供了丰富的接口和机制,使得开发者能够方便地与 ZooKeeper 进行交互,实现分布式环境中的数据一致性、协调和服务发现等功能。理解并熟练运用这些知识点,对于构建健壮的分布式系统至关...
实验内容主要包括以下几点: 1. **Zookeeper集群配置**:在Hadoop完全分布式集群中配置Zookeeper集群,这涉及到多个Zookeeper服务器的设置,包括配置文件`zoo.cfg`的修改,例如设置`dataDir`为每个服务器的数据存储...
在这个过程中,我们需要注意以下几点: - **异常处理**: 对于网络抖动或者Zookeeper服务暂时不可用的情况,客户端需要处理重试和回退策略,确保在恢复后能正确释放锁。 - **死锁检测**: 在大型分布式系统中,死锁...
这里有几个关键点需要注意: - `hbase.rootdir` 指定了 HBase 数据存储在 HDFS 上的位置。 - `hbase.master` 指定了 HBase 主服务器的地址。 - `hbase.zookeeper.quorum` 指定了 ZooKeeper 服务器的列表,这里指定...
在使用Zookeeper查看器时,需要注意以下几点: 1. 安全性:由于Zookeeper查看器能够直接访问Zookeeper的数据,因此必须确保只有授权的用户才能使用,避免未授权的访问和操作。 2. 实时性:查看器应具有实时更新的...
在3.4.3版本中,Zookeeper强化了稳定性和性能,主要体现在以下几点: 1. 性能优化:提高了客户端的连接速度和数据处理能力,减少了延迟,提升了整个系统的吞吐量。 2. Bug修复:修复了多个可能导致系统不稳定的问题...
以下是如何在Dubbo中使用Zookeeper的几个关键点: 1. 服务注册:每个Dubbo服务提供者启动时,会在Zookeeper上注册自己的服务,包括服务接口、版本、地址等信息。 2. 服务发现:服务消费者在调用远程服务时,会从...
ZooKeeper具备以下几个关键特性: - **简单性:** 它提供了一种类似于文件系统的数据模型,支持基本的操作如创建、删除节点等。 - **易表达性:** 数据结构原型是一棵znode树,可以用来构建复杂的数据结构和协议。 ...
在部署Zookeeper时,需要注意以下几点: - 集群规模:通常推荐3台或5台服务器来保证高可用性。 - 配置文件:`conf/zoo.cfg`是Zookeeper的主要配置文件,需要根据实际情况调整参数,如数据存储路径、客户端连接超时...
具体来说,Zookeeper为SolrCloud提供了以下几点支持: 1. **配置管理**:所有SolrCloud实例共享同一套配置信息,这些配置存储在Zookeeper中,便于管理和更新。 2. **集群协调**:Zookeeper负责监控SolrCloud集群的...
选择 Zookeeper 作为注册中心的原因主要有以下几点: - **高可用性**:Zookeeper 使用了 Paxos 算法来确保数据的一致性,即使部分节点失效,集群仍然可以继续工作。 - **易于配置和管理**:Zookeeper 提供了丰富的...
在升级Zookeeper版本时,需要注意以下几点: - **兼容性检查**:确保新版本与现有系统中的其他组件兼容,避免因版本升级引发的不兼容问题。 - **备份旧版本**:在升级前备份现有的Zookeeper数据,以防万一出现问题...
通过完成ZooKeeper的安装配置,学习者应能掌握以下几个关键点: - 下载和安装ZooKeeper的流程 - 配置ZooKeeper以适应不同的应用场景 - 启动并管理ZooKeeper服务 2. 实验要求 了解ZooKeeper的基础配置选项,并熟悉...
在实际应用中,还需要关注以下几点: - **监控与日志**:对Zookeeper的操作日志和Dubbo的服务调用日志进行监控,有助于及时发现和解决问题。 - **安全性**:对Zookeeper的访问需要进行权限控制,防止非法访问。 - *...
通过上述分析可以看出,Dubbo与SpringMVC、Zookeeper的整合使用,不仅可以解决传统架构中存在的诸多问题,还能极大地提升系统的灵活性、可靠性和可扩展性。对于构建大规模分布式应用而言,这是一种非常实用且高效的...
#### 四、小结 通过以上步骤,我们可以构建一个基于 Spring Boot、Dubbo、ZooKeeper 和 JPA 的微服务架构。这种架构不仅具备良好的可扩展性,而且能够很好地应对分布式系统的复杂度。在实际开发中,我们还需要结合...
协调问题主要包含以下几个方面:领队选举(Leader Election)、群组成员关系(Group Membership)、配置管理(Configuration Management)以及其他如集合点(Rendezvous)、屏障(Barriers)、队列(Queues)和两...
为了提高性能,Zookeeper有以下几点优化策略: - 使用长连接:避免频繁的TCP连接建立和关闭。 - 数据缓存:客户端可以缓存节点数据和路径,减少与服务器的交互。 - 观察者模式:增加观察者以扩展容量,降低领导者...
主要关注以下几个关键点: - `bootstrap.yml`或`bootstrap.properties`:配置文件,用于初始化时加载Zookeeper的连接信息。 - `ServiceProviderApplication`:服务提供者的启动类,启用`@EnableDiscoveryClient`。 ...
在Zookeeper中,主要涉及到以下几个核心概念和功能: 1. **分布式架构**: - **集群模式**:Zookeeper以集群的方式运行,通常由多个服务器节点组成,每个节点都保存着整个数据集的副本。 - **选举机制**:当某个...