1 设置主从库
[root@dghost mongodb]# mongod --dbpath /data/mongodb --replSet set1 --fork --syslog --keyFile /etc/monkey
about to fork child process, waiting until server is ready for connections.
forked process: 2099
child process started successfully, parent exiting
主库启动完成
> rs.isMaster()
{
"ismaster" : false,
"secondary" : false,
"info" : "can't get local.system.replset config from self or any seed (EMPTYCONFIG)",
"isreplicaset" : true,
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2017-04-18T14:23:59.298Z"),
"maxWireVersion" : 2,
"minWireVersion" : 0,
当前它既不是主又不是从,下面需要告诉它的身份
> config_set={_id:"set1",members:[{_id:0,host:"192.168.0.116:27017"}]}
{
"_id" : "set1",
"members" : [
{
"_id" : 0,
"host" : "192.168.0.116:27017"
}
]
}
# 设置一个参数这个参数名称可以自定义,但那时里面的set1 就是启动命令中的set1
> rs.initiate(config_set)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
# 把这个参数设置到主库中
[root@dghost mongodb]# mongo
MongoDB shell version: 2.6.4
connecting to: test
set1:PRIMARY>
# 重新登陆就看到身份已经是primary 主库了
set1:PRIMARY> rs.isMaster()
{
"setName" : "set1",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"hosts" : [
"192.168.0.116:27017"
],
"primary" : "192.168.0.116:27017",
"me" : "192.168.0.116:27017",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2017-04-18T14:31:46.425Z"),
"maxWireVersion" : 2,
"minWireVersion" : 0,
"ok" : 1
}
[root@dgstandby ~]# mongod --dbpath /data/mongodb --replSet set1 --fork --syslog --keyFile /etc/monkey
about to fork child process, waiting until server is ready for connections.
forked process: 2104
child process started successfully, parent exiting
# 和主库启动方式一样启动从库1
[root@other ~]# mongod --dbpath /data/mongodb --replSet set1 --fork --syslog --keyFile /etc/monkey
about to fork child process, waiting until server is ready for connections.
forked process: 2058
child process started successfully, parent exiting
# 和主库启动方式一样启动从库2
在主库中添加从库1和2
set1:PRIMARY> rs.add("192.168.0.117:27017")
{ "ok" : 1 }
set1:PRIMARY> rs.add("192.168.0.118:27017")
{ "ok" : 1 }
# 添加两个从库成功
set1:PRIMARY> rs.isMaster()
{
"setName" : "set1",
"setVersion" : 3,
"ismaster" : true,
"secondary" : false,
"hosts" : [
"192.168.0.116:27017",
"192.168.0.118:27017",
"192.168.0.117:27017"
],
"primary" : "192.168.0.116:27017",
"me" : "192.168.0.116:27017",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2017-04-18T14:36:03.525Z"),
"maxWireVersion" : 2,
"minWireVersion" : 0,
"ok" : 1
}
# 现在主库上已经知道谁是主库,谁是从库
[root@dgstandby ~]# mongo
MongoDB shell version: 2.6.4
connecting to: test
set1:SECONDARY>
# 从库1 也知道自己从库
[root@other ~]# mongo
MongoDB shell version: 2.6.4
connecting to: test
set1:SECONDARY>
# 从库2 也知道自己从库
2 验证主从是否同步
set1:PRIMARY> show dbs
admin (empty)
local 1.078GB
set1:PRIMARY> use www
switched to db www
set1:PRIMARY> db.scott.insert({name:"scott"})
WriteResult({ "nInserted" : 1 })
set1:PRIMARY> show dbs
admin (empty)
local 1.078GB
www 0.078GB
set1:PRIMARY> use www
switched to db www
set1:PRIMARY> db.scott.find()
{ "_id" : ObjectId("58f6251804dade85b64c28d9"), "name" : "scott" }
# 主库中建库,建表,插入数据
set1:SECONDARY> show collections;
2017-04-18T23:02:17.806+0800 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131
# 从库1 把www已经同步成功了,但是不能访问,这个是正常的。
set1:SECONDARY> show collections;
2017-04-18T23:04:27.430+0800 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131
# 从库2 把www已经同步成功了,但是不能访问,这个是正常的。
3 验证主从自动切换
把主库shutdown 看看两个从库会怎么样
set1:PRIMARY> db.shutdownServer()
2017-04-18T22:46:23.544+0800 DBClientCursor::init call() failed
server should be down...
2017-04-18T22:46:23.566+0800 trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2017-04-18T22:46:23.571+0800 warning: Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2017-04-18T22:46:23.574+0800 reconnect 127.0.0.1:27017 (127.0.0.1) failed failed couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed
2017-04-18T22:46:23.580+0800 trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2017-04-18T22:46:23.582+0800 warning: Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2017-04-18T22:46:23.582+0800 reconnect 127.0.0.1:27017 (127.0.0.1) failed failed couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed
> exit
bye
[root@dghost mongodb]# /etc/init.d/mongod status
mongod dead but subsys locked
# 主库已经关闭
[root@other ~]# mongo
MongoDB shell version: 2.6.4
connecting to: test
set1:PRIMARY>
# 看从库2 已经自动变成了primary主库
set1:PRIMARY> rs.isMaster()
{
"setName" : "set1",
"setVersion" : 3,
"ismaster" : true,
"secondary" : false,
"hosts" : [
"192.168.0.118:27017",
"192.168.0.117:27017",
"192.168.0.116:27017"
],
"primary" : "192.168.0.118:27017",
"me" : "192.168.0.118:27017",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2017-04-18T15:07:36.060Z"),
"maxWireVersion" : 2,
"minWireVersion" : 0,
"ok" : 1
}
# 瞧,主从的顺序都变了 主库已经从原来的192.168.0.116 变成现在的192.168.0.118
验证成功
4 设置读写分离
在从库上敲命令rs.slaveOk() 就可以了,非常简单
set1:SECONDARY> rs.slaveOk()
set1:SECONDARY> use www
switched to db www
set1:SECONDARY> show collections;
scott
system.indexes
5 删除节点rs.remove("IP:PORT")