如何将Mysql分区跨多个服务器?

20
我知道水平分区是一种将表按行分割成多个较小部分的技术,以便可以创建许多表。
那么如何在多台服务器上实现呢?这样可以使Mysql具备可伸缩性。
是在X台服务器上创建X个表吗?
有没有人能够解释一下,或者有没有一个好的初学者教程(逐步说明)可以教你如何在多台服务器之间进行分区呢?

2
如果用户点击“关闭”,留下评论会很好。在我看来,这个问题完全适合在Stackoverlow上发布。 - Till
3个回答

23

在MySQL中,人们通常会采用所谓的基于应用的分片

简单来说,您将在多个数据库服务器上拥有相同的数据库结构。但不会包含相同的数据。

例如:

Users 1 - 10000: server A
Users 10001 - 20000: server B

"分片"(Sharding)当然不是一种备份技术,而是旨在将读写分布到集群中的技术。

用于分片的技术包括MySQL-Proxy等。这并不是HScale发明的,它更像是一个简单的LUA脚本,可以将读写分布到不同的后端服务器上。在MySQL forge上应该有很多例子。

另一个基于MySQL Proxy的工具是SpockProxy。完全针对分片而设计。他们也放弃了Lua,并且做了各种事情使它比代理更快速。目前,我只测试过SpockProxy,但从未在生产环境中运行过。

除了这些代理之外,您也可以自己进行分片。需要一个主表,例如:

-------------------
| userA | server1 |
| userB | server2 |
| userC | server1 |
-------------------

然后将读写构建到服务器上。这并不是很漂亮,但它能工作。下一个障碍是使其更具容错性。例如,server1server2server3应该分别成为一个小的集群。

最后,另一种有趣的分区数据和索引跨服务器的方法是Digg的IDDB。我不确定他们是否曾经发布过它的代码,但他们的博客文章详细介绍了它的功能。

如果这有帮助,请告诉我!


这就是在我知道它被称为什么或者其他选择之前,我最终采取的做法。我需要快速解决问题,而这个方法很有道理。所以我把一半的客户放在一个服务器上,另一半放在另一个服务器上。问题在于现在很难获取所有数据的统计信息,或者编写一个管理两个服务器上数据的管理站点。 - Vincent

4
但是您需要记住,如果出于某些原因想将此解决方案转移到云端并使其成为多租户,则上述配置可能变得更具挑战性。思考一下:
  1. 您登录系统后,基于用户-组织表选择DB(DB交换)
  2. 这将是您现在要与之通信的新主表,带有自己的从属
  3. 但是,上述第2点现在也需要分片,因为您希望确保扩展不会成为瓶颈。
因此,现在的问题是您可能需要考虑如何在主-从环境中进行分片,其中从服务器通常用于读取,主服务器用于写入。
祝好! Gary

0

以下是HSCALE 0.1发布公告中的内容:

目前我们只需要拆分大型表格,但以后我们希望将分区分布在多个MySQL服务器实例上,以实现真正的水平扩展。最困难的部分将是处理涉及到不同主机上的分区的事务,我们必须使用分布式事务(XA)或禁止涉及到不同主机上的分区的事务...

请查看这个项目:http://sourceforge.net/projects/hscale/,也许它适合您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接