MySQL 分片与 MySQL 集群

gsb*_*gsb 15 mysql ndbcluster

考虑性能,MySQL Cluster 能否击败自定义数据分片 MySQL 解决方案?分片 = 水平分区

当我提到分片时,我正在考虑在应用层进行分片,例如,在独立的 MySQL 实例之间均匀分布记录。对于两台服务器,它可能是 (key mod 2)。

小智 22

披露:我是一名 MySQL 员工,从事 MySQL 集群工作。

我会说 MySQL 集群可以实现比分片 MySQL+InnoDB 更高的吞吐量/主机,前提是:

  • 查询很简单
  • 所有数据都适合内存

在延迟方面,MySQL Cluster 应该比分片 MySQL 具有更稳定的延迟。纯内存数据的实际延迟可能类似。

随着查询变得更加复杂,并且数据存储在磁盘上,性能比较变得更加混乱。要获得更具体的答案,您需要详细描述您的应用程序和您执行的查询,以及主机数量和数据量。MySQL Cluster 最近获得了并行本地化查询执行 (AQL),这意味着尽管数据分布在多个主机上,但它可以与独立的 MySQLD 竞争。

MySQL Cluster 目前仅限于“分片”超过 48 个主机。Sharded MySQL 理论上没有限制。但是,对于给定的目标吞吐量,可能需要比分片 MySQL 主机更少的 MySQL Cluster 主机。

更有趣的区别是当您查看性能以外的其他领域时:

  • MySQL Cluster 支持跨所有分片的任意查询
  • MySQL Cluster 支持跨所有分片的任意事务
  • MySQL Cluster 支持具有自动故障转移和恢复功能的分片同步复制
  • MySQL Cluster 支持在线添加节点(集群扩容)
  • 分片 MySQL 更像是“自己动手”

将分片内置到您的应用程序中可为您提供最大的扩展潜力,但会增加复杂性并限制您在跨分片查询和操作方面的灵活性。如果您的分片还为时过早,那么它可能是您某些问题的根源。MySQL Cluster 让您可以获得分片的一些好处,而不必将您的应用程序限制为仅限单分片。

关于前面的答案,一些澄清:

“虽然 MySQL Cluster 是 ACID-complaint,但它没有为具有复合键的数据提供合适的存储引擎。”

MySQL Cluster 支持复合主键和辅助键。不确定它有什么不“合适”。也许之前的海报可以解释?

“为了将具有相同关键特征的数据存储在一组特定的数据节点中,您可以执行以下操作:

  1. 将所有数据节点脱机,只留下那些您想要保存具有相同关键特征的数据的数据节点。
  2. 将您的数据加载到 MySQL 集群中,该集群仅填充您选择的数据节点
  3. 使所有数据节点重新联机”

这是不正确的。数据分布与哪些节点碰巧随时在线无关。MySQL Cluster 支持各种数据分布方案,以支持您描述的优化。我在这里的博客文章中描述了 MySQL Cluster 中的数据分布Data distribution in MySQL Cluster