MySQL 的扩展解决方案(复制、集群)

2023-11-26

At the startup我正在工作,我们现在正在考虑数据库的扩展解决方案。对于 MySQL,事情变得有些混乱(至少对我来说),它有MySQL集群, 复制 and MySQL集群复制(从版本 5.1.6 开始),这是 MySQL 集群的异步版本。 MySQL 手册解释了其之间的一些差异集群常见问题解答,但很难从中确定何时使用其中之一。

如果熟悉这些解决方案之间的差异、优缺点以及您建议何时使用每种解决方案的人提供任何建议,我将不胜感激。


我已经阅读了大量有关可用选项的文章。我还获得了 High Performance MySQL 第二版,我强烈推荐它。

这是我设法拼凑起来的:

聚类

一般意义上的集群是在许多服务器之间分配负载,这些服务器对于外部应用程序来说就像一台服务器。

MySQL NDB 集群

MySQL NDB Cluster 是一个分布式、内存中、无共享的存储引擎,具有同步复制和自动数据分区(对不起,我从字面上借用了《高性能》一书,但他们在那里说得非常好)。对于某些应用程序来说,它可能是一个高性能的解决方案,但 Web 应用程序通常无法在其上很好地工作。

主要问题是,除了非常简单的查询(仅涉及一张表)之外,集群通常必须在多个节点上搜索数据,从而导致网络延迟逐渐增加,并显着减慢查询的完成时间。由于应用程序将集群视为一台计算机,因此它无法告诉它从哪个节点获取数据。

此外,内存中的要求对于许多大型数据库来说是行不通的。

持续红杉

这是 MySQL 的另一个集群解决方案,充当 MySQL 服务器之上的中间件。它提供同步复制、负载平衡和故障转移。它还确保请求始终从最新副本获取数据,自动选择具有最新数据的节点。

我读过一些好东西总体而言,听起来很有希望。

联邦

联合与集群类似,所以我也将其拖到这里。 MySQL 通过联合存储引擎提供联合。与 NDB 集群解决方案类似,它仅适用于简单查询 - 但更糟糕的是复杂查询的集群(因为网络延迟要高得多)。

复制和负载平衡

MySQL 具有在不同服务器上创建数据库复制的内置功能。这可以用于很多事情 - 在服务器之间分配负载、热备份、创建测试服务器和故障转移。

复制的基本设置涉及一台主要处理写入的主服务器和一台或多台处理只读的从服务器。更高级的变体是大师-大师配置,它还允许通过让多个服务器同时写入来扩展写入。

每种配置都有其优点和缺点,但它们共有的一个问题是复制滞后 - 由于 MySQL 复制是异步的,并非所有节点都始终拥有最新的数据。这要求应用程序了解复制并合并复制感知查询才能按预期工作。对于某些应用程序来说,这可能不是问题,但如果您始终需要最新的数据,事情就会变得有些复杂。

复制需要一些负载平衡来在节点之间分配负载。这可以像对应用程序代码进行一些修改一样简单,或者使用专用的软件和硬件解决方案。

分片和分区

分片是扩展数据库解决方案的常用方法。您将数据分割成较小的分片并将它们分布在不同的服务器节点上。这要求应用程序了解数据存储的修改才能有效工作,因为它需要知道在哪里可以找到所需的信息。

有一些抽象框架可以帮助处理数据分片,例如休眠碎片,Hibernate ORM 的扩展(不幸的是它是用 Java 编写的。我使用的是 PHP)。HiveDB是另一个这样的解决方案,它也支持分片重新平衡。

Others

Sphinx

Sphinx是一个全文搜索引擎,其用途远远超出测试搜索。对于许多查询来说,它比 MySQL 快得多(尤其是分组和排序),并且可以并行查询远程系统并聚合结果 - 这使得它在与分片一起使用时非常有用。

一般来说,sphinx 应与其他扩展解决方案一起使用,以获得更多可用的硬件和基础设施。缺点是您再次需要应用程序代码了解 sphinx 才能明智地使用它。

Summary

扩展解决方案根据需要它的应用程序的需求而有所不同。对于我们和大多数 Web 应用程序来说,我相信复制(可能是多主机)是负载均衡器分配负载的方法。特定问题区域(大表)的分片也是能够水平扩展的必要条件。

我还将尝试一下Continuent Sequoia,看看它是否真的能够实现其承诺,因为它将涉及对应用程序代码进行最少的更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 的扩展解决方案(复制、集群) 的相关文章

随机推荐