MongoDB 复制集的选举原理
复制的原理
复制时基于啊哦做日志 oplog , 相当于 MySQL 中的二进制日志,只记录发生改变的记录。复制是将主节点的oplog 日志同步并应用到其他从节点的过程。
选举的原理
节点类型分为标准(host)节点 、被动(passive)节点和仲裁(arbiter)节点。
(1)只有标准节点可能被选举为活跃(primary)节点,有选举权。被动节点有完整副本,不可能成为活跃节点,有选举权。仲裁节点不复制数据,不可能成为活跃节点,只有选举权。
(2)标准节点与被动节点的区别:primary 值高者是标准节点,低者则为被动节点。
(3)选举规则是票数高者获胜,primary 是优先权为 0~1000 的值,相当于额为增加 0~1000 的票数。选举结果:票数高者获胜;若票数相同,数据新者获胜。
实验部署
搭建配置4个 MongoDB 实例 mongodb 、mongpdb2 、mongodb3 、mongodb4 。 IP 地址:192.168.213.184
由于MongoDB 数据库安装好后,mongodb 为默认第一个实例,因此只要再搭建2 ,3,4 实例即可
1. 配置复制集
(1)创建数据文件和日志文件存储路径
[root@localhost ~]# mkdir -p /data/mongodb/mongodb{2,3,4} #创建数据库文件2,3,4
[root@localhost ~]# cd /data/mongodb/
[root@localhost mongodb]# ls
mongodb2 mongodb3 mongodb4
[root@localhost mongodb]# mkdir logs
[root@localhost mongodb]# ls
logs mongodb2 mongodb3 mongodb4
[root@localhost mongodb]# cd logs/
[root@localhost logs]# touch mongodb{2,3,4}.log #在 /data/mongodb/logs/ 目录下的日志存储路径
[root@localhost logs]# chmod - R 777 /data/mongodb/logs/*.log #修改目录权限
[root@localhost logs]# ls -l
总用量 0
-rwxrwxrwx. 1 root root 0 9月 13 18:43 mongodb2.log
-rwxrwxrwx. 1 root root 0 9月 13 18:43 mongodb3.log
-rwxrwxrwx. 1 root root 0 9月 13 18:43 mongodb4.log
(2)配置实例1 的配置文件,启用复制集名称
[root@localhost logs]# vim /etc/mongod.conf
replication:
replSetName: abc #去掉注释,指定复制集名称(名称随便定义)
创建多实例配置文件
[root@localhost logs]# cp -p /etc/mongod.conf /etc/mongod2.conf 复制生成实例2 的配置文件
[root@localhost logs]# vim /etc/mongod2.confsystemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/mongodb2.log #日志文件位置storage:
dbPath: /data/mongodb/mongodb2 #数据文件位置
journal:
enabled: trueport: 27018 #端口号,默认端口号为27017,因此实例2 的端口号要与之区别,实例3和4 依次往后排
配置其他实例,与实例2修改一样,注意端口号
[root@localhost logs]# cp -p /etc/mongod2.conf /etc/mongod3.conf
[root@localhost logs]# cp -p /etc/mongod2.conf /etc/mongod4.conf
(3)启动服务并查看端口是否开启
[root@localhost logs]# mongod -f /etc/mongod.conf –shutdown #先关闭实例1 的服务,在开启
killing process with pid: 3997 #进程号
[root@localhost logs]# mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 4867
child process started successfully, parent exiting
[root@localhost logs]# mongod -f /etc/mongod2.conf #启动实例2 的服务
about to fork child process, waiting until server is ready for connections.
forked process: 4899
child process started successfully, parent exiting
[root@localhost logs]# mongod -f /etc/mongod3.conf #启动实例3 的服务
about to fork child process, waiting until server is ready for connections.
forked process: 4927
child process started successfully, parent exiting
[root@localhost logs]# mongod -f /etc/mongod4.conf #启动实例4 的服务
about to fork child process, waiting until server is ready for connections.
forked process: 4955查看节点端口是否开启
[root@localhost logs]# netstat -ntap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:27019 0.0.0.0:* LISTEN 4927/mongod
tcp 0 0 0.0.0.0:27020 0.0.0.0:* LISTEN 4955/mongod
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 4867/mongod
tcp 0 0 0.0.0.0:27018 0.0.0.0:* LISTEN 4899/mongod
(4)查看各实例能否进入 mongodb 数据库
[root@localhost logs]# mongo
MongoDB shell version v3.6.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.7[root@localhost logs]# mongo --port 27018
MongoDB shell version v3.6.7
connecting to: mongodb://127.0.0.1:27018/
MongoDB server version: 3.6.7
Server has startup warnings:[root@localhost logs]# mongo --port 27019
MongoDB shell version v3.6.7
connecting to: mongodb://127.0.0.1:27019/
MongoDB server version: 3.6.7
Server has startup warnings:[root@localhost logs]# mongo --port 27020
MongoDB shell version v3.6.7
connecting to: mongodb://127.0.0.1:27020/
MongoDB server version: 3.6.7
2 . 配置复制集的优先级
(1)登录默认实例 mongo,重新配置4个节点 MongoDB 复制集,设置两个标准节点,有个被动节点和一个仲裁节点,命令如下:
根据优先级确定节点: 优先级为 100的为标准节点,端口号为 27017和27018 ,优先级为0 的为被动节点,端口号为27019;仲裁节点为27020
> cfg={"_id":"abc","members":[{"_id":0,"host":"192.168.213.184:27017","priority":100},{"_id":1,"host":"192.168.213.184:27018","priority":100},{"_id":2,"host":"192.168.213.184:27019","priority":0},{"_id":3,"host":"192.168.213.184:27020","arbiterOnly":true}]}
{
"_id" : "abc",
"members" : [
{
"_id" : 0,
"host" : "192.168.213.184:27017", #标准节点,优先级为100
"priority" : 100
},
{
"_id" : 1,
"host" : "192.168.213.184:27018", #标准节点
"priority" : 100
},
{
"_id" : 2,
"host" : "192.168.213.184:27019", #被动节点,优先级为0
"priority" : 0
},
{
"_id" : 3,
"host" : "192.168.213.184:27020", #仲裁节点
"arbiterOnly" : true
}
]
}
> rs.initiate(cfg) # 初始化复制集
{
"ok" : 1,
"operationTime" : Timestamp(1536819122, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1536819122, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
(2)使用命令 rs.isMaster() 查看各节点身份
abc:PRIMARY> rs.isMaster()
{
"hosts" : [ #标准节点
"192.168.213.184:27017",
"192.168.213.184:27018"
],
"passives" : [ #被动节点
"192.168.213.184:27019"
],
"arbiters" : [ #仲裁节点
"192.168.213.184:27020"
],
"setName" : "abc",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.213.184:27017",
(3)此时默认实例已经被选举为活跃(primary)节点,可以在数据库中插入信息了。
abc:PRIMARY> use school #活跃节点(primory)
switched to db school
abc:PRIMARY> db.info.insert({"id":1,"name":"lili"}) #插入两条信息
WriteResult({ "nInserted" : 1 })
abc:PRIMARY> db.info.insert({"id":2,"name":"tom"})
WriteResult({ "nInserted" : 1 })
(4)查看日志记录所有操作,在默认数据库 local 中的oplog.rs 查看
abc:PRIMARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
school 0.000GB
abc:PRIMARY> use local #进入 local 数据库
switched to db local
abc:PRIMARY> show collections #显示
me
oplog.rs
replset.election
replset.minvalid
startup_log
system.replset
system.rollback.id
abc:PRIMARY> db.oplog.rs.find() #查看日志记录所有操作
通过日志记录,可以找到刚才加入的两条信息
"school.info", "ui" : UUID("2b9c93b6-a58a-4021-a2b4-33f9b19925d8"), "wall" : ISODate("2018-09-13T06:24:44.537Z"), "o" : { "_id" : ObjectId("5b9a02aca106c3eab9c639e5"), "id" : 1, "name" : "lili" } }
{ "ts" : Timestamp(1536819899, 1), "t" : NumberLong(1), "h" : NumberLong("-1447313909384631008"), "v" : 2, "op" : "i", "ns" : "school.info", "ui" : UUID("2b9c93b6-a58a-4021-a2b4-33f9b19925d8"), "wall" : ISODate("2018-09-13T06:24:59.186Z"), "o" : { "_id" : ObjectId("5b9a02bba106c3eab9c639e6"), "id" : 2, "name" : "tom" } }
3.模拟节点故障,如果主节点出现故障,另一个标准节点会选举成为新的主节点。
(1)先查看当前状态,使用命令 rs.status()
abc:PRIMARY> rs.status()
"members" : [
{
"_id" : 0,
"name" : "192.168.213.184:27017", #标准节点,端口27017,作为主节点
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2481,
"optime" : {
"ts" : Timestamp(1536820334, 1),
"t" : NumberLong(1)
},{
"_id" : 1,
"name" : "192.168.213.184:27018", #标准节点 ,端口27018 为从节点
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1213,
"optime" : {
"ts" : Timestamp(1536820324, 1),
"t" : NumberLong(1)
},{
"_id" : 2,
"name" : "192.168.213.184:27019", #被动节点, 端口27019位从节点
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1213,
"optime" : {
"ts" : Timestamp(1536820324, 1),
"t" : NumberLong(1)
},{
"_id" : 3,
"name" : "192.168.213.184:27020", #仲裁节点
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 1213,
"lastHeartbeat" : ISODate("2018-09-13T06:32:14.152Z"),
(2)模拟主节点故障,关闭主节点服务,登录另一个标准节点端口 27018 ,查看麟能够一个标准节点是否被选举为主节点
abc:PRIMARY> exit
bye
[root@localhost logs]# mongod -f /etc/mongod.conf –shutdown #关闭主节点服务
killing process with pid: 4821
[root@localhost logs]# mongo --port 27018 #指定27018 端口进入数据库abc:PRIMARY> rs.status() #查看状态
"members" : [
{
"_id" : 0,
"name" : "192.168.213.184:27017",
"health" : 0, #健康之为 0 ,说明端口27017 已经宕机了
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},{
"_id" : 1,
"name" : "192.168.213.184:27018", #此时另一台标准节点被选举为主节点,端口为 27018
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2812,
"optime" : {
"ts" : Timestamp(1536820668, 1),
"t" : NumberLong(2)
},{
"_id" : 2,
"name" : "192.168.213.184:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1552,
"optime" : {
"ts" : Timestamp(1536820668, 1),
"t" : NumberLong(2)
},{
"_id" : 3,
"name" : "192.168.213.184:27020",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 1552,其中, health 为 1 代表健康,0 代表宕机。 state 为 1 代表主节点,为 2 代表从节点
(3)将标准节点服务全部关闭,查看被动节点是否会被选举为主节点
abc:PRIMARY> exit
bye
[root@localhost logs]# mongod -f /etc/mongod2.conf –shutdown #关闭主节点服务
killing process with pid: 4853
[root@localhost logs]# mongo --port 27019 #开启备用节点服务abc:SECONDARY> rs.status()
"members" : [
{
"_id" : 0,
"name" : "192.168.213.184:27017", #此时两个标准节点都处于宕机状态,健康值为 0
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},{
"_id" : 1,
"name" : "192.168.213.184:27018",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},{
"_id" : 2,
"name" : "192.168.213.184:27019", #被动节点并没有被选举为主节点,说明被动节点不可能成为活跃节点
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 3102,
"optime" : {
"ts" : Timestamp(1536820928, 1),
"t" : NumberLong(2)
},{
"_id" : 3,
"name" : "192.168.213.184:27020",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 1849,
(4)再次启动标准节点服务,查看主节点能否恢复。
abc:SECONDARY> exit
bye
[root@localhost logs]# mongod -f /etc/mongod.conf #启动实例1 的服务
about to fork child process, waiting until server is ready for connections.
forked process: 39839
child process started successfully, parent exiting
[root@localhost logs]# mongod -f /etc/mongod2.conf #启动实例2的服务
about to fork child process, waiting until server is ready for connections.
forked process: 39929
child process started successfully, parent exiting
[root@localhost logs]# mongo{
"_id" : 0,
"name" : "192.168.213.184:27017", #端口27017 恢复为主节点,(与标准节点启动顺序有关,先启动的为主节点)
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 25,
"optime" : {
"ts" : Timestamp(1536821324, 1),
"t" : NumberLong(3)
},{
"_id" : 1,
"name" : "192.168.213.184:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 14,
"optime" : {
"ts" : Timestamp(1536821324, 1),
"t" : NumberLong(3)
},{
"_id" : 2,
"name" : "192.168.213.184:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 23,
"optime" : {{
"_id" : 3,
"name" : "192.168.213.184:27020",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 23,
由此可以看出:只有标准节点可能被选举为活跃节点(主 primary),被动节点不可能成为活跃节点,有选举权。仲裁节点不可能成为活跃节点。
转载于:https://blog.51cto.com/13706703/2175076
MongoDB 复制集的选举原理相关推荐
- MongoDB复制集原理和配置
MongoDB高手课_MongoDB_NoSQL-极客时间极客时间推出的MongoDB高手课是帮助互联网从业者学习MongoDB.NoSQL的在线课程,极客时间是面向IT领域的知识服务产品,致力于帮助 ...
- MongoDB复制集原理、搭建及复制集简单维护
##一.MongoDB复制集原理 ###(一)复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Drive ...
- 数据库应用----Mongodb 4.0 版本 基础操作---复制集,选举方法、部署认证 (二)
Mongodb 4.0 版本 基础操作-复制集,选举方法.部署认证 (二) 文章目录 Mongodb 4.0 版本 基础操作---复制集,选举方法.部署认证 (二) 一.MongoDB 复制集 二.部 ...
- 配置MongoDB复制集
什么是复制集? 复制集是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余并增加了数据可用性,通过复制集可以对硬件故障和中断的服务进行恢复. 复制集的优势如下: 让数据更安全 高数据可用性 ...
- Raft与MongoDB复制集协议比较
在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...
- MongoDB复制集技术
为什么使用MongogDB复制集技术? mysql中:一主一从,一主多从结构存在的问题 1. fileover(故障转移)a) 选主投票b) 切换 2. 是否对就用透明化 3. 数据补偿的问题a) 两 ...
- MongoDB 复制集节点增加移除及节点属性配置
复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机 ...
- MongoDB复制集搭建主服务器模拟切换
前言 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Second ...
- MongoDB 复制集 (一) 成员介绍
一 MongoDB 复制集简介 MongoDB复制集机制主要分为两种: Master-Slave (主从复制) 这个已经不建议使用 ...
最新文章
- 分享个网盘,个人觉得很不错!
- IOS 设置视图半透明子控件不透明
- getdata提取曲线数据_Origin如何从图表中获取数据
- tf+gpu无法复现
- AAAI 2021 | 基于动态混合关系网络的对话式语义解析方法
- 论文中地层岩性和岩组描述总结
- 9600kf功耗和温度评测_i5-9400F与i5-9600KF性能差距大吗?i5 9600KF和9400F区别对比
- c语言= 什么意思,C语言=是什么意思?
- uva live 4394 String painter 区间dp
- IT项目经理每天每周都在干什么?附简要周报模板
- Revit导入CAD翻模丨CAD图层管理控制显示隐藏图层
- lcd12864资料
- 加州大学洛杉矶分校计算机硕士学费,美国加州大学洛杉矶分校计算机科学硕士.pdf...
- kalilinux安装中文输入法 安装fcitx,小企鹅输入法。
- Arduino Pulsesensor脉搏心率的检测
- 西岸风格合成器-Eventide Newfangled Audio Generate 1.2.1 WiN
- B站带货,如何快速创作B站爆款带货视频?
- java图片编辑器,Java图片编辑工具thumbnailator
- 贪吃蛇大作战中的“马太效应”
- 对 算术基本定理 的研究
热门文章
- 全面介绍Windows内存管理机制及C++内存分配实例(五):堆
- TCP/IP模型如何分层?路由器、网卡分别属于哪一层?
- N76E003 工程创建教程
- 《WEB渗透一.信息收集》
- 关于事件委托的整理 ,另附bind,live,delegate,on区别
- 大数据基础知识问答----hadoop篇
- ASP.NET MVC4 部分视图
- WPF基础学习笔记(一)Dependency Object 和 Dependency Property
- 通过Java代码浅谈HTTP协议
- Asp.net MVC 多语言问题的解决方案