这是我的mongo集群(分片与复制集)配置。
replica sets:
rs0 - IP1, IP2, IP3 || port - 27017
rs1 - IP4, IP5, IP6 || port - 27017
config server replica set - IP7, IP8, IP9 || port - 26017
mongos - IP7, IP8, IP9 || port - 26000
这是一个测试设置,配置是使用ip(而不是主机名)设置的。不幸的是,在一次维护之后,所有的主机都瘫痪了。当我们启动节点时,所有主机ip都改变了。显然,由于IP地址不可达,副本集(mongod),配置服务器(mongod)和mongos没有启动。
为了启动设置,我执行了以下命令
- 更新的副本集主机IP地址如下https://www.mongodb.com/docs/v4.2/tutorial/change-hostnames-in-a-replica-set/
- 更新配置服务器副本设置主机ip遵循相同的mongo文档。启动无分片mongod服务
- 没有找到任何关于更改配置服务器的适当文档&mongos IP地址/主机名更改。在配置服务器副本集时,更新"分片";
cfg1 = db.shards.findOne( { "_id": "rs0" } )
cfg1.host = "rs0/new_IP1:27017,new_IP2:27017,new_IP3:27017"
db.shards.update({ "_id" : "rs0" } , cfg1 )
cfg2 = db.shards.findOne( { "_id": "rs1" } )
cfg2.host = "rs1/new_IP3:27017,new_IP4:27017,new_IP5:27017"
db.shards.update({ "_id" : "rs1" } , cfg2 )
- 正确启动配置服务器和mongos。
- 现在重新启动副本集成员以使用阴影。但是,副本集mongod进程没有开始引用旧的配置服务器副本集ip。下面的错误,我正在进入mongodb .log.
2022-05-17T21:20:39.654+0530 W SHARDING [initandlisten] Error initializing sharding state, sleeping for 2 seconds and trying again :: caused by :: FailedToSatisfyReadPreference: Error loading clusterID :: caused by :: Could not find host matching read preference { mode: "nearest" } for set csrs
2022-05-17T21:20:40.154+0530 I ASIO [ReplicaSetMonitor-TaskExecutor] Connecting to x.x.x.x:26017
2022-05-17T21:20:41.655+0530 I ASIO [ReplicaSetMonitor-TaskExecutor] Connecting to y.y.y.y:26017
2022-05-17T21:20:42.660+0530 I ASIO [ReplicaSetMonitor-TaskExecutor] Failed to connect to z.z.z.z:26017 - HostUnreachable: Error connecting to 10.0.13.206:26017 :: caused by :: No route to host
我在网上找不到任何帮助来从这种情况中恢复。请求帮助在不丢失任何数据的情况下恢复设置,因为我们已经在这个集群上加载了tb的数据。
问题已解决。
最后一个难题是找到保存在副本集mongod中的配置服务器连接信息在哪里。它在admin db下的system.version
集合中。我必须遵循以下步骤
- 在所有副本集成员上启动mongod,禁用复制和分片。对配置文件做了必要的修改。
- 在admin db下,
system.version
中的以下两个文档具有config server连接字符串。
db.system.version.find( {"_id" : { $in : [ "shardIdentity" , "minOpTimeRecovery" ]} })
- 通过
db.system.version.update
命令更新配置服务器连接字符串。 - 关闭mongod进程,在mongod配置文件中启用安全授权、复制和分片。
- 已成功启动副本集单个实例。
注意:我是mongo的新手,不确定我们是否应该对内部系统集合进行更改。因为这是一个测试设置,我承担了风险,做了这些实验,并得到了回报。不推荐在生产环境中,不能保证分辨率。
我运行这个程序作为测试在我的本地机器上。它似乎有用,但我不能保证什么。
- 停止所有节点的
mongod/mongos
服务
mongod配置ReplicaSet
- 在维护模式下启动一个mongod config server 删除
- 更新
config.shards
- 关闭mongod
- 删除所有其他的
dbPath
配置服务器 - 启动所有mongod配置服务器
- 连接第一个mongod配置服务器
- 启动ReplicaSet
local
数据库示例(Windows样式):
SET MAINTENANCE_LOG=--logpath C:MongoDBlogmongo_maintenance.log --logappend
SET MAINTENANCE_NET=--bind_ip localhost --port 55555
SET MAINTENANCE_MISC=--setParameter skipShardingConfigurationChecks=true --setParameter disableLogicalSessionCacheRefresh=true
start mongod --dbpath C:MongoDBdatamongocfg_1 %MAINTENANCE_LOG% %MAINTENANCE_MISC% %MAINTENANCE_NET%
mongo --norc localhost:55555/admin
db.getSiblingDB('local').dropDatabase()
db.getSiblingDB('config').getCollection("shards").updateOne(
{_id : "shard_01"},
{$set: {host: "shard_01/<new_IP:port>,<new_IP:port>" }}
)
db.getSiblingDB('config').getCollection("shards").updateOne(
{_id : "shard_02"},
{$set: {host: "shard_02/<new_IP:port>,<new_IP:port>" }}
)
db.getSiblingDB('config').getCollection("shards").updateOne(
{_id : "shard_03"},
{$set: {host: "shard_03/<new_IP:port>,<new_IP:port>" }}
)
db.getSiblingDB('admin').shutdownServer()
exit
rmdir C:MongoDBdatamongocfg_2
rmdir C:MongoDBdatamongocfg_3
net start MongoDB_Config_1
net start MongoDB_Config_2
net start MongoDB_Config_3
mongo "mongodb://user:password@localhost:27029/admin?authSource=admin"
rs.initiate(
{
_id: "configRepSet",
configsvr: true,
members: [
{ _id: 0, host: "<new_IP:port>", priority: 10 },
{ _id: 1, host: "<new_IP:port>", priority: 5 },
{ _id: 2, host: "<new_IP:port>", priority: 5 }
]
}
)
rs.status()
while (! db.hello().isWritablePrimary ) { sleep(1000) }
exit
mongod碎片ReplicaSet
对每个shard
重复下面的操作- 启动一个mongod分片服务器(最好是以前的PRIMARY)在维护模式 删除
- 更新
admin.system.version
- 关闭mongod 删除所有其他的
- 启动所有mongod分片服务器
- 连接第一个mongod分片服务器
- 启动ReplicaSet
local
数据库dbPath
碎片服务器示例(Windows样式):
SET MAINTENANCE_LOG=--logpath C:MongoDBlogmongo_maintenance.log --logappend
SET MAINTENANCE_NET=--bind_ip localhost --port 55555
SET MAINTENANCE_MISC=--setParameter skipShardingConfigurationChecks=true --setParameter disableLogicalSessionCacheRefresh=true
start mongod --dbpath C:MongoDBdatamongoshard_1prim %MAINTENANCE_LOG% %MAINTENANCE_MISC% %MAINTENANCE_NET%
mongo --norc localhost:55555/admin
db.getSiblingDB('local').dropDatabase()
db.getSiblingDB('admin').getCollection("system.version").updateOne(
{_id : "shardIdentity"},
{$set: { configsvrConnectionString: "configRepSet/<new_IP:port>,<new_IP:port>,<new_IP:port>" }}
)
db.getSiblingDB('admin').shutdownServer()
exit
rmdir C:MongoDBdatamongoshard_1sec*
rmdir C:MongoDBdatamongoshard_1arb*
net start MongoDB_Shard_1prim
net start MongoDB_Shard_1sec
net start MongoDB_Shard_1arb
mongo "mongodb://user:password@localhost:37028/admin?authSource=admin"
rs.initiate(
{
_id: "shard_01",
members: [
{ _id: 0, host: "<new_IP:port>", priority: 10 },
{ _id: 1, host: "<new_IP:port>", priority: 5 },
{ _id: 2, host: "<new_IP:port>", arbiterOnly: true }
]
}
)
rs.status()
while (! db.hello().isWritablePrimary ) { sleep(1000) }
exit
蒙戈路由器
这是最简单的部分。
- 编辑mongos配置文件并添加新的
sharging.configDB
字符串 - Start
mongos