副本集指南(三)

三、副本集维护指南


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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值