自动缩放MySQL服务器的方法?


8

我运行的网站流量激增,因此自动缩放解决方案在这种情况下非常有利可图。当前,Web服务器能够水平自动缩放,但瓶颈在MySQL服务器上。

  • 我已经尝试过使用Amazon RDS Multi-AZ,但是12 GB数据库的升级大约需要15分钟,而停机时间则是几分钟。当我已经知道在某个特定时刻将会出现流量激增时,它就起到了很大的作用。
  • 我也考虑过Xeround。尽管对于这种规模的数据库而言,这是非常昂贵的,但这可能是最好的解决方案。无论如何,这不是一个选择,因为我在法律上需要数据库位于欧盟。
  • 我已经阅读了有关Scalr的内容,但不确定是否有帮助以及如何使用。
  • 我已经看到许多云托管提供商都提供了垂直扩展解决方案,我认为停机时间为零(据我所知,他们使用Xen虚拟机管理程序无法确定这是否真的可能)。那可能是一个解决方案,但我想知道它是否没有停机时间,以及MySQL配置(以及操作系统上的许多其他功能)如何能够在没有停机时间的情况下进行升级。
  • 我已经尝试过使用MySQL从属服务器,但这根本没有帮助。
  • 我正在使用memcache,它可以提供很多帮助,但还不够。我需要升级的原因是写入,而不仅仅是读取。

有什么建议么?先感谢您


似乎您像我一样陷入同样的​​问题:(您可以考虑对多主机复制或尝试对写入量大的表使用不同的数据库解决方案。我目前正在评估voltdb,我正在考虑将表部分移至voltdb MySQL的。
尼科SP

您是否可以围绕“我已经尝试过MySQL从属服务器,但是完全没有帮助”添加更多详细信息。您以什么方式改变了架构,您期望发生什么?
nickgrim'2

1
我们正在使用的软件已经设计成可以使用MySQL从属服务器(如果需要的话),尽管如此,它根本没有帮助。我认为memcache几乎可以完成所有MySQL从属工作(大部分读取操作)。我认为MySQL Slave不仅仅是一个积极的问题,但无论如何,它取决于每种情况,可能在某些情况下有用,而在其他情况下则没有。
Zillo 2012年

Answers:


4

实际上,一个更简单的解决方案是尝试将Memcached添加到您的堆栈中以节省数据库负载。这可以大大节省负载,并且比尝试解决快速启动服务器(低难度)然后确定快速MySQL同步(难度高得多)的问题要简单得多。

http://toblender.com/?s=memcached

为了解决写入过多的问题,最常见的解决方法是向服务器添加内存(可以在RAM中保留较大的工作集),将数据库放在更快的磁盘上(SSD是一个很好的解决方案,但价格昂贵)或分片(这在附加服务器和复杂性方面很昂贵)。

减少数据库写负载的另一种方法是合并内存中的数据存储(例如Redis)来处理频繁更改的数据,并在需要时定期将更改写回到主数据库。


您能否举一个例子说明memcached如何帮助减少mysql服务器上的写负载?
Niko SP

1
道歉; 我没看到那部分。
gWaldo

更新了答案以解决写延迟问题。
gWaldo

您的SSD建议物有所值,对于如此小的数据库,SSD不一定昂贵。即使数据库更大,ZFS仍可以将所有写入直接缓存到SLC闪存。
天鹰

你是对的; 12GB DB的SSD根本不贵。我考虑的更多是一般情况,而不是OP的特定参数。
gWaldo 2012年

3

您应该考虑使用星形拓扑

这是我的建议

  • 一位写作大师(又名WM)
  • 一位发行主管(又名DM)
  • 五(5)个读从服务器(又名RSS)

像这样准备拓扑

步骤01:使用这些常用选项设置5个RSS

[mysqld]
skip-innodb
key_buffer_size=1G

这将导致创建所有表作为MyISAM Storage Engine加载

步骤02:设置DM和所有RS服务器

  • mysqld将WM中所有表的模式转储到schemadump文件中
  • 将schemadump文件加载到DM和所有5个RSS中
  • tblname ROW_FORMAT=Fixed;在RSS中的所有表上运行ALTER TABLE
  • tblname ENGINE=BLACKHOLE;在DM中的所有表上运行ALTER TABLE
  • mysqldump仅将数据转储(使用--no-create-info)到datadump
  • 在所有5个RSS中加载数据转储

步骤03:设置从DM到所有5个RSS的复制

步骤04:设置从WM到DM的复制

设置结束

这是您的读/写机制的工作方式

  • 您的所有写入(INSERT,UPDATE,DELETE)都在WM上进行
  • SQL记录在DM的二进制日志中(DM中没有实际数据)
  • 每个RSS都是DM的读取从站
  • 您的所有阅读均发生在RSS上

现在是要抓住的地方...

  • 您最初使用RSS 1-4进行读取
  • 使用第5个RSS来启动其他RSS
    • service mysql stop在第5个RSS上运行
    • 旋转另一个RSS
    • 将第5个RSS的/ var / lib / mysql和/etc/my.cnf复制到新启动的RSS
    • service mysql stop在第5个RSS上运行
    • service mysql stop在新的RSS上运行

您可以使用RSS#5一遍又一遍地启动新服务器

在旁注中,请勿将XEROUND用于WM或DM,因为它们不支持InnoDB或BLACKHOLE存储引擎。

希望这些想法对您有所帮助。


1

如果使用Innodb,则应考虑使用Galera管理的Mysql多主服务器。它使设置mysql multi-master更容易,并且应该使您更容易“半”自动缩放。

如果这是您或您的公司正在编写的应用程序,则可以考虑迁移到该应用程序的分片(分区)设计。但是分片会变得复杂。这是一个入门的链接

我假设您已经“调整”了mysql配置文件,如分配的适当内存等。


1

这是在您控制的机架中还是在云中?相对于可用磁盘的大小,12GB是一个非常小的数据库。将其放在小型SLC SSD的RAID1或RAID10阵列上,您的写入延迟将消失。

英特尔311系列20GB SSD SLC($ 120均)将出色地完成这项工作。

如果数据库更大,则可以通过将数据库移至ZFS SAN服务器(使用Nexenta,OpenIndiana,FreeNAS或其他产品在商用服务器硬件上构建)上的iSCSI目标并为该服务器设置类似SSD的镜像来获得类似的惊人结果。您的ZIL写缓存。除了最特殊的情况以外,在所有情况下,千兆以太网都足以移动数据库iSCSI流量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.