ZooKeeper动态增加Server(动态增加节点)的研究(待实践)
说明:是动态增加Server,不是动态增加连接到ZK Server的Client。
场景如下(转自外文):
1、在t=t_1->[peer-1(Leader),peer-2],peer-1是主节点,所有客户端连接到该节点。
2、在t=t_2->[peer-1(Leader),peer-2,peer-3],稍后的时候,同行3加入了该组。是否可以“动态地”将动态列表添加到zookeeper服务器列表(即,在对等体1上不重新启动ZooKeeper)?
3、在t=t_3->[peer-3(Leader),peer-4],一段时间后,对等体1和对等体2离开组(例如,死亡或被关闭)。假设有一种方法来动态地将peer-3和peer-4添加到组中peer-3成为领导者并且所有客户端请求都发送到对等体3。
提示:或者这样说,原始有3台Server,然后一段时候后访问剧增,想再增加多两台,最后变为5台Server。
动态增加ZK Server/节点会面临的问题:
1、每个连接到ZK Server时,都会配置一个Connect的字符串,字符串上指定了所有ZK Server的服务器列表,形式类似于:“192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181”;且配置好之后是不能变的。
2、ZK Server在配置集群时,会在配置文件指定明确的服务器IP和端口,然后启动。如果中途某台挂了,那么只要在一定数量范围之内不影响;但是如果想要增加几台,需要在每台ZK Server上的配置文件上都加入新增加的IP和端口,最重要一点就是要重启所有的ZK Server才能使其生效。
注意:通过以上的做法,那么会面临一个问题,如果此时正在下单,或者分布式事务锁在运行,就会面临丢单等问题!
动态增加ZK Server/节点的解决方案:
1、ZK从3.5版本开始已经增加了动态增加节点的功能,并且是属于动态读取配置文件而不用重启全部ZK Server。
- 通过最新版本来解决的方案,对于已经连接到ZK Server的客户端,可以采用代码灰度更新的方案来逐步更新掉Connect的服务器IP列表。而不用影响现有的业务完整性。
- 当然,对于客户端的连接字符串,可以采用远程地址的方式,比如访问一条固定的URL,返回服务器IP列表,当有新的服务器IP列表更新时,将通知全部的客户端去更新。这样可以解决采用代码灰度更新的问题。
2、在3.5版本以前的公开解决方法
- 对于客户端的连接字符串,可以采用远程地址的方式,比如访问一条固定的URL,返回服务器IP列表,当有新的服务器IP列表更新时,将通知全部的客户端去更新。
- 对于ZK Server,可以采用部署另外一套环境,比如之前是3台的;那么再次部署9台,且这9台与之前的3台是没关联的。
- 然后客户端收到更新通知时,去获取新的9台服务器列表。
注意:上面采用更新客户端服务器IP列表的形式需要做业务空闲的判断处理,比如这个客户端在更新前没任何操作正在处理,并且要阻止新来的业务请求等。
以上研究的搜索线索:zookeeper dynamic add node
参考:
https://zookeeper.apache.org/doc/trunk/zookeeperReconfig.html(官方3.5版本的动态配置读取和动态增加节点)
https://stackoverflow.com/questions/11375126/zookeeper-adding-peers-dynamically(动态增加节点的问题研究)
https://issues.apache.org/jira/browse/ZOOKEEPER-107(动态增加节点的公开解决方案)
http://grokbase.com/t/zookeeper/user/138drn03sv/dynamically-adding-nodes-to-zk-ensemble(公开解决方案的一些操作)
https://issues.apache.org/jira/browse/ZOOKEEPER-1660(动态增加节点)
https://www.slideshare.net/Hadoop_Summit/dynamic-reconfiguration-of-zookeeper(动态增加节点)
https://gist.github.com/miketheman/6057930(动态增加节点)
https://forever-zs.github.io/2017/08/06/zookeeper/%E5%8A%A8%E6%80%81%E6%84%9F%E7%9F%A5%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E4%B8%8B%E7%BA%BF/(通过ZK实现的服务器上下线功能,不是关于ZK怎么动态增加节点)
http://heylinux.com/archives/2063.html(以前的方案不能动态增加节点)
http://dbaplus.cn/news-21-1240-1.html(以前的方案不能动态增加节点)
ZooKeeper动态增加Server(动态增加节点)的研究(待实践)的更多相关文章
- 基于ZooKeeper和Thrift构建动态RPC调用
一.基本功能 实现服务端向ZooKeeper集群注册自己提供的服务,并且把自己的IP地址和服务端口创建到具体的服务目录下.客户端向ZooKeeper集群监听自己关注的RPC服务(例如:sayHello ...
- 动态 Web Server 技术发展历程
动态 Web Server 技术发展历程 开始接触 Java Web 方面的技术,此篇文章是以介绍 Web server 相关技术的演变为主来作为了解 Java servlet 的技术背景,目的是更好 ...
- (转)[SQL Server] 动态sql给变量赋值(或返回值给变量)
本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) decla ...
- sql server动态行列转换
原文链接:https://www.cnblogs.com/gaizai/p/3753296.html sql server动态行列转换 一.本文所涉及的内容(Contents) 本文所涉及的内容(Co ...
- 轻松搭建CAS 5.x系列(6)-在CAS Server上增加OAuth2.0协议
概述说明 CAS Server默认搭建出来,客户端程序只能按照CAS自身的协议接入.CAS的强大在于,有官方的插件,可以支持其他的协议.本章节就让CAS Server怎么增加OAuth2.0的登录协议 ...
- ArcGIS Server 动态图层发布调用图解
目录 1 前言 1.1 简介 1.2 适用场景 2 动态图层 2.1 共享地图服务 2.2 动态工作空间添加 2.2.1 企业级数据库 2.2.2 shapefile文件夹 2.2.3 栅格文件夹 2 ...
- vc++基础班[28]---动态数组及动态链表的讲解
C++中也有相应的动态数组.动态链表.映射表的模板类,就是STL中的:vector.list.map 他们属于C++标准中的一部分,对于程序的移植性来说也是不错的,但是在MFC编程中使用 CArray ...
- springboot+zuul(一)------实现自定义过滤器、动态路由、动态负载。
参考:https://blog.csdn.net/u014091123/article/details/75433656 https://blog.csdn.net/u013815546/articl ...
- Apache Ignite 学习笔记(三): Ignite Server和Client节点介绍
在前两篇文章中,我们把Ignite集群当做一个黑盒子,用二进制包自带的脚本启动Ignite节点后,我们用不同的客户端连接上Ignite进行操作,展示了Ignite作为一个分布式内存缓存,内存数据库的基 ...
随机推荐
- [Swift通天遁地]七、数据与安全-(11)如何检测应用程序中的内存泄露
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- cookie和seesion区别
cookie 和session 的区别详解 这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie ...
- 【Codeforces866E_CF866E】Hex Dyslexia(Structure & DP)
It's my first time to write a blog in EnglishChinglish, so it may be full of mistakes in grammar. Pr ...
- ACM_lowbit
lowbit Time Limit: 2000/1000ms (Java/Others) Problem Description: long long ans = 0; for(int i = 1; ...
- scala 变量定义,基本操作符
scala是jvm语言,它将面向对象与函数风格结合的很好,它可以访问任何java类库并很好的结合使用. 它可以使程序更简单,同时可利用并发的威力. scala基本语法: package com.tes ...
- unity多语言本地化
简介 嗯...一般来说做游戏啥的都不会只发一个国家,但是每个国家语言不同,就存在多语言本地化的问题,然后直接用过一个通过xml完成本地化的东东,然后策划反馈不会修改xml,扔给我一个excel让我自己 ...
- vs项目结构解析
当我们用VS开发一个项目的时候,首先应该清楚用VS这个IDE生成的一些文件和文件夹是什么意思,起什么作用,什么场合下使用. 因为我使用的是VS2015,就以这个为例来进行一些说明: 首先要做的是更改你 ...
- StackOverflowError&OutOfMemoryError区别
在Java虚拟机规范中,针对内存分配规定两种异常状况,即StackOverflowError和OutOfMemoryError. StackOverflowError:当线程请求的内存大小大于所配置的 ...
- Android项目实战_手机安全卫士手机防盗界面
#安全卫士手机防盗# ###1.Activity的任务栈 1.类似一个木桶,每层只能放一个木块,我们放入木块和取出木块的时候只能从最上面开始操作 ###2.Android中的坐标系![](http:/ ...
- JS——旋转木马
1.opacity和zIndex的综合运用 2.样式的数组的替换:向右边滑动---删除样式数组第一位并在数组最后添加:向左边滑动---删除样式数组最后一位并在数组前添加 3.开闭原则,只有当回调函数执 ...