MongoDB的高可用配置
复制与复制集的相关概念
复制:将一个数据库实例中的所有数据库改变复制到另一个独立的数据库实例中。
副本集(replSet,复制集),原理上也是主从复制。
副本集与主从复制的区别是主库出现故障时,能自动主从切换,从而故障得以恢复,其它从库从新的主库同步数据,整个过程不需要手工干预。
副本集(replSet,复制集)的应用
1.备份
2.故障转移
3.读扩展
4.离线数据分析等
5.实例图
配置并启动3个复制集
[[email protected] opt]# vi mongodbset1.cnf
dbpath=/opt/mongodb/data1
port=27017
logpath=/opt/mongodb/logs
fork=true
logappend=true
replSet=pcitc
[[email protected] opt]# vi mongodbset2.cnf
dbpath=/opt/mongodb/data2
port=27018
logpath=/opt/mongodb/logs
fork=true
logappend=true
replSet=pcitc
[[email protected] opt]# vi mongodbset3.cnf
dbpath=/opt/mongodb/data3
port=27019
logpath=/opt/mongodb/logs
fork=true
logappend=true
replSet=pcitc
./mongod -f /opt/mongodbset1.cnf
./mongod -f /opt/mongodbset2.cnf
./mongod -f /opt/mongodbset3.cnf
./mongo --port 27017
rs.status()
cfg={_id:'pcitc',members:[ {_id:0,host:'127.0.0.1:27017'},
{_id:1,host:'127.0.0.1:27018'},
{_id:2,host:'127.0.0.1:27019'}]
}
rs.initiate(cfg)
动态增加或删除复制集节点
[[email protected] opt]# vi mongodbset4.cnf
dbpath=/opt/mongodb/data4
port=27020
logpath=/opt/mongodb/logs
fork=true
logappend=true
replSet=pcitc
./mongod -f /opt/mongodbset4.cnf
rs.add("127.0.0.1:27020")
rs.status()
rs.remove("127.0.0.1:27020")
模拟高可用
主机服务挂掉
[[email protected] bin]# ./mongod -f /opt/mongodbset1.cnf –shutdown
./mongo 127.0.0.1:27018
rs.status()
主机服务重新启动
./mongod -f /opt/mongodbset1.cnf
rs.status()
复制集的管理-- oplog
./mongo --port 27019
pcitc:PRIMARY> db.users.insert({"uuid":1000})
WriteResult({ "nInserted" : 1 })
pcitc:PRIMARY> db.users.find()
{ "_id" : ObjectId("5c7493bcf1cd2a75f3444fc1"), "uuid" : 1000 }
pcitc:PRIMARY> db.users.update({"uuid":1000},{"uuid":10000})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
pcitc:PRIMARY> db.users.find()
{ "_id" : ObjectId("5c7493bcf1cd2a75f3444fc1"), "uuid" : 10000 }
pcitc:PRIMARY> db.users.remove({})
WriteResult({ "nRemoved" : 1 })
pcitc:PRIMARY> use local
oplog.rs 复制集相关的操作
op操作:i 写入,u 更新,d 插入 ,ns:操作的集合 ,o代表原来的数据
测试主从备份
./mongo --port 27019
pcitc:PRIMARY> db.users.insert({"uuid":1000})
WriteResult({ "nInserted" : 1 })
./mongo --port 27017
}
pcitc:SECONDARY> rs.slaveOk()
pcitc:SECONDARY> db.users.find()
{ "_id" : ObjectId("5c74afcf7d3220a1fd76b814"), "uuid" : 1000 }
复制集相关信息指令
rs.status() 复制集的状态
rs.initiate() 复制集通过默认配置初始化
rs.initiate(cfg) 复制集通过配置文档初始化
rs.conf() 获得当前的配置信息
rs.reconfig(cfg) 重新配置
rs.add(hostportstr) 动态增加一个节点
rs.add(membercfgobj) 动态增加一个节点含有优先级等信息
rs.addArb(hostportstr) 添加一个仲裁节点
rs.stepDown([stepdownSecs, catchUpSecs])
stepdownSecs:通知复制集其他成员,35秒内,本服务器不会选举为主服务器
catchUpSecs:主服务器需要降级的时候,多个从服务器因业务繁忙,有延迟,允许30秒的超赶时间,然后主从切换
rs.syncFrom(hostportstr) 如果初始化一个新的节点,可以指定某个想要节点进行同步
rs.freeze(secs) 指定的秒数之内不能被选举成主服务器
rs.remove(hostportstr)
rs.slaveOk() 从服务器默认不能读,执行此命令,可以读
rs.printReplicationInfo() 查看日志的大小和时间的范围
configured oplog size: 4403.060936927795MB
log length start to end: 66764secs (18.55hrs)
oplog first event time: Mon Feb 25 2019 15:42:40 GMT+0800 (CST)
oplog last event time: Tue Feb 26 2019 10:15:24 GMT+0800 (CST)
now: Tue Feb 26 2019 10:15:26 GMT+0800 (CST)
rs.printSlaveReplicationInfo() 确认从服务器是否有延迟
pcitc:PRIMARY> rs.printSlaveReplicationInfo()
source: 127.0.0.1:27017
syncedTo: Tue Feb 26 2019 11:24:34 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 127.0.0.1:27018
syncedTo: Tue Feb 26 2019 11:24:34 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
db.isMaster() 查看整个架构,包括标准节点 仲裁节点 被动节点
查看复制集的相关信息
pcitc:PRIMARY> use local
pcitc:PRIMARY> db.system.replset.find()
{ "_id" : "pcitc", "version" : 3, "protocolVersion" : NumberLong(1), "members" : [ { "_id" : 0, "host" : "127.0.0.1:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "127.0.0.1:27018", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "127.0.0.1:27019", "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("5c739c70de5867b3253bcad8") } }