【问题标题】:MySQL sharding and partition in distributed system分布式系统中的 MySQL 分片和分区
【发布时间】:2017-11-20 14:15:01
【问题描述】:

我是从 mySQL 中读到的:

“与其他分片数据库不同,用户不会失去 执行 JOIN 操作,牺牲 ACID 保证或引用 执行查询和事务时的完整性(外键) 跨分片。”

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

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

您将为 ACID 保证和数据库连接选择 SQL。但是,容易横向扩展的可用性。 (您可以在 mySQL 之上再添加一层来处理自己的分区和共享,但如果这样做,您仍然会丢失 ACID 并加入)

但是,上面的语句将 mySQL 声明为一个“完美”的数据库,它可以处理可伸缩性,同时保持 SQL 数据库的优势。我在这里错过了什么还是只是广告?

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

【问题讨论】:

  • 划痕是什么意思?

标签: mysql sql sharding distributed-system nosql


【解决方案1】:

你摘录的引用来自the marketing copy for MySQL NDB Cluster,和普通的MySQL不一样。

MySQL NDB Cluster 是一个分布式数据库,主要通过使每个组件冗余来实现高可用性。存储是分布式的,可以有多个mysqld实例,对多个存储节点上的数据进行SQL操作。

但也有缺点。当您通过主键查询单个行时,NDB Cluster 效率更高(听起来有点像 Cassandra 之类的分布式键值存储,对吧?)。

【讨论】:

  • Cassandra 是基于列族的吧?但是,我认为大多数 NonSQL 数据库不能保证 ACID,也不支持 Joins。 MySQL NDB Cluster 架构在共享时如何在保持普通 SQL 的同时受益?
  • 是的,NDB Cluster 确实支持 ACID 和 SQL,这与 Cassandra 不同。我的观点是它针对主键查找而不是范围谓词进行了优化。
【解决方案2】:

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

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

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

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

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

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

因此,使用 MySQL 集群,您可以在分片系统中获得 SQL 和 ACID。

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

【讨论】:

    猜你喜欢
    • 2023-01-05
    • 2018-03-10
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 2014-02-18
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多