使用MYSQL分片技术拆分大型千兆表

5

我知道水平分区可以创建许多表。

我已经看到,在基于应用程序的分片中,您将在多个数据库服务器上拥有相同的数据库结构。但它不会包含相同的数据。

所以例如:

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

用于分片的技术包括MySQL-Proxy,例如一些基于MySQL Proxy的工具,如SpockProxy。我们也可以手动分片。需要一个主表,例如:
-------------------
| userA | server1 |
| userB | server2 |
| userC | server1 |
-------------------

但是这些技术都是在应用程序级别处理的...我想在数据库服务器级别解决它。
我们可以透明地使用多个服务器来做到这一点吗?这将允许Mysql表进行扩展。
在X个服务器上创建X个表,最终用户通过对单个DB服务器的简单查询获取数据?
简而言之,我想在单个表中插入16TB的数据,但我没有单个机器上如此大的空间,因此我想安装两个容量为8TB的服务器。但用户查询单个数据库并获得结果,而在后台可能使用了分片。
我也开放这个讨论,以寻找其他好的解决方案,例如MYSQL集群。
有人可以解释一下,或者有一个好的初学者教程(逐步)教你如何跨多个服务器进行分区吗?

据我所知,所有的分片都是在应用程序层面上完成的。MySQL 并不能进行透明的分片处理。 - Namphibian
@Namphibian 这个问题还有其他解决方案吗,比如Mysql集群等等? - Imran
今天会看一下,但上次使用聚类时速度很慢,真的不值得花费那么多精力。 - Namphibian
@Namphibian:谢谢,我期待着它。 - Imran
1个回答

1
你需要在继续之前调整一下思路。我认为在MySQL上没有简单的方法来做到这一点,但我相信如果你付出努力使用FEDERATED表和视图是可以实现的。然而,关系型数据库分片从来都不是一件容易的事情。
分片是非常困难的。将表进行分片几乎总是错误的方式。相反,你真正需要分片的是数据集。这是因为跨节点的连接是昂贵的。
所以我强烈建议重新审视这个问题。如果你确实不需要连接,请看看其他支持此类功能的数据库,如Cassandra。但是,如果你确实需要连接,你需要查看数据库中的每个表并找到良好的分区标准,然后在具有相同数据库架构但不同分片的情况下进行分区。
一旦您完成这些设置,就可以在数据库前面放置代理来处理查询路由。 可以考虑使用 https://github.com/flike/kingshard 作为其中一种可能性(但是作为免责声明,我没有在MySQL上使用过此方法)。通过代理,您的应用程序将获得单个数据库的外观,而根据我对您问题的理解,这确实是您的目标。

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