0

0

MongoDB复制选举原理及复制集管理

星夢妙者

星夢妙者

发布时间:2025-07-10 12:46:02

|

370人浏览过

|

来源于php中文网

原创

MongoDB复制集选举简介

mongodb中,复制集的节点通过选举机制产生主节点。复制基于操作日志(oplog),类似于mysql中的二进制日志,记录所有数据变更。复制过程是将主节点的oplog同步并应用到其他从节点。

选举原理

节点类型包括标准(host)节点、被动(passive)节点和仲裁(arbiter)节点。

MongoDB复制选举原理及复制集管理

  1. 标准节点:只有标准节点可能被选举为主(primary)节点,拥有选举权。
  2. 被动节点:拥有完整副本,但只能作为复制集的保存节点,不可能成为主节点,没有选举权。
  3. 仲裁节点:不存放数据,只负责投票选举,也不可能成为主节点,没有选举权。

标准节点与被动节点的区别在于优先级(priority)值,值高者为标准节点,值低者为被动节点。选举规则是票数高者获胜,priority值在0到1000之间,相当于额外增加0到1000的票数。选举结果:票数高者胜出;若票数相同,数据新者胜出。

安装MongoDB

  1. 自定义yum源文件

    [root@RedHat7_6 ~]# cd /etc/yum.repos.d/
    [root@redhat7_6 yum.repos.d]# mkdir bak
    [root@redhat7_6 yum.repos.d]# mv CentOS-* bak/
    [root@redhat7_6 yum.repos.d]# vim local.repo
    

    [mongodb-org] name=MongoDB Repository baseurl=https://www.php.cn/link/d8c3b11e26ab89d9712734aac8765677 gpgcheck=1 enabled=1 gpgkey=https://www.php.cn/link/63515bad9f509b6783009bc4bca0162e

  2. 安装MongoDB

    [root@redhat7_6 ~]# yum -y install mongodb-org
    [root@redhat7_6 ~]# yum clean all #清除yum缓存
    [root@redhat7_6 ~]# yum list #重新加载源

配置复制集

  1. 创建实例相关文件

    [root@redhat7_6 ~]# mkdir -p /data/mongodb/mongodb{1,2,3,4} #创建数据目录
    [root@redhat7_6 ~]# mkdir -p /data/logs/mongodb #创建日志目录
    [root@redhat7_6 ~]# cd /data/logs/mongodb/
    [root@redhat7_6 mongodb]# touch mongodb{1,2,3,4}.log #创建日志文件
    [root@redhat7_6 mongodb]# chmod 777 *.log #修改目录权限
  2. 编辑实例1配置文件

    [root@redhat7_6 ~]# cp -p /etc/mongod.conf /etc/mongod1.conf
    [root@redhat7_6 ~]# vim /etc/mongod1.conf #修改配置文件

    path: /data/logs/mongodb/mongodb1.log #约第10行,编辑日志文件路径,对应其他的实例依次往下…… dbPath: /data/mongodb/mongodb1/ #编辑数据目录文件路径,也是一样对应其他的实例依次往下…… net: #约28行,指定网络接口 port: 27017 #编辑端口号,实例1为27017,实例2为27018,依次往下排…… bindIp: 0.0.0.0 replication: #约37行,打开复制选项注释,四台实例都要添加 replSetName: kgcrs #指定复制集名称

  3. 编辑其他实例配置文件

    [root@redhat7_6 ~]# cp -p /etc/mongod1.conf /etc/mongod2.conf #创建其他三个MongoDB实例配置文件
    [root@redhat7_6 ~]# cp -p /etc/mongod1.conf /etc/mongod3.conf
    [root@redhat7_6 ~]# cp -p /etc/mongod1.conf /etc/mongod4.conf
    [root@redhat7_6 ~]# rm -rf /etc/mongod.conf
  4. 编写启动脚本

    [root@redhat7_6 ~]# vim /etc/init.d/mongodb

    !/bin/bash

    descript:Mongodb Server Control Script

    Author: GuiHaiYiDao TEL:139741741741

    date:long long ago

    instance=$1 action=$2 case "$action" in 'start') /usr/bin/mongod -f /etc/"$instance".conf ;; 'stop') /usr/bin/mongod -f /etc/"$instance".conf --shutdown ;; 'restart') /usr/bin/mongod -f /etc/"$instance".conf --shutdown /usr/bin/mongod -f /etc/"$instance".conf ;; esac

    [root@redhat7_6 ~]# chmod +x /etc/init.d/mongodb

    [root@redhat7_6 ~]# /etc/init.d/mongodb mongod1 start [root@redhat7_6 ~]# /etc/init.d/mongodb mongod2 start [root@redhat7_6 ~]# /etc/init.d/mongodb mongod3 start [root@redhat7_6 ~]# /etc/init.d/mongodb mongod4 start

    [root@redhat7_6 ~]# netstat -anpt | grep 'mongod'

    MongoDB复制选举原理及复制集管理

  5. 初始化配置复制集

    [root@redhat7_6 ~]# mongo --port 27017

    > cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.100.76:27017","priority":100},{"_id":1,"host":"192.168.100.76:27018","priority":100},{"_id":2,"host":"192.168.100.76:27019","priority":0},{"_id":3,"host":"192.168.100.76:27020","arbiterOnly":true}]} #定义两个主节点,一个被动节点,一个仲裁节点 > rs.initiate(cfg) #初始化复制集 > kgcrs:PRIMARY > rs.isMaster() #查看群集状态 { "hosts" : [ #标准节点 "192.168.100.76:27017", "192.168.100.76:27018" ], "passives" : [ #被动节点 "192.168.100.76:27019" ], "arbiters" : [ #仲裁节点 "192.168.100.76:27020" ], "setName" : "kgcrs", "setVersion" : 1, "ismaster" : true, "secondary" : false, "primary" : "192.168.100.76:27017", "me" : "192.168.100.76:27017", "electionId" : ObjectId("7fffffff0000000000000001"), }

验证复制集选举原理

  1. 查看oplog日志

    kgcrs:PRIMARY> use testDB #进入或创建库
    kgcrs:PRIMARY> db.t1.insert({"id":1,"name":"Tom"}) #插入数据
    kgcrs:PRIMARY> db.t1.insert({"id":2,"name":"Jack"})
    kgcrs:PRIMARY> db.t1.find() #查看集合
    { "_id" : ObjectId("5b95c4c915740fa3d0077e8d"), "id" : 1, "name" : "Tom" }
    { "_id" : ObjectId("5b95c4d715740fa3d0077e8e"), "id" : 2, "name" : "Jack" }
    kgcrs:PRIMARY> db.t1.update({"id":2},{"$set":{"name":"Bob"}}) #修改数据
    kgcrs:PRIMARY> db.t1.remove({"id":2}) #移除数据
    kgcrs:PRIMARY> show dbs
    kgcrs:PRIMARY> use local #进入local库
    kgcrs:PRIMARY> show collections
    kgcrs:PRIMARY> db.oplog.rs.find() #注意查看每个文档都代表主节点上执行的一个操作,oplog会包含所有对数据有修改的操作(查询操作不会记录)

    MongoDB复制选举原理及复制集管理

  2. 模拟主节点01故障(端口27017)

    [root@redhat7_6 ~]# /etc/init.d/mongodb mongod1 stop #关闭01节点服务器
    [root@redhat7_6 ~]# mongo --port 27018

    kgcrs:PRIMARY> rs.status() #查看复制状态

    MongoDB复制选举原理及复制集管理

  3. 模拟主节点02故障(端口27018)

    [root@redhat7_6 ~]# /etc/init.d/mongodb mongod2 stop
    [root@redhat7_6 ~]# mongo --port 27019 #进入第三个实例

    MongoDB复制选举原理及复制集管理

  4. 启动标准节点

    [root@redhat7_6 ~]# /etc/init.d/mongodb mongod1 start #第一个先启动实例1,成为主节点。可以进行人为控制
    [root@redhat7_6 ~]# /etc/init.d/mongodb mongod2 start

    kgcrs:PRIMARY> rs.status()

    MongoDB复制选举原理及复制集管理

MongoDB复制集管理

  1. 配置允许在从节点读取数据

    1). 查看实例1服务

       [root@redhat7_6 ~]# mongo --port 27017

    kgcrs:PRIMARY> show dbs kgcrs:PRIMARY> use testDB kgcrs:PRIMARY> db.t1.find() #查询集合数据 { "_id" : ObjectId("5b98d55d06a599fff182be6d"), "id" : 1, "name" : "Tom" }

    2). 设置允许读取数据

       [root@redhat7_6 ~]# mongo --port 27018

    kgcrs:SECONDARY> rs.slaveOk() #允许默认从节点读取数据 kgcrs:SECONDARY> show dbs …… testDB 0.000GB #读取成功 kgcrs:SECONDARY> use testDB kgcrs:SECONDARY> db.t1.find()

    MongoDB复制选举原理及复制集管理

  2. 查看复制状态信息

    I-Shop购物系统
    I-Shop购物系统

    部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/

    下载
    kgcrs:SECONDARY> rs.help() #查看命令帮助
    kgcrs:SECONDARY> rs.printReplicationInfo()
    configured oplog size: 990MB #oplog文件大小
    log length start to end: 7688secs (2.14hrs) #日志启用的时间段。单位:秒
    oplog first event time: Wed Sep 12 2018 16:50:59 GMT+0800 (CST) #第一个事务日志的产生时间
    oplog last event time: Wed Sep 12 2018 18:59:07 GMT+0800 (CST) #第一个事务日志的结束时间
    now: Wed Sep 12 2018 18:59:16 GMT+0800 (CST) #当前时间
    kgcrs:SECONDARY> rs.printSlaveReplicationInfo() #可以通过下面IP、端口发现,仲裁节点不具备数据复制
    source: 192.168.100.76:27018 #从库的IP及端口
    syncedTo: Wed Sep 12 2018 18:59:27 GMT+0800 (CST) #目前的同步情况,延迟了多久等信息
    0 secs (0 hrs) behind the primary
    source: 192.168.100.76:27019
    syncedTo: Wed Sep 12 2018 18:59:27 GMT+0800 (CST)
    0 secs (0 hrs) behind the primary
  3. 更改oplog大小简介

    oplog,即operations log的简写,存储在local数据库中。新操作会自动替换旧的操作,以保证oplog不会超过预设的大小。默认情况下,oplog大小会占用64位实例5%的可用磁盘空间。

    原理:主节点应用业务操作修改数据后,记录这些操作到oplog中,从节点复制这些oplog并应用这些修改。这些操作是异步的。如果从节点的操作落后主节点太多,oplog日志可能已经轮滚一圈,从节点跟不上同步,复制就会停止,从节点需要重新做完整的同步。为了避免这种情况,尽量保证主节点的oplog足够大,能够存放相当长时间的操作记录。

    1). 关闭从节点服务器

       [root@redhat7_6 ~]# mongo --port 27018

    kgcrs:SECONDARY> use admin kgcrs:SECONDARY> db.shutdownServer() #关闭服务,从复制集成员退出来

    2). 修改从节点主配置文件

       [root@redhat7_6 ~]# vim /etc/mongod2.conf

    MongoDB复制选举原理及复制集管理

    3). 启动单实例

       [root@redhat7_6 ~]# /etc/init.d/mongodb mongod2 start

    MongoDB复制选举原理及复制集管理

    4). 备份当前节点所有oplog记录

       [root@redhat7_6 ~]# mongodump --port 27028 --db local --collection 'oplog.rs'

    port #指定端口 db #指定数据库 collection #指定集合

    5). 更改oplog文件大小

       [root@redhat7_6 ~]# mongo --port 27028

    > use local > db.oplog.rs.drop() #删除oplog文件 > db.runCommand({ create: "oplog.rs", capped: true, size: (2 1024 1024 * 1024)}) #重建文件,指定2048M的空间

    6). 暂时关闭服务

       > use admin
    > db.shutdownServer()

    7). 修改从节点主配置文件

       [root@redhat7_6 ~]# vim /etc/mongod2.conf

    net: port: 27018 #约29行,把端口改成27018 replication: #约37行,打开复制选项 replSetName: kgcrs #解开注释 oplogSizeMB: 2048 #添加oplog日志文件大小2048MB

    8). 登录服务

       [root@redhat7_6 ~]# /etc/init.d/mongodb mongod2 start
    [root@redhat7_6 ~]# mongo --port 27018

    kgcrs:SECONDARY> rs.printReplicationInfo()

    9). 进行主从切换

       [root@redhat7_6 ~]# mongo --port 27017

    kgcrs:PRIMARY> rs.freeze(30) #暂停30秒不参加选举 kgcrs:PRIMARY> rs.stepDown(60,30) #告知主节点交出主节点位置,然后维持从节点状态不少于60秒,同时等待30秒以使主节点和从节点日志同步

    [root@redhat7_6 ~]# mongo --port 27018

    MongoDB复制选举原理及复制集管理

部署认证复制

[root@redhat7_6 ~]# mongo --port 27018
  1. 创建用户

    kgcrs:PRIMARY> use admin
    kgcrs:PRIMARY> db.createUser({"user":"root","pwd":"123","roles":["root"]})
  2. 修改主配置文件

    [root@redhat7_6 ~]# vim /etc/mongod1.conf

    security: #约33行,开启认证功能 keyFile: /usr/bin/kgcrskey1 #指定验证文件路径。!!!注意实例1是kgcrskey1 ;实例2是kgcrskey2;实例3是kgcrskey3 clusterAuthMode: keyFile #指定验证模式,秘钥文件验证 [root@redhat7_6 ~]# vim /etc/mongod2.conf #依次第2、3、4实例都要添加上面句。!!!注意验证文件路径要修改

    [root@redhat7_6 ~]# vim /etc/mongod3.conf [root@redhat7_6 ~]# vim /etc/mongod4.conf

  3. 生成秘钥文件

    [root@redhat7_6 ~]# cd /usr/bin/
    [root@redhat7_6 bin]# echo "kgcrs key" > kgcrskey1
    [root@redhat7_6 bin]# echo "kgcrs key" > kgcrskey2
    [root@redhat7_6 bin]# echo "kgcrs key" > kgcrskey3
    [root@redhat7_6 bin]# echo "kgcrs key" > kgcrskey4
  4. 更改目录权限

    [root@redhat7_6 bin]# chmod 600 kgcrskey{1..4} #复制集对keyFile的权限有要求,最多到600
  5. 重启实例

    [root@redhat7_6 ~]# /etc/init.d/mongodb mongod1 restart
    [root@redhat7_6 ~]# /etc/init.d/mongodb mongod2 restart
    [root@redhat7_6 ~]# /etc/init.d/mongodb mongod3 restart
    [root@redhat7_6 ~]# /etc/init.d/mongodb mongod4 restart
  6. 访问主节点

    [root@redhat7_6 ~]# mongo --port 27017

    MongoDB复制选举原理及复制集管理

  7. 验证访问

    kgcrs:PRIMARY> use admin
    kgcrs:PRIMARY> db.auth("root","123")

    MongoDB复制选举原理及复制集管理

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

662

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

246

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

514

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

253

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

528

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

599

2023.08.14

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.2万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号