![我必须对 mysql 数据库进行分片。我想在 2 台机器上开始使用 12 个分片。当我想添加新服务器时,移动其中一些分片的最佳方法是什么?](https://linux22.com/image/510493/%E6%88%91%E5%BF%85%E9%A1%BB%E5%AF%B9%20mysql%20%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9B%E8%A1%8C%E5%88%86%E7%89%87%E3%80%82%E6%88%91%E6%83%B3%E5%9C%A8%202%20%E5%8F%B0%E6%9C%BA%E5%99%A8%E4%B8%8A%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8%2012%20%E4%B8%AA%E5%88%86%E7%89%87%E3%80%82%E5%BD%93%E6%88%91%E6%83%B3%E6%B7%BB%E5%8A%A0%E6%96%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%97%B6%EF%BC%8C%E7%A7%BB%E5%8A%A8%E5%85%B6%E4%B8%AD%E4%B8%80%E4%BA%9B%E5%88%86%E7%89%87%E7%9A%84%E6%9C%80%E4%BD%B3%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
所有表都是 InnoDb。我宁愿不使用 mysqldump,因为分片大小将约为 200 GB(约 7 亿行),这将花费太长时间。
我希望只停止 mysql 一个小时,将数据文件复制到新机器,然后重新启动。但是您无法使用 InnoDb 执行此操作,因为某些数据位于共享表空间中。即使我设置了 innodb_file_per_table 选项。
这不是一个网站,而是一个自定义应用程序,目前有数万人在使用,因此正常运行时间和性能非常重要。我想我可以在服务器应用程序中添加逻辑,以允许逐步重新平衡/移动分片。
还有人有更好的主意吗?
答案1
您可以尝试使用 innodb hotcopyhttp://www.innodb.com/products/hot-backup/features/
有点贵,但似乎你可以得到一份评估版。
答案2
如果在启用该选项后创建表innodb_file_per_table
,则所有表内容都应存储在该表独有的文件中。
失败的话...
如果无限期地保留二进制日志不是问题,您可以在加载任何数据之前进行数据转储。初始转储可用于引导复制。然后,只需等待复制跟上进度,然后尝试进行切换即可。
或者,如果您已经使用复制进行备份,则可以改为从备份服务器设置复制。明显的缺点是备份在数据库转储期间将处于离线状态。
第三个选择是,您可以随时将 MySQL 的全部内容复制到新服务器,启动它,然后删除您不使用的任何内容。
答案3
答案4
我们确实使用 dbShards 技术提供了解决方案。我们可以为您现有的数据库提供一组热辅助服务器,并提供可靠的复制。然后,您可以在不关闭主(主)数据库的情况下对辅助服务器进行重新分片,并顺利过渡到其他分片服务器。
欲了解更多信息,您可以阅读:http://www.dbshards.com