MongoDB 自带功能强大的主从,配置也很简单,从零开始花了30分钟搞定
MongoDB主从集合
MongoDB的出从是一个集合概念,包含2个以上的实例。mongo按集合名(replSetName)来区分不同的集合。集合里的每一个成员根据配置的权重(priority)及其他配置项来选举主机(PRIMARY),其他成员自动成为从机(SECONDARY)。mongo默认只能对主机可写,从机只读。
设置主从集的方法
如果直接通过命令启动实例,加上 --replSet "xxx"
mongod [options] --replSet "rs0"
如果是yum安装,mongod 通过读取/etc/mongod.conf
自启动,写入配置文件:
replication:
replSetName: xxx
更多配置项参考: https://docs.mongodb.com/manual/reference/configuration-options/index.html#replication-options
MongoDB 初始化主从实例
mongodb 通过 rs.initiate()
方法初始化实例,可传入一个json的配置参数对象进行初始化,参考:https://docs.mongodb.com/manual/reference/replica-configuration/#replsetgetconfig-output
通常只需要配置 _id 和 members :
conf = {
_id: "xxx", // 集合名称
members: [
{_id: 1, host: "127.0.0.1:27017"}
]
}
rs.initiate(conf)
以上也可以通过 rs.add("127.0.0.1:27017")来扩展成员。注意当设置多个member成员时,mongodb 应允许其他IP访问,并检查防火墙设置。
mongodb会自动选举主机(通常是第一个成员)
通过rs.conf()
查看主从状态
rs.conf()
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.1.24:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.1.25:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.1.27:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5b2f079a3c46b120a9c1adad")
}
}
此时停止 192.168.1.24的mongodb 服务,则 192.168.1.25 的mongodb自动从 SECONDARY 变成了 PRIMARY
主从读写
主从的延迟默认是0,通过配置项自行设置。
从机需要开启 SlaveOk 才可以读取,一般的读取流程为:
use mydb
mydb.setSlaveOk()
mydb.col.find() // ...
水平扩展
添加从机的操作很简单,只需配置从机的 ReplSetName 为相同的集合名称,然后在PRIMARY主机中执行 rs.add("newHost:PORT") ,然后数据就自动同步过去了。