我知道有很多关于数据库复制的文章。相信我,我花了一些时间阅读这些文章,包括这篇解释复制优缺点的 SO 文章。这篇SO 文章深入探讨了单独的复制和集群,但没有回答我的这些简单问题:
- 你什么时候复制你的数据库,什么时候集群?
- 两者可以同时进行吗?如果是,每个人的灵感是什么?
提前致谢。
MySQL 目前支持两种不同的解决方案来创建高可用性环境和实现多服务器可扩展性。
MySQL 复制
第一种形式是复制,MySQL 从 MySQL 3.23 版开始就支持这种形式。MySQL 中的复制当前实现为使用逻辑日志传送后端的异步主从设置。
主从设置意味着指定一台服务器作为主服务器。然后需要接收所有的写查询。然后主服务器执行并记录查询,然后将其发送到从服务器执行,从而在所有复制成员中保持相同的数据。
复制是异步的,这意味着当主服务器执行更改时,从服务器不能保证有数据。通常,复制将尽可能实时。但是,无法保证更改传播到从站所需的时间。
可以出于多种原因使用复制。一些更常见的原因包括可扩展性、服务器故障转移和备份解决方案。
由于您现在可以在任何从属服务器上执行 SELECT 查询,因此可以实现可伸缩性。但是,由于必须在每个复制成员上进行写入,因此写入语句通常不会得到改进。
使用一个使用心跳或类似机制来检测主服务器故障的外部监控实用程序可以相当容易地实现故障转移。MySQL 目前不进行自动故障转移,因为逻辑通常非常依赖于应用程序。请记住,由于复制是异步的,因此可能并非所有在主服务器上所做的更改都会传播到从服务器。
MySQL 复制即使在较慢的连接和不连续的连接上也能很好地工作。它还能够跨不同的硬件和软件平台使用。大多数存储引擎都可以使用复制,包括 MyISAM 和 InnoDB。
MySQL 集群
MySQL Cluster 是一个无共享的分布式分区系统,它使用同步复制来保持高可用性和性能。
MySQL Cluster 是通过一个名为 NDB Cluster 的单独存储引擎实现的。该存储引擎将自动跨多个数据节点对数据进行分区。数据的自动分区允许执行的查询并行化。读取和写入都可以以这种方式进行扩展,因为写入可以分布在许多节点上。
在内部,MySQL Cluster 还使用同步复制来消除系统中的任何单点故障。由于始终保证两个或多个节点具有数据片段,因此至少一个节点可以失败而不会影响正在运行的事务。故障检测是自动处理的,死节点被删除,对应用程序透明。节点重启后,它会自动重新集成到集群中,并尽快开始处理请求。
当前存在许多限制,在决定 MySQL Cluster 是否适合您的情况时,必须牢记这些限制。
目前存储在 MySQL Cluster 中的所有数据和索引都存储在整个集群的主内存中。这确实会根据集群中使用的系统限制数据库的大小。
MySQL Cluster 设计用于内部网络,因为延迟对于响应时间非常重要。
因此,不可能在很远的地理距离上运行单个集群。此外,虽然 MySQL Cluster 将在商品网络设置上工作,但为了获得可能的最高性能,可以使用特殊的集群互连。
当写入数据的大小和数量不大时,我们使用 Master-Salve,否则我们使用集群。集群在空间上很昂贵,而 Master-Salve 在时间上很昂贵,因此您对选择什么的决定取决于您想要保存的内容。