目前有已搭好的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冲突。
请问各位朋友如何解决?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您描述的错误信息 "can't add shard 'shard2/...' because a local database 'lycamplus' exists in another shard1",这表明在尝试将 shard2 添加到新的路由(mongos)时,MongoDB 检测到数据库 lycamplus 已经存在于 shard1 中。这种问题通常发生在以下场景中:
要解决此问题,您可以按照以下步骤操作:
检查现有分片中的数据分布:
sh.status() 命令查看当前分片集群的状态,确认 lycamplus 数据库是否已经被分配到 shard1。lycamplus 数据库确实存在于 shard1,则需要确保其他分片(如 shard2 和 shard3)中没有重复的数据库或集合。清理冲突数据:
shard2 或 shard3 中存在与 lycamplus 相关的残留数据,可以通过以下命令删除这些数据:
use lycamplus
db.dropDatabase()
重新添加分片:
sh.addShard("shard2/172.31.6.3:22002,172.31.14.250:22002,172.31.14.252:22002")
sh.addShard("shard3/...")
验证分片状态:
sh.status(),确认所有分片均已成功添加,并且数据分布正确。当您尝试通过拷贝原有 ConfigServer 的文件到新的服务器时,出现了 IP 地址冲突的问题。这是因为 MongoDB 的 ConfigServer 存储了分片集群的元数据,其中包括分片的地址信息。如果直接拷贝文件而不更新这些元数据,可能会导致新旧 IP 地址冲突。
为了避免字符串冲突问题,您可以按照以下步骤操作:
备份现有 ConfigServer 数据:
config 数据库:
mongodump --db config --out /path/to/backup/
清理旧的元数据:
config 数据库并清理旧的分片元数据:
use config
db.shards.remove({})
db.databases.remove({})
db.collections.remove({})
重新初始化分片集群:
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/...")
更新路由配置:
--configdb 参数指定新的 ConfigServer 地址:
mongos --configdb "new_config_server1:27019,new_config_server2:27019,new_config_server3:27019"
验证集群状态:
sh.status() 验证分片集群的状态,确保所有分片和路由均已正确配置。通过以上步骤,您可以成功将 mongos 和 ConfigServer 分离到独立的服务器,并重新接入原有的分片集群。