Zookeeper迁移(扩容/缩容)
zookeeper选举原理
在迁移前有必要了解zookeeper的选举原理,以便更科学的迁移。
快速选举FastLeaderElection
zookeeper默认使用快速选举,在此重点了解快速选举:
向集群中的其他zookeeper建立连接,并且只有myid比对方大的连接才会被接受(也就是每2台只会有1个连接,避免连接浪费)
每台zookeeper默认先投自己,然后向集群广播自己的选票
收到对方的选票时,依次比较epoch(选举轮数)、zxid(事务id)、myid,较大者胜出,更新选票并广播
如果收到的选票中有某个节点超过集群半数,则胜出当选为leader,其他节点为follower
注意事项
zookeeper集群的数量应为奇数:
因为根据paxos理论,只有集群中超过半数的节点还存活才能保证集群的一致性。假如目前集群有5个节点,我们最多允许2个节点不可用,因为3>5\2。当集群扩容到6个节点的时候,我们仍然只能最多允许2个节点不可用,到3个节点不可用时,将不满足paxos理论,因为3>6\2不成立。也就是说当集群节点数n为偶数时,其可用性与n-1是一样的,那我们何必多浪费一台机器呢?
由于zookeeper只允许mid大的节点连接到mid小的节点,我们启动zookeeper的顺序应该按照myid小的到myid大的,最后再启动leader节点!
迁移目标
迁移过程中要保证原zookeeper集群还是能提供服务,新zookeeper集群同步老集群的数据,将zookeeper 域名指向新集群的3个节点,停掉老zookeeper集群。
相当于先扩容zookeeper,然后缩容zookeeper…
迁移步骤
原有zookeeper集群(server1、server2、server3)zoo.cfg配置如下:
1 | # 省略其他配置 |
使用命令:echo srvr | nc HOSTNAME 2181
检查谁是leader({?}依次替换为1、2、3)
ps:也可以用echo stat | nc HOSTNAME 2181
显示更详细信息
这里假设leader为node2.(按照正常情况,leader也理应是node2)
步骤1:新增节点4
在
/data
目录创建mid文件,内容为4配置zoo.cfg,内容如下:
1
2
3
4
5
6# 省略其他配置
dataDir=/data
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=node4:2888:3888启动zookeeper:
{zookeeperDir}/bin/zkServer.sh start
检查所有节点是否提供服务,且集群中只有一个leader,例如以下命令:
可以看到Mode表示该节点的角色为leader。依次检查每一个节点,如果没有响应,或者出现多个leader,需要还原整个集群!
步骤2:新增节点5
在
/data
目录创建mid文件,内容为5配置zoo.cfg,内容如下:
1
2
3
4
5
6
7# 省略其他配置
dataDir=/data
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=node4:2888:3888
server.5=node5:2888:3888启动zookeeper:
{zookeeperDir}/bin/zkServer.sh start
检查所有节点是否提供服务,且集群中只有一个leader:
1
2
3
4
5
6
7
8
9
10$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
步骤3:新增节点6
在
/data
目录创建mid文件,内容为6配置zoo.cfg,内容如下:
1
2
3
4
5
6
7
8# 省略其他配置
dataDir=/data
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=node4:2888:3888
server.5=node5:2888:3888
server.6=node6:2888:3888启动zookeeper:
{zookeeperDir}/bin/zkServer.sh start
检查所有节点是否提供服务,且集群中只有一个leader:
1
2
3
4
5
6
7
8
9
10
11
12$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
步骤4:更新节点4
修改节点4的配置如下:
1
2
3
4
5
6
7
8# 省略其他配置
dataDir=/data
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=node4:2888:3888
server.5=node5:2888:3888
server.6=node6:2888:3888重启节点4的zookeeper:
{zookeeperDir}/bin/zkServer.sh restart
检查所有节点是否提供服务,且集群中只有一个leader:
1
2
3
4
5
6
7
8
9
10
11
12$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
步骤5:更新节点5
同步骤4
步骤6:更新老集群节点1
修改节点1的配置如下:
1
2
3
4
5
6
7
8# 省略其他配置
dataDir=/data
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=node4:2888:3888
server.5=node5:2888:3888
server.6=node6:2888:3888重启节点4的zookeeper:
{zookeeperDir}/bin/zkServer.sh restart
检查所有节点是否提供服务,且集群中只有一个leader:
1
2
3
4
5
6
7
8
9
10
11
12$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
$ echo srvr | nc HOSTNAME 2181
...
步骤7:更新老集群节点3
同步骤6
步骤8:更新老集群节点2
最后更新leader节点:node2,同步骤6
ps:这时候如果没有读写zookeeper操作,集群的leader将变为节点6(因为节点6的myid最大)
步骤9:将原有zookeeper的url指向新的节点
修改域名解析,将zookeeper解析到新的3个节点上 (例如test1.zookeeper.com、test2.zookeeper.com、test3.zookeeper.com)指向node4,node5,node6
相关业务系统重启(避免缓存)
步骤10:老zookeeper集群下线
这一步需要等待所有的业务系统都重启之后。
这时候还是得一台一台关闭(下线),因为假如同时关闭HOSTNAME和node2,那当重启node3的时候集群将不可用(没有超过集群半数的节点存活)
步骤10.1:下线zookeeper老集群中的节点1
关闭HOSTNAME: {zookeeperDir}/bin/zkServer.sh stop
依次修改node2,3,4,5,6的配置,并且重启,配置如下:
1 | # 省略其他配置 |
重启后检查所有节点是否提供服务,且集群中只有一个leader。
ps:这时候如果没有读写zookeeper操作,leader将变成node5,因为node6节点重启的时候,集群重新选举,node5的myid最大
步骤10.2:下线zookeeper老集群中的节点2
关闭node2: {zookeeperDir}/bin/zkServer.sh stop
依次修改node3,4,5,6的配置,并且重启,配置如下:
1 | # 省略其他配置 |
重启后检查所有节点是否提供服务,且集群中只有一个leader。
ps:这时候如果没有读写zookeeper操作,leader将重新变成node6
步骤10.3:下线zookeeper老集群中的节点3
关闭node3: {zookeeperDir}/bin/zkServer.sh stop
依次修改node4,5,6的配置,并且重启,配置如下:
1 | # 省略其他配置 |
重启后检查所有节点是否提供服务,且集群中只有一个leader。
ps:这时候如果没有读写zookeeper操作,node5将成为最终的leader
转载于:https://blog.51cto.com/536410/2398911
相关文章:

SVO Without ROS环境搭建
Installation: Plain CMake (No ROS) 首先,建立工作目录:workspace,然后把下面的需要的都在该目录下进行. mkdir workspace cd workspace Boost - c Librairies (thread and system are needed) sudo apt-get install libboost-all-dev Eige…

BackgroundSubtractorGMG 背景建模
#include <opencv2/bgsegm.hpp> #include <opencv2/video.hpp> #include <opencv2/opencv.hpp> #include <iostream> #include <sstream> using namespace cv; using namespace std; using namespace bgsegm; // GMG目标建模检测 void detectBac…

启动webpack-dev-server只能本机访问的解决办法
修改package.json的dev启动设置,增加--host 0.0.0.0启动后localhost更换为本机IP即可访问

TCP/IP:IP选项处理
引言 IP输入函数要对IP 进行选项处理,。RFC791和1122规定了IP选项和处理规则。一个IP首部可以跟40个字节的选项。 选项格式 选项的格式,分为两种类型,单字节和多字节。 ip_dooptions函数 这个函数用于判断分组转发。用常量位移访问IP选项字段…

【SVO2.0 安装编译】Ubuntu 20.04 + Noetic
ways one 链接: https://pan.baidu.com/s/1ZAkeD64wjFsDHfpCm1CB1w 提取码: kxx2 (downloads and use idirectly) ways two: [SVO2-OPEN: https://github.com/uzh-rpg/rpg_svo_pro_open](https://github.com/DEARsunshine/rpg_svo_pro_open)git挂梯子 如果各位终端无法挂梯…

人眼目标检测初始化
// 初始化摄像头读取视频流cv::VideoCapture cap(0);// 宽高设置为320*256cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);cap.set(CV_CAP_PROP_FRAME_HEIGHT, 256);// 读取级联分类器// 文件存放在opencv\sources\data\haarcascades bool flagGlasses false;if(flagGlasses){face_ca…
Qt之界面换肤
简述 常用的软件基本都有换肤功能,例如:QQ、360、迅雷等。换肤其实很简单,并没有想象中那么难,利用前面分享过的QSS系列文章,沃我们完全可以实现各种样式的定制! 简述实现原理效果新建QSS文件编写QSS代码加…

mongDB的常用操作总结
目录 常用查询:查询一条数据查询子元素集合:image.idgte: 大于等于,lte小于等于...查询字段不存在的数据not查询数量:常用更新更新第一条数据的一个字段:更新一条数据的多个字段:常用删除删除:常用查询: 查询一条数据 精确匹配is Query(Criteria.where("id").is(id))…

【GTSAM】GTSAM学习
1 what GTSAM ? GTSAM 是一个在机器人领域和计算机视觉领域用于平滑(smoothing)和建图(mapping)的C库。它与g2o不同的是,g2o采用稀疏矩阵的方式求解一个非线性优化问题,而GTSAM是采用因子图(f…

人脸、人眼检测与跟踪
#include <opencv2/opencv.hpp> #include <iostream> #include <vector> using namespace cv;CascadeClassifier face_cascade; CascadeClassifier eye_cascade;// 人眼检测 int detectEye(cv::Mat& im, cv::Mat& tpl, cv::Rect& rect) {std::v…

linux下jdk简单配置记录
记录哈,搭建环境的时候,copy使用方便。 vim /etc/profile export JAVA_HOME/usr/java/jdk1.7.0_79export PATH$JAVA_HOME/bin:$PATHexport CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport JRE_HOME$JAVA_HOME/jreexport LANGzh_CN.UT…

Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案
关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案 转载于:https://www.cnblogs.com/daemonFlY/p/10916812.html

so库方法原理
动态库 So库,又动态名库,是Linux下最常见的文件之一,是一种ELF文件。这种so库是程序运行时,才会将这些需要的代码拷贝到对应的内存中。但程序运行时,这些地址早已经确定,那程序引用so库中的这些代码地址如…

上传图片,多图上传,预览功能,js原生无依赖
最近很好奇前端的文件上传功能,因为公司要求做一个支持图片预览的图片上传插件,所以自己搜了很多相关的插件,虽然功能很多,但有些地方不能根据公司的想法去修改,而且需要依赖jQuery或Bootstrap库,所以我就想…

springboot 简单自定义starter - beetl
使用idea新建springboot项目beetl-spring-boot-starter 首先添加pom依赖 packaging要设置为jar不能设置为pom<packaging>jar</packaging> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web&…

cmake生成so包并调用(C++project,build,cmake)
1. 目录结构 2 . downloads 2.1 build module process CMakeLists.txt > cmake_minimum_required(VERSION 3.5)if(CMAKE_COMPILER_IS_GNUCC)message("COMPILER IS GNUCC")ADD_DEFINITIONS ( -stdc11 ) endif(CMAKE_COMPILER_IS_GNUCC)SET(CMAKE_CXX_FLAGS_DEBU…

人眼模板匹配自动跟踪
void trackEye(cv::Mat& im, cv::Mat& tpl, cv::Rect& rect) {// 人眼位置cv::Size pSize(rect.width * 2, rect.height * 2);// 矩形区域cv::Rect tRect(rect pSize - cv::Point(pSize.width/2, pSize.height/2));tRect & cv::Rect(0, 0, im.cols, im.rows);…

前端碎碎念 之 nextTick, setTimeout 以及 setImmediate 三者的执行顺序
『前端碎碎念』系列会记录我平时看书或者看文章遇到的问题,一般都是比较基础但是容易遗忘的知识点,你也可能会在面试中碰到。 我会查阅一些资料并可能加上自己的理解,来记录这些问题。更多文章请前往我的个人博客这个问题是有关执行顺序和Eve…

bat 将war文件转换成ear文件
1、无需拷贝war文件,自动获取war set path%path%;D:\jdk\jdk1.6.0_31\bin;C:\Program Files\7-Zip del **0001-controller.war del **0001-controllerEAR.ear copy ..\target\**0001-controller-0.0.1-SNAPSHOT.war **0001-controller.war rem 7z d -tzip **0001-co…

cmake语法【一】
一、Cmake 简介 cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。 二、常用命令 指定 cmake 的最小版本 cmake_minimum_required(VERSION 3.4.1)这行命令是可选的ÿ…

RHEL6.3安装vsftpd
1、下载vsftpd,可以从官网(http://vsftpd.beasts.org)下载,也可以百度搜索[rootlocalhost vsftpd]# wget http://down1.chinaunix.net/distfiles/vsftpd-3.0.2.tar.gz2、解压压缩包并进入解压出来的目录[rootlocalhost vsftpd]# t…

创建mysql数据库,在新数据库中创建表,再尝试删除表
创建之前,先登录数据库存 mysql -u 账号 -p密码 登录完成后,展示一下已存在的数据库 show databases; 创建数据库 create database test111; 然后展示一下数据库,如下 show databases; 使用数据库 use test; 在test数据库里面看一下已存在的…

cmake:在各级目录之间共享变量(cmake cache变量)
摘要: 本文记录一下 CMake 变量的定义、原理及其使用。CMake 变量包含 Normal Variables、Cache Variables。通过 set 指令可以设置两种不同的变量。也可以在 CMake 脚本中使用和设置环境变量。set(ENV{} …),本文重点讲述 CMake 脚本语言特有的两种变量。 正文&am…

antd+dva笔记
参考 React中函数式声明组件Dva Ant Design 前后端分离之 React 应用实践ReactDvaJS 之 hook 路由权限控制dva 知识地图react-router Guides and API docs (v2, v3)react-sage redux-saga 是一个用于管理 Redux 应用异步操作,可以用来代替 redux-thunk 中间件。《Redux-saga 中…

求两个矩形重叠部分的面积
#include<stdio.h> #include<math.h>#define areaFile "area.txt" #define perportionFile "perportion.txt"#define min(a,b) ( ((a)>(b)) ? (b):(a) ) #define max(a,b) ( ((a)>(b)) ? (a):(b) )typedef struct xy { int x; int y; …

session,cookie,sessionStorage,localStorage的区别及应用场景
浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互。 一、cookie和session cookie和session都是用来跟踪浏览器用户身份的会话方式。 区别: 1、保持状态:cookie保存在浏览器端&#x…

鱼眼镜头及其标定
1. 鱼眼镜头特性与镜头分类 普通镜头和针孔相机在数学模型上可以等价对待,都是射影变换(Perspective transform); 鱼眼镜头受到水下斯涅耳窗口现象的启发,采用不同的投影方式,来得到极大的视场角ÿ…

django -- url 的 name 属性
在html的form中使用给url定义的name值,可以在修改url时不用在修改form的src。 urls.py from django.conf.urls import url from mytest import viewsurlpatterns [# url(r^admin/, admin.site.urls),url(r^index/, views.index, namemysite), views.Index.as_view(…

两个矩形重叠部分面积
#include<stdio.h> #include<math.h> #define min(a,b) ( ((a)>(b)) ? (b):(a) ) #define max(a,b) ( ((a)>(b)) ? (a):(b) )typedef struct xy { int x; int y; }xy;void main() {xy a[4];int s,chang,kuang;while (true){printf("Please input 4 x,…

前百度面试官整理的——Java后端面试题(一)
2019独角兽企业重金招聘Python工程师标准>>> List 和 Set 的区别 List , Set 都是继承自 Collection 接口 List 特点:元素有放入顺序,元素可重复 , Set 特点:元素无放入顺序,元素不可重复,重复元…