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)
可以看到rs_omt_2 比rs_omt_1 多一个库。
开始迁移数据库:
user admin
db.runCommand({"movePrimary":"lcxtest02","to":"rs_omt_1"})
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)
}
}
}
查看一下状态:
4. remove shard
db.runCommand({removeShard: "rs_omt_2"})
remove之前:
remove之后:
所有的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:备份节点