有没有办法在 MySQL 中实现工作负载管理?

Enn*_*oji 2 mysql mysql-5.5 aws amazon-rds

有没有办法在 MySQL 中设置工作负载管理(特别是 AWS RDS 上的 v5.5)?

工作负载管理是指在 Teradata、RedShift 等中实现的功能,允许对查询进行优先级排序。特别是,我想对来自应用程序的战术性的、短期运行的查询给予高优先级,而对长期运行的后台查询给予低优先级。

Mic*_*bot 5

除了过时的技术,如获取表上的排他锁和像SELECT HIGH_PRIORITYandINSERT DELAYED这样的策略——要么被弃用,要么没有用(尤其是 InnoDB)——MySQL(包括 RDS)没有任何像这样的优先级排序机制。

根据“长时间运行的后台查询”的性质——如果它们是读取,而不是写入,例如用于报告目的——通常的方法是部署只读副本。在 RDS for MySQL 5.5 中,副本服务器必须是另一个 RDS 实例。这与“Multi-A/Z”RDS 不同,在后者中您无法访问备用服务器,并且切换到备用服务器是自动的。

除了卸载繁重的读取负载外,拥有只读副本仍然是一种可行的灾难恢复工具。如果您的生产 RDS 实例发生灾难性中断,可以手动将 RDS 只读副本转换为独立(主)实例,并且您可以将应用程序迁移到它——它将拥有最新版本的您的生产数据是可能的——在原始主机失败之前它收到的任何东西都不应该丢失。

MySQL 中的标准复制是异步的——副本并不精确地与主节点锁步同步,但在足以提供工作负载的系统上,延迟通常是几毫秒。master 几乎立即将更改发送到副本,而副本(从与 master 相同的数据集开始)立即将原始更改指令的副本存储到“中继日志”中的磁盘中,然后应用在磁盘、内存和 CPU 允许的情况下,对自己的工作数据集进行的那些更改......分两步进行。过载的副本服务器的工作数据集可能会落后于主服务器,但如果主服务器在一段正常运行条件之前发生灾难性故障,

新增功能,在 RDS for MySQL 5.6 中,您实际上可以在 RDS 外部的 MySQL 实例上部署只读副本,无论是在 EC2 实例中还是在您自己的数据中心,并拥有独立于 RDS 的数据的实时副本。正式地,非 RDS 副本被记录为旨在用于短期迁移目的,但它似乎实际上并不限于此应用程序。此功能的可用性是我不再拒绝允许我的某些公司服务使用 RDS 的主要原因。

在没有至少一个实时副本作为备用副本的生产环境中运行,以防万一主节点发生故障,对我来说,这是不可想象的,并且在对主节点的影响为零的情况下运行报告查询的能力至少是一种奖励。我拥有的每台生产服务器都至少有一个副本,有时甚至不止一个副本。

我不知道这是否能直接满足您的需求,但无论如何我建议您拥有一个。


ETA:我想到的一个值得一提的后续想法是,虽然只读副本通常与主副本具有相同的表定义,但可以根据需要以不同的方式声明这些表上的索引。在我的一个系统上,我有一个数百万行的表,其中主很少一次对多于一行做任何事情,但副本进行广泛的排序、排序和分组,因此副本具有更多的索引在与主人同一张桌子上。这给了我可以说几乎是过度索引的奢侈和灵活性,但主程序不必在处理实时事务时花费必要的时间来维护所有这些不同的索引。如果必须在主服务器上定义这些相同的索引,它们可能会增加不合理的开销......更不用说我可以随时向副本上的表添加额外的索引,而不会影响实时系统。在大多数情况下,我也从副本进行大部分备份。