千家信息网

大数据 MongoDB 复制集管理

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,MongoDB 复制集MongoDB复制是将数据同步在多个服务器的过程。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。复制还允许您从硬件故障和服
千家信息网最后更新 2025年01月20日大数据 MongoDB 复制集管理

MongoDB 复制集

  • MongoDB复制是将数据同步在多个服务器的过程。

  • 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。

  • 复制还允许您从硬件故障和服务中断中恢复数据。

复制集的优势

  • 保障数据的安全性
  • 数据高可用性 (24*7)
  • 灾难恢复
  • 无需停机维护(如备份,重建索引,压缩)
  • 分布式读取数据

    MongoDB复制原理

    mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

mongodb各个节点常见的搭配方式为:一主一从、一主多从。

主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

MongoDB复制结构图如下所示:

以上结构图中,客户端从主节点读取数据,在客户端写入数据到主节点时, 主节点与从节点进行数据交互保障数据的一致性。

复制集集特征:

  • N 个节点的集群
  • 任何节点可作为主节点
  • 所有写入操作都在主节点上
  • 自动故障转移
  • 自动恢复

安装 MongoDB (tar安装) :

  • 1.安装创建多实例 :

tar -zxvf mongodb-linux-x86_64-3.2.1.tgz -C /usr/local/cd /usr/local/mv mongodb-linux-x86_64-3.2.1/ mongodb      #重命名mkdir -p /data/mongodb/mongodb{1,2,3,4}     #创建数据目录mkdir -p /data/logstouch /data/logs/mongodb{1,2,3,4}.log       #创建日志文件cd /data/logs/chmod 777 *.log      #赋予权限cd /usr/local/mongodb/binvim mongodb1.confport=27017dbpath=/data/mongodb/mongodb1logpath=/data/logs/mongodb1.loglogappend=truefork=truemaxConns=5000storageEngine=mmapv1replSet=test     #复制集名称------------------------------------------------------------------------------------#下面是yum安装时修改、添加的replication:           #去注释  replSetName: test   #添加复制集名称
ln -s /usr/local/mongodb/bin/mongod /usr/bin/  #把mongodb常用的命令添加到系统命令中ln -s /usr/local/mongodb/bin/mongo /usr/bin/
  • 2.开启多实例、初始化配置复制集 :

[root@localhost bin]# mongo> cfg={"_id":"test","members":[{"_id":0,"host":"192.168.217.129:27017"},{"_id":1,"host":"192.168.217.129:27018"},{"_id":2,"host":"192.168.217.129:27019"}]}#配置复制集 ,注意复制集的名称要一致{    "_id" : "test",    "members" : [        {            "_id" : 0,            "host" : "192.168.217.129:27017"        },        {            "_id" : 1,            "host" : "192.168.217.129:27018"        },        {            "_id" : 2,            "host" : "192.168.217.129:27019"        }    ]}> rs.initiate(cfg)   #初始化配置时保证从节点没有数据{ "ok" : 1 }test:PRIMARY> rs.status()    #查看复制集的完整状态{     "set" : "test",        .......        {            "_id" : 0,            "name" : "192.168.217.129:27017",            "health" : 1,            "state" : 1,            "stateStr" : "PRIMARY",       #27017 端口作为主节点            "uptime" : 1234,            "optime" : {                "ts" : Timestamp(1531961046, 1),                "t" : NumberLong(1)            },            ......        },        {            "_id" : 1,            "name" : "192.168.217.129:27018",            "health" : 1,            "state" : 2,            "stateStr" : "SECONDARY",    #从节点            "uptime" : 49,            "optime" : {                "ts" : Timestamp(1531961046, 1),                "t" : NumberLong(1)            },            ......        },        {            "_id" : 2,            "name" : "192.168.217.129:27019",            "health" : 1,            "state" : 2,            "stateStr" : "SECONDARY",   #从节点            "uptime" : 49,            "optime" : {                "ts" : Timestamp(1531961046, 1),                "t" : NumberLong(1)            },            .......        }    ],    "ok" : 1}
  • 3.添加和删除节点 :

test:PRIMARY> rs.add("192.168.217.129:27020")     #添加节点{ "ok" : 1 }test:PRIMARY> rs.status()    ........            "_id" : 3,            "name" : "192.168.217.129:27020",            "health" : 1,            "state" : 2,            "stateStr" : "SECONDARY",    ........test:PRIMARY> rs.remove("192.168.217.129:27020")  #删除节点{ "ok" : 1 }test:PRIMARY> rs.status().........
  • 4. 模拟故障,查看主节点是否自动切换 :

[root@localhost bin]# mongod -f mongodb1.conf --shutdown   #关闭主节点端口killing process with pid: 3552[root@localhost bin]# mongo --port 27018  test:SECONDARY> rs.status(){    "set" : "test",    .......        {            "_id" : 0,            "name" : "192.168.217.129:27017",               "health" : 0,            "state" : 8,            "stateStr" : "(not reachable/healthy)",              "uptime" : 0,            "optime" : {            .......        {            "_id" : 1,            "name" : "192.168.217.129:27018",            "health" : 1,            "state" : 2,            "stateStr" : "SECONDARY",            "uptime" : 1811,            .......        {            "_id" : 2,            "name" : "192.168.217.129:27019",   #自动切换主节点            "health" : 1,            "state" : 1,            "stateStr" : "PRIMARY",            "uptime" : 712,            ......        }    ],    "ok" : 1}
  • 5. 手动切换主节点 :

[root@localhost bin]# mongo --port 27019  test:PRIMARY> rs.freeze(30)        #暂停30s不参与选举{ "ok" : 1 }test:PRIMARY> rs.stepDown(60,30)  #交出主节点位置,维持从节点状态不少于60秒,等待30秒使主节点和从节点日志同步test:SECONDARY> rs.status()......
  • 6. 允许从节点读取数据 :

test:SECONDARY> show dbs   #2018-07-19T09:04:34.898+0800 E QUERY    [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } :_getErrorWithCode@src/mongo/shell/utils.js:23:13Mongo.prototype.getDBs@src/mongo/shell/mongo.js:53:1shellHelper.show@src/mongo/shell/utils.js:700:19shellHelper@src/mongo/shell/utils.js:594:15@(shellhelp2):1:1test:SECONDARY> rs.slaveOk()    #允许默认从节点读取数据test:SECONDARY> show dbslocal  1.078GB
  • 7. 更改 oplog 大小 :

test:PRIMARY> use localswitched to db localtest:PRIMARY> rs.printReplicationInfo()  #查看日志文件能够使用的大小 默认oplog大小会占用64位实例5%的可用磁盘空间configured oplog size:   95.37109375MBlog length start to end: 1103secs (0.31hrs)oplog first event time:  Thu Jul 19 2018 08:43:55 GMT+0800 (CST)oplog last event time:   Thu Jul 19 2018 09:02:18 GMT+0800 (CST)now:                     Thu Jul 19 2018 09:20:08 GMT+0800 (CST)test:PRIMARY> db.runCommand({"convertToCapped":"oplog.rs","size":10000000000}) #修改  单位:B{ "ok" : 1 }test:PRIMARY> rs.printReplicationInfo()configured oplog size:   9536.746032714844MBlog length start to end: 1103secs (0.31hrs)oplog first event time:  Thu Jul 19 2018 08:43:55 GMT+0800 (CST)oplog last event time:   Thu Jul 19 2018 09:02:18 GMT+0800 (CST)now:                     Thu Jul 19 2018 09:20:24 GMT+0800 (CST)test:PRIMARY> 
0