分布式系统中的MySQL分片和分区

标签 mysql sql sharding distributed-system nosql

我从 mySQL 中读到了这个:

"Unlike other sharded databases, users do not lose the ability to perform JOIN operations, sacrifice ACID-guarantees or referential integrity (Foreign Keys) when performing queries and transactions across shards."

根据我的理解。 当您在 SQL 与 NoSQL 之间进行选择时。

您将选择 NoSQL 来实现轻松的水平扩展(分片和分区),例如您有大量数据无法保存在单个数据库中,但要牺牲事务级别 ACID 和数据库级别连接。

您将选择 SQL 来进行 ACID 保证和数据库连接。但是,牺牲了简单的水平扩展可用性。 (您可以在 mySQL 之上再添加一层来处理分区和共享,但如果您这样做,您仍然会失去 ACID 和连接)

但是,上面的语句声明 mySQL 是一个“完美”的数据库,它可以在保持 SQL 数据库优点的同时处理可扩展性。我是否错过了这里的任何内容或者这只是广告?

另外,我没有找到任何有关 mySQL 分片架构的信息?

最佳答案

正如已经回答的那样,摘录是关于 MySQL Cluster (NDB) 的。 MySQL Cluster 将数据存储在一组 NDB 数据节点中,这些节点 可以从连接到的任何 MySQL 服务器访问 NDB集群。

NDB使用事务来更新数据并遵循ACID 围绕 D. So 进行一些特殊优化的原则 我们提供网络持久性,这意味着交易是 在提交之前在内存中的所有事件副本上提交 发送到应用程序。它也将始终如一地耐用 大约 1 秒内在所有实时副本上的持久介质上。

数据节点被分组为节点组(或多或少 碎片的同义词)。一个节点组中的所有节点包含 该节点组中的所有数据。只要每个节点有一个 节点组处于事件状态,集群处于事件状态。

事务可以跨越所有节点组(分片)。有可能的 执行跨所有节点组(分片)的连接操作。 连接操作由MySQL服务器执行,但是 许多连接被下推到 NDB 数据节点,以便它们 自动并行化。

有多种基本访问方法: 1)主键访问 2) 唯一键访问(== 2 个主键访问) 3)分区修剪扫描访问(条件中提供Partition Key) (这可以是有序索引扫描或完整扫描)。这只会 扫描表的一个分区。 4)有序索引扫描 此扫描将使用有序索引并行扫描所有分区 5)全表扫描 此扫描将扫描表中的所有分区并检查每一行

所有这些访问类型都可以具有下推的条件,这些条件在访问数据时在数据节点中进行评估。

因此,通过 MySQL Cluster,您可以在分片系统中获得 SQL 和 ACID。

它是否适合您的需求取决于您的 用例。

关于分布式系统中的MySQL分片和分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44612332/

相关文章:

mysql - 除了简单的 0 或 1 之外,保存 MySQL 表中记录状态的最佳方法是什么?

php - 在 FOR 循环中迭代 FOREACH 数组

php - 我如何以正确的格式获取这些数据?

MySQL:使用另一个表中的某些特定值在一个表中插入新记录

sql - 如何在 sql 2005 中搜索表?

sql - Hibernate + SQL Server 性能变量

ruby-on-rails - 分区数据库表的 Rails 迁移索引名称太长

java - Hibernate 分片和 JNDI 问题