MongoDB系列之(二)replication set
1. 环境说明
主机名称 IP地址 OS版本
node1 172.16.100.52 CentOS7(kernel: 3.10.0-514.el7.x86_64)
node2 172.16.100.53 CentOS7(kernel: 3.10.0-514.el7.x86_64)
node3 172.16.100.54 CentOS7(kernel: 3.10.0-514.el7.x86_64)
2. 在node1,node2,node3主机节点上安装且配置mongodb,并且启动mongodb服务
# vi /etc/mongod.conf
/etc/mongod.conf 配置文件使用yaml格式
systemLog: --> 日志相关的配置
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
storage: --> 数据存储相关的配置
dbPath: /var/lib/mongo
journal:
enabled: true
processManagement: --> 服务进程相关配置
fork: true
pidFilePath: /var/run/mongodb/mongod.pid
net: --> 网络相关的配置
port: 27017
bindIp: 0.0.0.0
replication: --> 复制集相关配置
oplogSizeMB: 1024
replSetName: rs-park
# systemctl start mongod.service
3. 在node1节点上初始化且启动replication set
# mongo --> 登录mongodb 的shell
> use admin
> rs.status() //checks repl set status
{
"info" : "run rs.initiate(...) if not yet done for the set",
"ok" : 0,
"errmsg" : "no replset config has been received",
"code" : 94,
"codeName" : "NotYetInitialized"
}
> rs.initiate({_id: "rs-park", members: [{_id: 1, host: "172.16.100.52:27017"}]}) //initiates set with configuration cfg
//_id: "rs-park" 复制集名称,与配置文件/etc/mongod.conf中的replication.replSetName的属性值保持一致
//host: "172.16.100.52:27017" node1主机的ip地址与端口
>rs.status()
{
"set" : "rs-park",
......
"heartbeatIntervalMillis" : NumberLong(2000), //心跳间隔时间
"optimes" : {
......
},
"members" : [
{
"_id" : 1,
"name" : "172.16.100.52:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2126,
"optime" : {
"ts" : Timestamp(1582006267, 1),
"t" : NumberLong(1)
},
......
}
],
"ok" : 1
}
>rs.add("172.16.100.53:27017") //将node2节点添加到复制集 add a new member to the set with default attributes (disconnects)
>rs.add("172.16.100.54:27017") //将node3节点添加到复制集
>rs.status()
{
"set" : "rs-park",
......
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
......
},
"members" : [
{
"_id" : 1,
"name" : "172.16.100.52:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2857,
"optime" : {
"ts" : Timestamp(1582006999, 1),
"t" : NumberLong(1)
},
......
},
{
"_id" : 2,
"name" : "172.16.100.53:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 12,
"optime" : {
"ts" : Timestamp(1582006999, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1582006999, 1),
"t" : NumberLong(1)
},
......
"syncingTo" : "172.16.100.52:27017",
"syncSourceHost" : "172.16.100.52:27017",
"syncSourceId" : 1,
"infoMessage" : "",
"configVersion" : 3
},
{
"_id" : 3,
"name" : "172.16.100.54:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
......
}
],
"ok" : 1
}
4. replication set 功能验证
在node1节点上,添加数据
> use ishop
> db.good.insert({name: "apple", price: 8.5, nr: 2000})
> db.good.find()
{ "_id" : ObjectId("5e4b8401ab48c49c47f208b6"), "name" : "apple", "price" : 8.5, "nr" : 2000 }
在node2 | node3节点上查询数据
> rs.slaveOk() //allow queries on secondary nodes 在备用节点启用查询功能
> use ishop
> db.good.find() //数据已从primary同步到secondary
{ "_id" : ObjectId("5e4b8401ab48c49c47f208b6"), "name" : "apple", "price" : 8.5, "nr" : 2000 }
> db.good.insert({name: "orange", price: 6.0, nr: 1000}) //secondary只支持查询,不支持修改
WriteResult({"writeError": {"code": 10107, "errmsg": "no master"}})
5. Fail Over验证功能
在node1节点上,关闭mongodb服务
> use admin
> db.shutdownServer()
在node2 | node3节点上,查看集群状态信息,node3节点自动选举为主节点
> rs.status()
{
"set" : "rs-park",
......
"members" : [
{
"_id" : 1,
"name" : "172.16.100.52:27017",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
......
},
{
"_id" : 2,
"name" : "172.16.100.53:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
......
},
{
"_id" : 3,
"name" : "172.16.100.54:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
......
}
],
"ok" : 1
}