![如何使用多个数据库服务器(例如 20 个数据库服务器)扩展 mySQL](https://linux22.com/image/557912/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%A4%9A%E4%B8%AA%E6%95%B0%E6%8D%AE%E5%BA%93%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88%E4%BE%8B%E5%A6%82%2020%20%E4%B8%AA%E6%95%B0%E6%8D%AE%E5%BA%93%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%89%E6%89%A9%E5%B1%95%20mySQL.png)
从 MySQL 官方开发者网站的文档中可以很清楚地了解从 1 个 MySQL 数据库服务器扩展到 4-5 个服务器的步骤:http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-scaleout.html
那么从 4 台服务器扩展到 20 台服务器怎么样?我们也只是将其添加为从服务器吗?这意味着 19 个从服务器只有 1 个主服务器?这意味着无论我们放入多少个数据库服务器,插入速度都是相同的。
有没有更好的方法来扩展 MySQL,即我们投入的服务器越多,读取和写入速度就越快。我们认为这是必要的,因为这是一个用于高交易量公司的系统(交易网站)
哦,是的,如果可能的话,避免使用 SAN 存储。如果需要 SAN,不妨将 MySQL 迁移到 Cassandra。
答案1
有几种解决方案。
为了获得更好的插入性能,同时对代码的影响最小,请查看mysql 集群。这些远远超出了复制的范围,并且透明地实现了分片。我相信(但需要深入研究才能验证)mysql 集群可以充当主/从复制中的主节点。因此,例如,您可能有一个 4 节点集群来处理向十几个从节点复制的写入操作。
请注意,您可以实现主/主复制 - 您可以有效地将任意数量的节点排列成环 - 这也会为您带来插入性能的好处 - 但是由于节点数量如此之多,因此会增加更新传播延迟的风险。
如果您有一个复杂的模式,那么您可能会通过使用联合存储引擎来分割数据来获得很大的好处,尽管 mysql 在这种情况下并不总是尽可能地优化查询。
你绝对应该看看mysql代理或者如果您要走大多数这些路线,则可以使用其他抽象层。
答案2
如果您要处理那么多节点,请检查 mysql-mmm 或 ndb 集群,但请注意,如果您使用 MySQL 集群(ndb),那么您将需要相应地更改代码。
MySQL-MMM 可以在以下位置找到http://mysql-mmm.org/ndb 是 mysql.com 上的 MySQL Cluster Server 的一部分
答案3
您可能需要查看 Distribution Master 设置。
这将涉及创建一个具有三 (3) 个特征的从属设备(称为分发主机):
- log-bin 已启用
- 日志从属更新已启用
- 每个数据库(information_schema 和 mysql 除外)都只有 BLACKHOLE 表
那有什么好处呢?
想象一下这个场景
- 26 个 MySQL 实例
- ServerA 是写主服务器
- ServerB 是分发主机
- ServerC ... ServerZ 是 ServerB 的读取从属服务器
以下是在 ServerA 中执行 INSERT 时发生的情况
- 服务器A 将 INSERT 条目记录到其当前二进制日志中
- ServerB 的 I/O 线程从 ServerA 的二进制日志导入 INSERT
- ServerB 的 I/O 线程在其中继日志中记录 INSERT
- ServerB 的 SQL 线程从其中继日志中读取 INSERT
- ServerB 处理 SQL
- ServerB 将 INSERT 条目记录到其当前二进制日志中
- ServerB 将二进制日志中的 INSERT 传输到 ServerC 的中继日志...ServerZ
这提供了以下好处
- 服务器A(写入主服务器)不会因执行复制任务而陷入困境
- 服务器 B(分发主服务器)不本地存储任何数据。它仅提供将二进制日志条目传递到所有读取从属服务器的管道。因此,没有繁重的写入 I/O。
其他人也尝试过这种方法。事实上,我回答了DBA StackExchange和堆栈溢出对于那些愿意做实际工作但又希望在两个或多个从属服务器上有适当分布的读取 I/O 的人来说,这是一个可行的选择。
如果您关心高可用性,没问题。您有两个选择:
选项1
重新进行如下设置
- 26 个 MySQL 实例
- ServerA 是主动写入主服务器
- ServerB 为被动写入主服务器
- ServerC 是分发主机
- ServerD ... ServerZ 是 ServerC 的读取从属
- ServerA 和 ServerB 是循环复制对
- 可以在 ServerB 中备份数据
选项 2:使用 MySQL 和 DRBD
- 26 个 MySQL 实例
- ServerA 是 DRBD 主服务器,MySQL 以写入主服务器身份运行
- ServerB 是 DRBD 辅助服务器,MySQL 已关闭
- ServerB 提供 ServerA 数据卷的磁盘级副本
- 运行 ucarp 以使 DB VIP 指向 DRBD Primary
- ServerC 是分发主机,其主机是 DRBD 主服务器
- ServerD ... ServerZ 是 ServerC 的读取从属