Mongodb -修改了所有分片主机的主机名/IP



这是我的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没有启动。

为了启动设置,我执行了以下命令

  1. 更新的副本集主机IP地址如下https://www.mongodb.com/docs/v4.2/tutorial/change-hostnames-in-a-replica-set/
  2. 更新配置服务器副本设置主机ip遵循相同的mongo文档。启动无分片mongod服务
  3. 没有找到任何关于更改配置服务器的适当文档&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 )
  1. 正确启动配置服务器和mongos。
  2. 现在重新启动副本集成员以使用阴影。但是,副本集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集合中。我必须遵循以下步骤

  1. 在所有副本集成员上启动mongod,禁用复制和分片。对配置文件做了必要的修改。
  2. 在admin db下,system.version中的以下两个文档具有config server连接字符串。

db.system.version.find( {"_id" : { $in : [ "shardIdentity" , "minOpTimeRecovery" ]} })

  1. 通过db.system.version.update命令更新配置服务器连接字符串。
  2. 关闭mongod进程,在mongod配置文件中启用安全授权、复制和分片。
  3. 已成功启动副本集单个实例。

注意:我是mongo的新手,不确定我们是否应该对内部系统集合进行更改。因为这是一个测试设置,我承担了风险,做了这些实验,并得到了回报。不推荐在生产环境中,不能保证分辨率。

我运行这个程序作为测试在我的本地机器上。它似乎有用,但我不能保证什么。

  • 停止所有节点的mongod/mongos服务

mongod配置ReplicaSet

  • 在维护模式下启动一个mongod config server
  • 删除local数据库
  • 更新config.shards
  • 关闭mongod
  • 删除所有其他dbPath配置服务器
  • 启动所有mongod配置服务器
  • 连接第一个mongod配置服务器
  • 启动ReplicaSet

示例(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)在维护模式
  • 删除local数据库
  • 更新admin.system.version
  • 关闭mongod
  • 删除所有其他dbPath碎片服务器
  • 启动所有mongod分片服务器
  • 连接第一个mongod分片服务器
  • 启动ReplicaSet

示例(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字符串
  • Startmongos

最新更新