2017-06-18 34 views
0

我从MySQL阅读:MySQL的分片和分区在分布式系统

“与其他碎片化的数据库,用户不会丢失的能力 执行JOIN操作,牺牲ACID的保证或参照 完整性(外贸Keys)跨越分片执行查询和交易 “。

为了我的理解。 当你选择SQL vs NoSQL时。

你会选择NoSQL来实现简单的横向扩展(分片和分区),例如你有很多数据不能保存在单个数据库中,但是会减少事务级ACID和数据库级连接。

您将为ACID保证和数据库连接选择SQL。但是,要减少横向可用性。 (你可以在mySQL的顶部添加一层来处理分区和共享自己,但如果你这样做,你的意志仍然会失去ACID并加入)

但是,上面的语句声明mySQL是一个“完美”的数据库,可以处理既可扩展性又保持SQL数据库的优势。我在这里错过了什么,或者它只是广告?

此外,我没有找到关于mySQL的分片架构如何看起来像任何信息?

+0

这是一个学术问题吗?或者你是否处于Facebook/Twitter /开始阶段?如果是后者,那么最好的办法就是实施_something_,并认真计划每季度重写一次。在这样做的时候,你会了解你是否真的需要ACID,NoSQL,Sharding等等,并且你会决定做出取舍。也就是说,回答你的问题还为时过早。 –

回答

1

你摘录的报价是从the marketing copy for MySQL NDB Cluster,这是不同于普通的MySQL。

MySQL NDB集群是一个分布式数据库,主要为高可用性构建,通过使每个组件都是冗余的。存储是分布式的,您可以拥有多个将SQL操作应用于多个存储节点上的数据的mysqld实例。

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

+0

Cassandra是基于列家族的权利?但是,我认为大多数NonSQL数据库不能保证ACID并且不会支持连接。 MySQL NDB集群体系结构在共享时如何保持普通的SQL优势? – user1947415

+0

是的,与Cassandra不同,NDB群集确实支持ACID和SQL。我的观点是,它优化了主键查找,而不是范围谓词。 –

1

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

NDB使用事务来更新数据,并遵循ACID 原则与一些特殊的和身边的优化与D.所以 我们提供网络耐用,这意味着交易 致力于在内存中的所有活动副本提交之前 发送到应用程序。在大约1秒钟内,所有生命复制品上的耐用媒体上的耐用性也会持续保持在 之间。

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

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

有许多的基础接入方法: 1)一键访问 2)独特的密钥访问(== 2主键访问) 3)分区修剪扫描访问(分区关键是在条件提供) (这可以是有序索引扫描或全面扫描)。这将只有 扫描表的一个分区。 4)有序索引扫描 此扫描使用有序索引 5)全部表扫描 该扫描将扫描将扫描表中的所有分区,并检查每一行

所有这些接入类型的将扫描并联的所有分区可以具有在访问数据时在数据节点中评估的条件下推。

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

如果它适合您的需要取决于您的日常使用情况 用例。