MongoDB复制集搭建步骤,本次搭建使用3台机器,一个是主节点,一个是从节点,一个是仲裁者。

主节点负责与前台客户端进行数据读写交互,从节点只负责容灾,构建高可用,冗余备份。仲裁者的作用是当主节点宕机后进行裁决,让从节点替代主节点。

仲裁者的定义:

仲裁者(Arbiter)是复制集中的一个mongodb实例,它并不保存数据。仲裁节点使用最小的资源并且不要求硬件设备,不能将Arbiter部署在同一个数据集节点中,可以部署在其他应用服务器或者监视服务器中,也可部署在单独的虚拟机中。为了确保复制集中有奇数的投票成员(包括primary),需要添加仲裁节点做为投票,否则primary不能运行时不会自动切换primary。

1、3个节点的IP分别是

172.31.22.29--------------->主节点
172.31.26.133--------------->从节点
172.31.17.203-------------->仲裁者

此外在三台机器上分别部署mongoDB服务。版本最好一样,我们这次搭建是版本3.4.18。

2、修改配置文件,添加如下内容:

上面的这个图片中“replSet”是关键字,其中的S是大写。

修改完配置文件后保存即可,三台机器的配置文件都要添加这一行内容。

3、初始化数据集。

现在我们把三台机器的mongodb都启动并放在后台运行。

然后我们在主节点的这台机器上进行初始化

rs.initiate({_id:'repl1',members:[{_id:1,host:'IP:27017'}]}) 
初始化参数说明: 
_id:复制集名称(第一个_id) 
members:复制集服务器列表 
_id:服务器的唯一ID(数组里_id) 
host:服务器主机 
我们操作的是172.31.22.29服务器,其中chaofeng即是复制集名称,和mongodb.conf中保持一致,初始化复制集的第一个服务器将会成为主复制集

查看一下状态

chaofeng:SECONDARY> rs.status()
{
"set" : "chaofeng",
"date" : ISODate("2018-11-14T08:20:17.034Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1542183612, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1542183612, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1542183612, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 1,
"name" : "172.31.22.29:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 932,
"optime" : {
"ts" : Timestamp(1542183612, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-11-14T08:20:12Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1542183500, 2),
"electionDate" : ISODate("2018-11-14T08:18:20Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1
}
chaofeng:PRIMARY> 

我们通过rs.status()可以看到,现在的这台机器已经变成PRIMARY主节点了。上面的“stateStr”显示为PRIMARY

4、主节点添加从节点

好了,现在从节点已经添加到主节点了。

我们打开从节点的mongo前台客户端,发现mongo确实已经变成了从节点SECONDARY。

如果添加不成功,查看一下防火墙等原因

5、主节点添加仲裁节点

查看一下发现已经添加成功了。

我们打开仲裁节点的mongo客户端:

发现此节点确实已经变成了仲裁节点了。

5、我们测试一下主从是否同步

在主节点进行测试:

chaofeng:PRIMARY> show dbs
admin 0.000GB
local 0.000GB
chaofeng:PRIMARY> db
test
chaofeng:PRIMARY> db.haha.insert({name:"chaofengchen",id:1})
WriteResult({ "nInserted" : 1 })
chaofeng:PRIMARY> db.haha.insert({name:"xiaoming",id:2})
WriteResult({ "nInserted" : 1 })
chaofeng:PRIMARY>

然后去从节点查看一下:

chaofeng:SECONDARY> db
test
chaofeng:SECONDARY> show collections;
2018-11-14T16:38:28.473+0800 E QUERY [thread1] Error: listCollections failed: {
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:807:1
DB.prototype.getCollectionInfos@src/mongo/shell/db.js:819:19
DB.prototype.getCollectionNames@src/mongo/shell/db.js:830:16
shellHelper.show@src/mongo/shell/utils.js:807:9
shellHelper@src/mongo/shell/utils.js:704:15
@(shellhelp2):1:1                                     #虽然报错,但是没有关系

chaofeng:SECONDARY> rs.slaveOk()                             #执行以下这一步骤
chaofeng:SECONDARY> show collections;
haha
chaofeng:SECONDARY> db.haha.find()
{ "_id" : ObjectId("5bebdee9d002b6374b81ea22"), "name" : "chaofengchen", "id" : 1 }
{ "_id" : ObjectId("5bebdef7d002b6374b81ea23"), "name" : "xiaoming", "id" : 2 }

很不错,发现已经同步成功了,从节点可以很好的接受主节点的数据记录,并进行同步复制

报错:"errmsg" : "not master and slaveOk=false"错误说明:因为secondary是不允许读写的,如果非要解决,则执行:rs.slaveOk()

如果你再去仲裁节点查看消息是否同步数据,你会发现仲裁节点是没有数据的,仲裁节点只参与投票,不进行数据同步

6、测试主从节点故障转移功能

现在我们关闭主节点mongo后台服务,相当于主节点突然宕机了

chaofeng:PRIMARY> use admin
switched to db admin
chaofeng:PRIMARY> db.shutdownServer()
server should be down...
2018-11-14T08:47:29.614+0000 I NETWORK [thread1] trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2018-11-14T08:47:29.758+0000 I NETWORK [thread1] Socket recv() Connection reset by peer 127.0.0.1:27017
2018-11-14T08:47:29.758+0000 I NETWORK [thread1] SocketException: remote: (NONE):0 error: 9001 socket exception [RECV_ERROR] server [127.0.0.1:27017]
2018-11-14T08:47:29.758+0000 I NETWORK [thread1] reconnect 127.0.0.1:27017 (127.0.0.1) failed failed
2018-11-14T08:47:29.761+0000 I NETWORK [thread1] trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2018-11-14T08:47:29.761+0000 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused
2018-11-14T08:47:29.761+0000 I NETWORK [thread1] reconnect 127.0.0.1:27017 (127.0.0.1) failed failed

然后我们去从节点客户端看看状态:

chaofeng:SECONDARY> rs.status()
{
"set" : "chaofeng",
"date" : ISODate("2018-11-14T08:48:19.227Z"),
"myState" : 1,
"term" : NumberLong(2),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1542185242, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1542185290, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1542185290, 1),
"t" : NumberLong(2)
}
},
"members" : [
{
"_id" : 1,
"name" : "172.31.22.29:27017",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2018-11-14T08:48:18.833Z"),
"lastHeartbeatRecv" : ISODate("2018-11-14T08:47:29.320Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Connection refused",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : -1
},
{
"_id" : 2,
"name" : "172.31.26.133:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2030,
"optime" : {
"ts" : Timestamp(1542185290, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-11-14T08:48:10Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1542185258, 1),
"electionDate" : ISODate("2018-11-14T08:47:38Z"),
"configVersion" : 3,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 3,
"name" : "172.31.17.203:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 1186,
"lastHeartbeat" : ISODate("2018-11-14T08:48:18.807Z"),
"lastHeartbeatRecv" : ISODate("2018-11-14T08:48:18.101Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 3
}
],
"ok" : 1
}

你会发现上面的主节点的状态出问题了,如下图所示(下面的图片就是上面的数据的截图):

然后你再看看从节点的状态:

此时的从节点已经变成了主节点了,

确实变成了主节点。

复制集常用方法总结:

rs.initiate():复制集初始化,例如:rs.initiate({_id:'repl1',members:[{_id:1,host:'192.168.168.129:27017'}]}) 
rs.reconfig():重新加载配置文件,例如:

  1. rs.reconfig({_id:'repl1',members:[{_id:1,host:'192.168.168.129:27017'}]},{force:true})当只剩下一个secondary节点时,复制集变得不可用,则可以指定force属性强制将节点变成primary,然后再添加secondary节点

rs.status():查看复制集状态 
db.printSlaveReplicationInfo():查看复制情况 
rs.conf()/rs.config():查看复制集配置 
rs.slaveOk():在当前连接让secondary可以提供读操作 
rs.add():增加复制集节点,例如:

  1. rs.add('192.168.168.130:27017')
  2. rs.add({"_id":3,"host":"192.168.168.130:27017","priority":0,"hidden":true})指定hidden属性添加备份节点
  3. rs.add({"_id":3,"host":"192.168.168.130:27017","priority":0,"slaveDelay":60})指定slaveDelay属性添加延迟节点
  4. priority:是优先级,默认为1,如果想手动指定某个节点为primary节点,则把对应节点的priority属性设置为所有节点中最大的一个即可

rs.remove():删除复制集节点,例如:rs.remove('192.168.168.130:27017') 
rs.addArb():添加仲裁节点,例如:

    1. rs.addArb('192.168.168.131:27017')或者rs.add({"_id":3,"host":"192.168.168.130:27017","arbiterOnly":true}),仲裁节点,只参与投票,不接收数据

MongoDB之 复制集搭建的更多相关文章

  1. 利用Mongodb的复制集搭建高可用分片,Replica Sets + Sharding的搭建过程

    参考资料 reference:  http://mongodb.blog.51cto.com/1071559/740131  http://docs.mongodb.org/manual/tutori ...

  2. Mongodb 基础 复制集原理和搭建

    数据复制原理 开启复制集后,主节点会在local库下生成一个集合叫 oplog.rs,这是一个有限的集合,即大小固定.这个集合记入了整个mongod实例一段时间内数据库的所有变更操作(如:增/删/改) ...

  3. mongdb复制集搭建

    可参考官网教程 复制集增加了数据的冗余同时也提高了mongodb的可靠性,相比传统的主从架构,mongodb具有自动容灾的特性,即主库挂掉后会自动从剩下的从库中选举出一个节点做为主库(不需要人工干预) ...

  4. 【Mongodb】 可复制集搭建

    可复制集 replica set 概念图 可复制集需要至少3个以上的mongodb节点,其中有一个主节点promary,其余的为副本节点secondary 可复制集有三个角色: 主要成员(Primar ...

  5. MongoDB复制集搭建(3.4.17版)

    ==版本== mongodb-linux-x86_64-rhel70-3.4.17.tgz ==准备== 3个节点,我这里的IP及hostname分别是: 10.11.2.52 dscn49 10.1 ...

  6. mongodb复制集搭建

    注:mongodb当前版本是3.4.3 1.准备三个虚拟机做服务器 192.168.168.129:27017 192.168.168.130:27017 192.168.168.131:27017 ...

  7. mongodb之 复制集维护小结

    原文地址:https://www.cnblogs.com/zhaowenzhong/p/5667312.html 一.新增副本集成员 1.登录primary 2.use admin >rs.ad ...

  8. mongodb配置复制集replset

    Mongodb的replication主要有两种:主从和副本集(replica set).主从的原理和mysql类似,主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己 ...

  9. MongoDB 部署复制集(副本集)

    部署MongoDB复制集(副本集)   环境 操作系统:Ubuntu 18.04 MongoDB: 4.0.3 服务器 首先部署3台服务器,1台主节点 + 2台从节点 3台服务器的内容ip分别是: 1 ...

随机推荐

  1. Oracle Comment 获取并修改表或字段注释

    select * from dba_tables where owner = 'DINGYINGSI'; select * from user_col_comments where table_nam ...

  2. C# 例子1

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. 【IT笔试面试题整理】删除无序链表中重复的节点

    [试题描述]定义一个函数,输入一个链表,删除无序链表中重复的节点 [参考代码] 方法一: Without a buffer, we can iterate with two pointers: &qu ...

  4. 代理(Proxy)模式 ,桥梁(Bridge)模式

    一:代理模式 1 根据名字我们就可以理解为:代替别人管理 2 什么情况下使用代理模式呢? 在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系 ...

  5. python的Web框架,Django模板变量,过滤器和静态文件引入

    HTML模板的路径查找 在setting中设置查找路径: #默认的查找在此处填写,优先级最高,为在manage.py的同级路径中,添加(常规是template)文件夹,在(template)文件夹中配 ...

  6. Java虚拟机--线程安全和锁优化

    Java虚拟机--线程安全和锁优化 线程安全 线程安全:当多线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象 ...

  7. 关于《阿里巴巴Java开发规约》插件的安装与使用

    一.安装 二.idea插件的安装与使用 https://github.com/alibaba/p3c/tree/master/idea-plugin#run-plugin Idea Plugin Pr ...

  8. Moon Game (凸四边形个数,数学题)

    Problem 2148 Moon Game Accept: 24    Submit: 61 Time Limit: 1000 mSec    Memory Limit : 32768 KB Pro ...

  9. Vue: ES6常用语法

    ES6 模板字符串:  ~ ${变量名}~ <div id="app"></div> <script> /* 找到对应id */ let ite ...

  10. Node操作MongoDB并与express结合实现图书管理系统

    Node操作MongoDB数据库 原文链接:http://www.xingxin.me/ Web应用离不开数据库的操作,我们将陆续了解Node操作MongoDB与MySQL这是两个具有代表性的数据库, ...