MongoDB分片修改为副本集

本文介绍了MongoDB副本集和分片的管理操作,包括检查分片状态、查看shard状态、迁移primary chunk、移除shard及修改副本集步骤。在实际操作中,涉及数据库迁移、副本集权重配置、节点添加与删除,以及主节点选举等关键环节。
摘要由CSDN通过智能技术生成

1. 检查分片Balancer的状态

sh.getBalancerState()

2. 查看shard状态

sh.status()

主要观察chunk的分布

3. 移动primary chunk所在的shard副本集到另一个副本集

primary chunk所在的机器主要是为了保存无分区规则的数据

mongos> sh.shardCollection("lcxtest03.test03",{"userid":"hashed"})
{
        "collectionsharded" : "lcxtest03.test03",
        "collectionUUID" : UUID("157929c0-96bc-4eeb-9c32-ea9ac308330f"),
        "ok" : 1,
        "operationTime" : Timestamp(1653551423, 29),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1653551423, 29),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}
mongos> db.test03.in
db.test03.initializeOrderedBulkOp(    db.test03.insert(                     db.test03.insertOne(
db.test03.initializeUnorderedBulkOp(  db.test03.insertMany(
mongos> db.test03.insert({"userid" : 1 ,"username" : "lcx01"})
WriteResult({ "nInserted" : 1 })
mongos> db.test03.insert({"userid" : 2 ,"username" : "lcx02"})
WriteResult({ "nInserted" : 1 })
mongos> db.test03.insert({"userid" : 3 ,"username" : "lcx03"})
WriteResult({ "nInserted" : 1 })
mongos> sh.status()
.........
        {  "_id" : "lcxtest02",  "primary" : "rs_omt_2",  "partitioned" : false,  "version" : {  "uuid" : UUID("56b4d33c-638c-4b69-a2ea-c57fd2100ea2"),  "lastMod" : 1 } }
        {  "_id" : "lcxtest03",  "primary" : "rs_omt_1",  "partitioned" : true,  "version" : {  "uuid" : UUID("3cf0e6da-2a3f-4b38-969f-72ab497e62ee"),  "lastMod" : 1 } }
                lcxtest03.test03
                        shard key: { "userid" : "hashed" }
                        unique: false
                        balancing: true
                        chunks:
                                rs_omt_1        2
                                rs_omt_2        2
                        { "userid" : { "$minKey" : 1 } } -->> { "userid" : NumberLong("-4611686018427387902") } on : rs_omt_1 Timestamp(1, 0)
                        { "userid" : NumberLong("-4611686018427387902") } -->> { "userid" : NumberLong(0) } on : rs_omt_1 Timestamp(1, 1)
                        { "userid" : NumberLong(0) } -->> { "userid" : NumberLong("4611686018427387902") } on : rs_omt_2 Timestamp(1, 2)
                        { "userid" : NumberLong("4611686018427387902") } -->> { "userid" : { "$maxKey" : 1 } } on : rs_omt_2 Timestamp(1, 3)

image-20220526155800259

image-20220526155738672

可以看到rs_omt_2 比rs_omt_1 多一个库。

开始迁移数据库:

user admin
db.runCommand({"movePrimary":"lcxtest02","to":"rs_omt_1"})

image-20220526160235248

rs_omt_1:PRIMARY> show dbs
admin      0.000GB
config     0.001GB
lcxtest    0.003GB
lcxtest02  0.002GB
lcxtest03  0.000GB
local      0.005GB

rs_omt_2:PRIMARY> show dbs
admin      0.000GB
config     0.001GB
lcxtest    0.003GB
lcxtest03  0.000GB
local      0.005GB

迁移完之后,发现1上边多了一个库,2上边少了一个库。

如果在remove之前没有movePrimary,会提示:

mongos> db.runCommand({removeshard:"rs_omt_2"})
{
        "msg" : "draining started successfully",
        "state" : "started",
        "shard" : "rs_omt_2",
        "note" : "you need to drop or movePrimary these databases",
        "dbsToMove" : [
                "lcxtest"
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1653552461, 2),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1653552461, 2),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

查看一下状态:

image-20220526160951583

4. remove shard

db.runCommand({removeShard: "rs_omt_2"})

remove之前:

image-20220526160722073

remove之后:

image-20220526161905319

所有的shard和chunk全部到一个节点上。再次执行

db.runCommand({removeShard: "rs_omt_2"})

# 如果状态为completed说明迁移完成,remove成功

remove之后,所移除的shard上的数据已经全部迁移到另一个副本集上了。移除的副本可以停掉,清空数据了。

5. 修改为副本集的步骤

5.1 如果可以的话,做一下数据的备份,在副本集相应的库中,建立用户账号

mkdir sh_to_rs_backup
for db in livechat hamster eppt eeocn; do mongodump --host=10.0.14.134 --db="$db" -o ./sh_to_rs_backup/ ; done
db.createUser(
	     {
	       user:"dba",
	       pwd:"dba",
	       roles:[{role:"root",db:"admin"}]  
	     })
	     
	     
如何登录认证:
	use admin
	db.auth("dba","dba")

5.2 停止mongos

注意:停掉mongos configserver,shard集群会有如下警告:

 W  NETWORK  [ReplicaSetMonitor-TaskExecutor] Unable to reach primary for set configrepl

注释掉sharding:

sharding:
  clusterRole: shardsvr

5.3 两种方法

  • 第一种:通过修改端口重启服务来改
cf = rs.config()
cf.members[0].host="10.0.14.155:27017"
rs.reconfig(cf)


10.0.14.155:
	1.修改mongod.conf端口27017
	2.systemctl restart mongod

注意点:

rs.reconfig()可能会造成集群重新选主,用户连接中断。

  • 第二种:通过增删节点的方式(可以晚点停mongos,减少影响时间)

停止shard2的服务,可以清空数据,修改副本集名字,启动之后作为新节点加入到shard1的副本集中。

加入到集群之后,数据会做复制和同步:

此时,新加入的节点会自动加入到sharding集群中。

添加节点时,以优先级为0,不参与投票的方式添加,因为在添加期间会进行数据同步,新添加的节点与其他成员的数据是不一致的,如果参与投票可能会造成无法选主。待新成员状态变为secondry之后,再使用rs.reconfig()重新配置优先级和投票。

rs.add({_id: 3, host: "10.0.9.13:27018", priority: 0, "votes" : 0})

primary的选举依赖于各个实例的优先权重,默认权重都是1

复本集的主挑选权重最高的,权重一样的无法控制谁为主

设置各个实例的优先权重,挑选自己想要的实例为主,只有primary可以更改权重配置

conf = rs.config() #获取副本集的配置,默认权重都是1

conf.members[0].priority = 10

conf.members[1].priority = 5

conf.members[2].priority = 2

rs.reconfig(conf) #更新mongodb副本集的配置,优先权重最高的提升为primary,关闭启动后也为主

6. 切主,移除节点

rs.stepDown()
rs.remove("ip:port")
rs.status()

显示副本状态正常后可以停掉mongos,配置文件增加keyfile,开启认证,停止所有节点服务,依次启动主从节点。

mongo复制集的几种状态

STARTUP:刚加入到复制集中,配置还未加载
STARTUP2:配置已加载完,初始化状态
RECOVERING:正在恢复,不适用读
ARBITER: 仲裁者
DOWN:节点不可到达
UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构
REMOVED:移除复制集
ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态
FATAL:出错。查看日志grep “replSet FATAL”找出错原因,重新做同步
PRIMARY:主节点
SECONDARY:备份节点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值