开发者社区 问答 正文

mongodb使用新的服务器代替原有的 mongos 和config 服务功能的问题

目前有已搭好的mongodb 分片集群状况为:三台 服务器 每台上运行 一个路由进程(mongos) 一个config_sever 和三个分片,其中三台服务器上的每一个相同shard搭建了副本集例子:
`config = { _id:"shard1", members:[
{_id:0,host:"192.168.30.136:22001"},
{_id:1,host:"192.168.30.137:22001"},
{_id:2,host:"192.168.30.138:22001",arbiterOnly:true}
]
}`
集群架构如下 根据 http://www.lanceyan.com/tech/arch/mongodb_shard1.html 搭建
`sever1 server2 sever3
mongos mongos mongos
config_sever config_sever config_sever
shard1 shard1 shard1
shard2 shard2 shard2
shard3 shard3 shard3`
现在 我想要把mongos(路由) 和config 分离出来,成为三台单独的服务器,即每台上面 一个mongos 一个config原本的三台作为分片重新接入新的服务器。
问题一: 新的在串联新路由和已有的分片时,出现错误,我只能串联三台服务器中的一个副本集,例如我串联了shard1 那么串联shard2时就会出现
"errmsg" : "can't add shard 'shard2/172.31.6.3:22002,172.31.14.250:22002,172.31.14.252:22002' because a local database 'lycamplus' exists in another shard1"
问题二: 在上述情况下,我又选择了拷贝原有的config_server 文件到新的config服务器,这样我就不用去串联副本集了,但是却出现了字符串冲突的问题。即在配置文件中 mongos 的新旧IP冲突。
请问各位朋友如何解决?

展开
收起
落地花开啦 2016-02-29 11:26:19 4143 分享 版权
阿里云 AI 助理回答

问题一:串联新路由和已有分片时出现错误

根据您描述的错误信息 "can't add shard 'shard2/...' because a local database 'lycamplus' exists in another shard1",这表明在尝试将 shard2 添加到新的路由(mongos)时,MongoDB 检测到数据库 lycamplus 已经存在于 shard1 中。这种问题通常发生在以下场景中:

  1. 数据分布不一致:在分片集群中,每个分片应该只存储特定范围的数据。如果某个数据库或集合已经存在于一个分片中,而您尝试将其添加到另一个分片,MongoDB 会拒绝该操作以避免数据冲突。

解决方案

要解决此问题,您可以按照以下步骤操作:

  1. 检查现有分片中的数据分布

    • 使用 sh.status() 命令查看当前分片集群的状态,确认 lycamplus 数据库是否已经被分配到 shard1
    • 如果 lycamplus 数据库确实存在于 shard1,则需要确保其他分片(如 shard2shard3)中没有重复的数据库或集合。
  2. 清理冲突数据

    • 如果 shard2shard3 中存在与 lycamplus 相关的残留数据,可以通过以下命令删除这些数据:
      use lycamplus
      db.dropDatabase()
      
    • 确保所有分片上的数据分布是干净的,避免重复的数据库或集合。
  3. 重新添加分片

    • 在清理完冲突数据后,使用以下命令重新添加分片:
      sh.addShard("shard2/172.31.6.3:22002,172.31.14.250:22002,172.31.14.252:22002")
      sh.addShard("shard3/...")
      
  4. 验证分片状态

    • 再次运行 sh.status(),确认所有分片均已成功添加,并且数据分布正确。

问题二:拷贝原有 ConfigServer 文件导致字符串冲突

当您尝试通过拷贝原有 ConfigServer 的文件到新的服务器时,出现了 IP 地址冲突的问题。这是因为 MongoDB 的 ConfigServer 存储了分片集群的元数据,其中包括分片的地址信息。如果直接拷贝文件而不更新这些元数据,可能会导致新旧 IP 地址冲突。

解决方案

为了避免字符串冲突问题,您可以按照以下步骤操作:

  1. 备份现有 ConfigServer 数据

    • 在执行任何操作之前,请确保对现有的 ConfigServer 数据进行完整备份。可以使用以下命令备份 config 数据库:
      mongodump --db config --out /path/to/backup/
      
  2. 清理旧的元数据

    • 在新的 ConfigServer 上启动 MongoDB 实例后,连接到 config 数据库并清理旧的分片元数据:
      use config
      db.shards.remove({})
      db.databases.remove({})
      db.collections.remove({})
      
  3. 重新初始化分片集群

    • 在清理完旧的元数据后,重新添加分片到新的路由(mongos)中:
      sh.addShard("shard1/192.168.30.136:22001,192.168.30.137:22001,192.168.30.138:22001")
      sh.addShard("shard2/172.31.6.3:22002,172.31.14.250:22002,172.31.14.252:22002")
      sh.addShard("shard3/...")
      
  4. 更新路由配置

    • 确保新的 mongos 路由实例指向新的 ConfigServer 地址。可以在 mongos 启动时通过 --configdb 参数指定新的 ConfigServer 地址:
      mongos --configdb "new_config_server1:27019,new_config_server2:27019,new_config_server3:27019"
      
  5. 验证集群状态

    • 使用 sh.status() 验证分片集群的状态,确保所有分片和路由均已正确配置。

重要提醒

  • 数据一致性:在执行上述操作时,请确保数据的一致性。建议在业务低峰期进行操作,并提前做好完整的数据备份。
  • IP 地址更新:如果您的分片集群中使用了静态 IP 地址,请确保在迁移过程中更新所有相关的 IP 地址配置。
  • 版本兼容性:确保新旧服务器上的 MongoDB 版本一致,以避免因版本差异导致的兼容性问题。

通过以上步骤,您可以成功将 mongos 和 ConfigServer 分离到独立的服务器,并重新接入原有的分片集群。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答