具有重写应用程序的数据库可伸缩性

我有一个重写应用程序。 应用程序与调查相比是最好的 – 客户创build自定义问卷并将其保存到数据库。 大部分请求来自用户提交这些表单。 稍后,我们的客户会对这些提交内容进行复杂的报告和图表。

确保我们的应用程序服务器(PHP)和networking服务器(Nginx)可以轻松扩展,麻烦的是将数据库服务器扩展到多个服务器上。

很多应用程序的读取比较繁琐,所以通常情况下,您将拥有一个主从复制设置,其中所有写入操作都将转到单个主节点,但是会将读取操作分配给从节点。 对我们来说,这是行不通的,因为我们大部分时间都是在写文章。

我已经看到提到一个主 – 主设置,但是这通常会遇到与自动递增的主键的障碍。 解决scheme通常是有一个服务器做奇数,而另一个做平衡。 我想避免这一点。

在一些类似的问题上,我已经提到了钨复制器,以及它如何为复制提供更多的灵活性。 这会帮助我吗? 这会给我MySQL的内置复制无法提供什么样的好处?

还有MySQL簇,但是这通常会遇到非常大的数据库和复杂的查询(连接)的问题。 我需要能够运行复杂的报告,所以这可能不适合我。

我正在寻找冗余,自动故障转移,分配请求和数据完整性。

还有其他RDMS提供更适合networking的更好的解决scheme吗?

Grand Unified Database Layout没有这样的事情。 如果有定制的问题,那么真的需要定制表格。 否则,您将很快到达dailywtf.com之外的200个单列中的VARCHAR(128)-with-no-primary-keys monstrosity,这是效率低下,无法支持的,并且会在将来伤害您。

按照推荐意见,分拆可能是一件值得考虑的事情,但首先要仔细检查一下,你的数据库是否合理devise。 如果没有正常化,那么有一个非常好的,最好由testing支持,理由,为什么不是。 如果它有数百个表格,可能是错误的。 如果它有单表,那肯定是错的。 看看你可以把你的问题分成独立的方式。 你会花更多的努力,但系统会更好。

百万行,比方说,每行2K的数据(这似乎是一个调查大量的字符),是2GB的内存。 如果你可以把更多的硬件扔到你的问题上,也许你可以将你的数据保存在RAM中?

这导致了下一个问题:你的绝对数量是多less? 客户请求每秒钟翻译成I / O,分为每秒读写次数,多less千兆字节的数据,以什么增长率? 您的负载如何随请求数量扩展? 线性? 成倍? 您不必公布您的数据,只需将其写下来并考虑一下。 今天是什么,你觉得一两年后怎么样?

维基百科说,一个15k rpm的SAS驱动器会给你175-210 IOps。 在RAID 10中需要多less个磁盘才能满足当前和预计的负载? 你的数据集有多大? 你需要多less个驱动器来适合你的数据集(可能比满足IO要求less得多)。 购买一对(或一打)SSD是否合理? 本地存储是否正常,或者是否将两个8Gb光纤链路饱和到高端存储子系统?

如果目前您需要1k IOps,但在RAID 5中有三个10k rpm硬盘,那么您的硬件无法满足您的要求。 OTOH如果你的应用每秒有一个用户请求,并带来一个32核心的256 GB的RAM野兽,企业级存储的支持,那么机会就不在于硬件能力。

主 – 主设置,但是这通常会与自动递增的主键相冲突

否 – 您只需设置自动增量增量和自动增量偏移以避免冲突

解决scheme通常是有一台服务器做奇数,另一台服务器。 我想避免这一点。

为什么? 代理键本质上与它们索引的数据无关。 为这些值赋予意义是非常危险的

快速浏览一下你提供的Tungsten链接并不能说明它做了什么 – 它确实有很多不切实际的地方(例如“你可以做多个主复制,这比你使用MySQL本地复制的function要多”)。 它在同一段说它不能处理冲突。 我对这个产品的实用性并不满意。

假设主 – 主复制(无论有没有联合限制复制)都不符合您的要求(但是您需要重新审视您对自动增量字段types的思考),那么您可以使用mysqlproxy在本地集群之间分割数据,或者使用一个nosql数据库。

这听起来像是一个很好的案例。 如果一个调查中的数据不需要立即访问另一个调查中的数据,那么分解数据将变得很容易。 您将设置一个基本上具有指向调查数据库的用户ID密钥的数据库。 然后您可以设置多个调查数据库。 希望你也会select在复制的元组中设置它们。 您的应用程序将需要一些重新工作。

运行您的报告并通过软件进行连接。 如果这也是一个select,分片是要走的路。