三、副本集维护指南
1、修改oplog的大小
oplog的内部存在一个封装的集合,所以,正常运势期间,你不能修改它的大小。大多数情形下,默认的oplog大小可以被接受;然而,在一些情景中,你可能需要一个更大或更小的oplog。例如,如果你的应用在短时间内有大量的更新和删除,你可能需要修改oplog的大小。
修改oplog的大小,你需要在副本集的每一个成员上轮流执行维护。该过程需要:关闭mongod实例,将mongod实例作为单机启动,修改oplog的大小,将该mongod实例作为成员重启。
a.将一个secondary成员以单机模式启动
将非primary成员的mongod实例关闭,使用db.shutdownServer()。
db.shutdownServer()
b.将此mongod作为单机实例启动,启动时使用不同的端口,不要指定replset参数。
mongod --port 37017 --dbpath /srv/mongodb
c.创建oplog的备份
mongo --port 37017
--在单机模式下,备份原有的oplog文件
mongodump --db local --collection 'oplog.rs' --port 37017
d.创建一个新的oplog和seed接口
--删除temp临时集合
use local
db=db.getSiblingDB('local')
db.temp.drop()
--找到最近的oplog入口,将其保存到temp集合中
db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )
--查看oplog入口
db.temp.find()
e.移除掉现有的oplog集合
db = db.getSiblingDB('local')
db.oplog.rs.drop()
f.创建一个新的oplog
db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )
g.重启成员
db.shutdownServer()
mongod --replSet rs0 --dbpath /srv/mongodb
h.对其他非primary成员重复使用以上步骤,对于primary成员,需要先使用rs.stepDown()方法让其退位,然后再使用以上的步骤来修改oplog大小。
2、将一个成员变为primary
你可以迫使一个成员变为primary,通过给予它更高的优先级的方法。
选择性地,你可以让一个primary永远不会变为primary通过设置它的优先级为0,这意味着它永远不能被选举。
假设:
{
“_id” : “rs”,
“version” : 7,
“members” : [
{
“_id” : 0,
“host” : “m1.example.net:27017”
},
{
“_id” : 1,
“host” : “m2.example.net:27017”
},
{
“_id” : 2,
“host” : “m3.example.net:27017”
}
]
}
连接到primary的mongo shell上执行:
cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 0.5
cfg.members[2].priority = 1
--此时意味着第三个成员将成为primary
rs.reconfig(cfg)
3、为副本集成员添加Tag属性
假设:
{
"_id" : "rs",
"version" : 7,
"members" : [
{
"_id" : 0,
"host" : "m1.example.net:27017"
},
{
"_id" : 1,
"host" : "m2.example.net:27017"
},
{
"_id" : 2,
"host" : "m3.example.net:27017"
}
]
}
执行:
conf = rs.conf()
conf.members[0].tags = { "dc": "east", "use": "production" }
conf.members[1].tags = { "dc": "east", "use": "reporting" }
conf.members[2].tags = { "use": "production" }
rs.reconfig(conf)
结果为:
{
"_id" : "rs0",
"version" : 8,
"members" : [
{
"_id" : 0,
"host" : "m1.example.net:27017",
"tags" : {
"dc": "east",
"use": "production"
}
},
{
"_id" : 1,
"host" : "m2.example.net:27017",
"tags" : {
"dc": "east",
"use": "reporting"
}
},
{
"_id" : 2,
"host" : "m3.example.net:27017",
"tags" : {
"use": "production"
}
}
]
}
4、通过Tag设置,来分离读写操作
a.先进行Tag配置
conf = rs.conf()
conf.members[0].tags = {"dc.va": "rack1", disk:"ssd", ssd: "installed" }
conf.members[1].tags = {"dc.va": "rack2", disk:"raid"}
conf.members[2].tags = {"dc.gto": "rack1", disk:"ssd", ssd: "installed" }
conf.members[2].tags = {"dc.gto": "rack2", disk:"raid"}
conf.members[2].tags = {"dc.va": "rack1", disk:"ssd", ssd: "installed" }
rs.reconfig(conf)
b.进行write关注配置
conf = rs.conf()
conf.settings = {
"getLastErrorModes" : {
--ssd write concern
"ssd" : {
"ssd" : 1
},
--MultipleDC write concern
"MultipleDC" : {
"dc.va" : 1,
"dc.gto" : 1
}
}
}
rs.reconfig(conf)
c.此时你可以使用着2种write关注模式:
db.users.insert( { id: "xyz", status: "A" }, { writeConcern: { w: "MultipleDC" } } )
5、管理复制链
一个secondary可以从另一个secondary,而不是primary复制数据。这样可以让secondary选择复制目标时,能基于最近的服务器而不是基于ping延迟的策略。
复制链可以减轻primary的负载,但是复制链也会由于网络拓扑图导致复制延迟。
MongoDb默认开启复制链,你可以使用副本集环境设置的chainningAllowed设置来关闭复制链。
a.将副本集环境设置赋予给cfg对象
cfg=rs.config()
b.注意哪些当前的环境设置是否包含了settings内嵌属性,如果包括,则略过此步骤,否则,新增setteings属性。
cfg.settings={}
c.修改chainingAllowed为false
cfg.settings.chainingAllowed = false
rs.reconfig(cfg)
d.修改chainingAllowed为true
cfg.settings.chainingAllowed = true
rs.reconfig(cfg)
7、修改secondary成员的复制目标
默认情况下,secondary会从primary复制数据,但是,在chainingAllowed为ture,即启动复制链的情况下,secondary会自动修改他们的复制目标到最低延迟的成员。
在一些部署中,个性化指定同步拓扑图,比默认自动化选择同步目标更有效。MongoDB提供了指定一个host使用特定的host作为同步目标的功能。
复制目标要求:有数据,可连接,同副本集,非成员本身,可以创建索引。
db.adminCommand( { replSetSyncFrom: "hostname<:port>" } );
--或者使用
rs.syncFrom("hostname<:port>");
8、修改副本集成员的hostname
a.关闭secondary的mongod实例
b.在secondary上修改了hostname后,作为副本集成员,重启该mongod实例,如旧的为databases1.example.net,新的为mongodb1.example.net。
c.连接到primary的mongod实例
e.使用re.reconfig()指令进行修改
cfg = rs.conf()
cfg.members[1].host = "mongodb1.example.net:27017"
rs.reconfig(cfg)