MySQL分片方法?

什么是Sharding MySQL表的最佳方法。
我可以想到的方法是:

>应用程序级分片?
>分片在MySQL代理层?
>分片的中央查找服务器?

你知道这个领域有什么有趣的项目或工具吗?

分割MySQL表的最佳方法不是这样做,除非它是完全不可避免的。

当您编写应用程序时,通常希望以最大化速度,开发人员速度的方式这样做。您只需在必要时优化延迟(回答就绪之前的时间)或吞吐量(每个时间单位的答案数)。

只有当所有这些分区的总和不再适合单个数据库服务器实例时,才进行分区并将分区分配给不同的主机(= shard) – 这是写入或读取的原因。

写案例是:a)写入的频率永久性重载此服务器磁盘,或b)执行的写入太多,以致复制在此复制层次结构中永久滞后。

分片的读取情况是当数据的大小如此之大,使得它的工作集不再适合存储器,并且数据读取开始击中磁盘,而不是在大多数时间从存储器提供。

只有当你必须碎片你做它。

你分手的那一刻,你是以多种方式付出的:

你的很多SQL不再是声明性的。

通常,在SQL中,您告诉数据库您需要什么数据,并将其留给优化程序将该规范变为数据访问程序。这是一件好事,因为它是灵活的,并且因为写这些数据访问程序是无聊的工作,危害速度。

使用分片环境,您可能在节点A上加入节点A上的表,而在节点A和B上加入节点B上的表,或者您有一个大于节点的表,并且正在加入节点B和C上的数据。您正在开始手动编写应用程序端基于哈希的连接分辨率,以解决这个问题(或者您正在重新创建MySQL集群),这意味着您最终会得到大量不再声明性的SQL,但是以过程方式表达SQL功能(例如,你在循环中使用SELECT语句)。

您会产生大量的网络延迟。

通常,可以在本地解析SQL查询,并且优化器知道与本地磁盘访问相关联的成本,并以最小化该成本的方式解析查询。

在分片环境中,查询通过在网络上运行键值访问到多个节点(希望通过成批的键访问,而不是每次往返的单个键查找)或通过将部分WHERE子句向前推送​​到节点来解决可以应用(这被称为“条件下推”),或两者。

但即使在最好的情况下,这涉及到更多的网络往返,当地情况,它是更复杂。特别是因为MySQL优化器根本不知道网络延迟(确定,MySQL集群正在慢慢变得更好,但对于外群集的香草MySQL仍然是真的)。

你失去了很多SQL的表现力。

好吧,这可能不太重要,但外键约束和其他SQL机制的数据完整性不能跨越多个分片。

MySQL没有允许处于正常工作状态的异步查询的API。

当相同类型的数据驻留在多个节点(例如,节点A,B和C上的用户数据)时,通常需要针对所有这些节点解析水平查询(“查找90天内未登录的所有用户帐户或者更多”)。数据访问时间随着节点数量线性增长,除非可以并行地询问多个节点,并且结果在它们进来时聚合(“Map-Reduce”)。

前提条件是异步通信API,它不存在MySQL在一个良好的工作形态。另一种是在孩子过程中的许多分叉和连接,这是访问世界的吮吸季节传球。

一旦您开始分片,数据结构和网络拓扑变得可视为性能指向您的应用程序。为了执行得相当好,您的应用程序需要了解这些事情,这意味着真正只有应用程序级分片是有意义的。

问题是更多,如果你想自动分片(确定哪个行通过哈希主键例如为哪个节点)或者如果你想手动分割功能(“与xyz用户故事相关的表转到这个master,while abc和def相关表转到那个master“)。

功能分片的优点是,如果做得好,大多数开发者大多数时候都不可见,因为与他们的用户故事相关的所有表都将在本地可用。这允许他们仍然尽可能长地从声明性SQL中获益,并且也将导致更少的网络延迟,因为跨网络传输的数量保持最小。

功能分片具有缺点,即它不允许任何单个表大于一个实例,并且它需要设计者的手动注意。

功能分片具有的优点是,它对具有不过大的多个改变的现有代码库相对容易地完成。 http://Booking.com在过去的几年里做了多次,对他们来说效果很好。

说完这些,看着你的问题,我确信你提出了错误的问题,或者我完全误解你的问题陈述。

http://stackoverflow.com/questions/5541421/mysql-sharding-approaches

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:MySQL分片方法?