快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

调整RDS数据库性能和ElastiCache

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

RDS数据库或SQL数据库通常只能垂直缩放。垂直扩展数据库意味着增加数据库资源,但是您仍然只有一个数据库。如果数据库的性能不足,则必须提高基础硬件的性能:

请记住,您不能无限制地增加资源。最大的RDS数据库实例类型之一具有32个核心和244 GiB内存。相比之下,像S3或NoSQL-DynamoDB这样的数据库可以不受限制地水平扩展。

本文摘录自 Amazon Web Services in Action,第二版。 >

启动RDS数据库时,请选择实例类型。实例类型定义虚拟机的计算能力和内存(例如,启动EC2实例时)。选择更大的实例类型可以提高RDS数据库的计算能力和内存。
您可以在CloudFormation模板,CLI,管理控制台或AWS开发工具包的帮助下更改实例类型。如果性能不够好,您可能需要增加实例类型。下面的清单显示了CloudFormation片段,该片段创建具有两个虚拟核心和7.5 GB内存的MySQL数据库类型。

由于数据库必须读写数据到磁盘,因此I/O性能对于数据库的整体性能很重要。RDS提供了三种不同类型的存储,您可能已经从数据库中了解到。块存储服务EBS:

  1. 通用(SSD)。
  2. 提供的IOPS(SSD)。
  3. 磁性的。

您应该为生产工作负载选择通用(SSD)或预配的IOPS(SSD)存储。这些选项与可用于虚拟机的块存储服务EBS完全相同。如果需要保证较高的读取或写入吞吐量,则应使用预配置的IOPS(SSD)选项。通用(SSD)选项提供适中的基线性能并具有爆发能力。通用(SSD)的吞吐量取决于初始化的存储大小。如果您需要以低成本存储数据,或者不需要以可预测的高性能方式访问数据,则可以选择磁存储。下一个清单显示了如何在数据库的帮助下启用通用(SSD)存储。 CloudFormation模板。

在特殊情况下,SQL数据库也可以水平扩展。可以通过添加其他数据库实例以进行读取复制来水平扩展具有许多读取请求的数据库。如图1所示,对数据库的更改被异步复制到其他只读数据库实例。可以将读取请求分配在master数据库及其读取复制数据库之间,以提高读取吞吐量。

通过复制调整读取性能只有在应用程序生成许多读取请求而很少写入请求时才有意义。幸运的是,大多数应用程序读取的内容超过了编写的内容。

Amazon RDS支持MySQL,MariaDB和PostgreSQL数据库的读取复制。要使用读取复制,您需要为数据库启用自动备份。

警告:启动RDS只读副本将产生费用。如果要查找当前的每小时价格,请参见此处。

从本地计算机执行以下命令以创建一个只读数据库。将$ DBInstanceIdentifier替换为以下值:

 

RDS在后台自动触发以下步骤:

  1. 从源数据库(也称为主数据库)创建快照。
  2. 基于该快照启动新数据库。
  3. 激活主数据库和只读数据库之间的复制。
  4. 为向读取复制数据库的SQL读取请求创建端点。

成功创建只读复制数据库后,它可以回答SQL读取请求。使用SQL数据库的应用程序必须支持使用只读复制数据库。例如WordPress,默认情况下不支持使用只读副本,但是您可以使用名为HyperDB的插件来执行此操作;配置有些棘手,但是我们将跳过这一部分。您可以在此处获得更多信息。创建或删除只读副本不会影响主数据库的可用性。

RDS支持在Aurora,MySQL,MariaDB和PostgreSQL数据库的区域之间进行读取复制。例如,您可以将数据从北弗吉尼亚州的数据中心复制到爱尔兰的数据中心。此功能的三个主要用例是:

  1. 在不太可能发生整个区域中断的情况下,将数据备份到另一个区域。
  2. 将数据传输到另一个区域,以便能够以较低的延迟回答读取请求。
  3. 将数据库迁移到另一个区域。

在两个区域之间创建读取复制会产生额外的费用,因为您必须为传输的数据付费。

如果您创建一个只读复制数据库以将数据库从一个区域迁移到另一个区域,或者您需要在数据库上执行繁重且负载密集的任务(例如添加索引),有助于将工作负载从主数据库切换到只读数据库。只读副本必须成为新的主数据库。带有RDS的Aurora,MySQL,MariaDB和PostgreSQL数据库可以将只读数据库升级为主数据库

以下命令将您在本节中创建的只读复制数据库升级为独立的master数据库。请注意,读取复制数据库将执行重新启动,并且在几分钟内将不可用:

名为RDS的数据库实例在从读取复制数据库到主数据库的转换成功后接受写请求。

想象一下一个关系数据库,该关系数据库用于流行的手机游戏,其中玩家的得分和排名经常更新和读取。对数据库的读写压力非常高,就像对数百万的得分排名一样通过扩展数据库来减轻压力可能有助于负载,但不一定会增加延迟或成本,而且关系数据库比缓存数据存储更昂贵。

许多游戏公司采用的一种行之有效的解决方案是使用内存数据存储(例如Redis)来通过玩家和游戏元数据进行缓存和排名。他们还没有直接从关系数据库中读取和排序排行榜,而是通常在Redis中使用Redis Sorted Set来存储和使用内存游戏排行榜,Redis Sorted Set会在插入后根据Sorted Set得分参数自动对数据进行排序。得分值可以包括游戏中的实际玩家排名或玩家得分。

由于数据驻留在内存中并且不需要大量的计算即可产生排序,因此信息的检索速度非常快,几乎没有理由从关系数据库中查询此信息。任何其他需要大量读取的游戏和玩家元数据(例如玩家资料,游戏级别信息等)也可以缓存在此内存层内,从而从大量读取流量中释放其数据库。

在此解决方案中,关系数据库和内存层都存储对排行榜的更新,其中一个充当主数据库,另一个充当工作和快速处理层。对于缓存数据,他们可能会采用各种缓存技术来保持缓存的数据新鲜,我们将在后面进行回顾。图2显示了缓存位于应用程序和数据库之间的位置。

缓存具有多种好处:

  • 可以从缓存层提供读取流量,从而释放数据存储上的资源,即用于写入请求。
  • 由于缓存层的响应速度比数据存储快,因此它还可以加快应用程序的速度。
  • 您可以缩小数据存储的大小,这可能比缓存层贵。

大多数缓存层都驻留在内存中,这就是为什么它们很快的原因。缺点是您可能会由于硬件缺陷或重新启动而随时丢失缓存数据。有了Redis,的可选故障转移支持。如果节点发生故障,则将副本节点选为新的主节点,并且已经拥有数据的副本。始终将数据副本保存在具有磁盘持久性的主数据存储区中,例如在移动游戏示例中的关系数据库中。

根据您的缓存策略,您可以实时或按需填充缓存。在移动游戏示例中,按需表示意味着如果排行榜不在高速缓存中,则应用程序将询问关系数据库并将结果放入高速缓存。对高速缓存的任何后续请求都将导致高速缓存命中,这意味着已找到数据在缓存值上的TTL(生存时间)值的持续时间到期之前,这是正确的。此策略的另一个术语是”从主要数据存储区延迟加载数据”。我们还可以在后台运行一个cronjob,每分钟从关系数据库中查询排行榜,并将结果放入缓存中。

惰性加载策略(按需获取数据)的实现方式如下:

  1. 应用程序将数据写入数据存储。
  2. 稍后,如果应用程序要读取数据,则会向缓存层发出请求。
  3. 缓存层不包含数据。
  4. 应用程序直接从数据存储中读取并将读取的值放入缓存中,并将该值返回给客户端。
  5. 稍后,如果应用程序想要再次读取数据,它将向缓存层发出请求并找到该值。

此策略存在问题。如果在缓存中更改了数据该怎么办?缓存仍然包含旧值;设置适当的TTL值对于确保缓存有效性至关重要。假设您对缓存应用了TTL五分钟数据。这意味着您要与主数据库最多接受五分钟的不同步数据。了解基础数据的更改频率以及用户产生不同步数据的体验所带来的影响是识别以下情况的第一步应用适当的TTL值。一些开发人员常犯的一个错误是假设应用几秒钟的TTL TTL使其不值得拥有一个缓存。请记住,在这几秒钟之内,可以从后端消除数百万个请求,从而加快了速度您的应用程序并减轻了后端数据库的压力。使用和不使用缓存以及各种缓存方法对应用程序进行性能测试都可以帮助您微调实现。

总而言之,生存时间(TTL)越短,基础数据存储库上的负载就越大。 TTL越高,数据获取的数据就越多。
以不同的方式实施直写策略(预先缓存数据)来解决同步问题:

  1. 应用程序将数据写入数据存储和缓存中(或缓存被异步填充,即在cronjob,AWS Lambda函数或应用程序中)。
  2. 稍后,如果应用程序要读取数据,则会向缓存层发出请求。
  3. 缓存层包含数据。
  4. 该值返回给客户端。

此策略存在问题。如果缓存不足以容纳所有数据,该怎么办?缓存是内存中的,并且您的数据存储磁盘容量通常大于缓存的内存容量。当缓存到达可用内存时,它将逐出数据或停止接受新数据。在这两种情况下,该应用程序都无法正常工作。在游戏应用程序中,全局排行榜始终适合高速缓存。想象一下排行榜的大小为4 KB,高速缓存的容量为1 GB(1,048,576 KB)。关于团队排行榜?您只能存储262,144(1,048,576/4)个排行榜,而如果您的团队数量超过该排行榜,则会遇到容量问题。

下图比较了这两种缓存策略。

清除数据时,缓存需要决定应删除哪些数据。一种流行的策略是逐出最近最少使用(LRU)的数据。这意味着缓存的数据包含有关上次访问时间的元信息。如果将LRU逐出,则选择时间戳最小的数据进行逐出。

缓存通常使用键值存储来实现。键值存储不支持SQL等复杂的查询语言。它们支持基于键(通常是字符串)或专用命令来检索数据,即有效地提取排序后的数据。

想象一下您的关系数据库中,您有一个用于手机游戏的玩家表格。最常见的查询之一是检索前十名玩家。幸运的是,这款游戏很受欢迎。但这带来了技术挑战。如果许多玩家查看排行榜,则数据库将变得繁忙,从而导致高延迟甚至超时。您必须想出一个减少数据库负载的计划。如您所知,缓存可以提供帮助。您应该采用哪种技术进行缓存?您有几种选择。

对Memcached或Redis可以采用的一种方法是,可以将SQL查询的结果存储为字符串值,并将SQL语句存储为键名。除了使用整个SQL查询作为键之外,还可以使用诸如md5或sha256之类的哈希函数对字符串进行哈希处理,以优化存储和带宽(1),如图4所示。在应用程序将查询发送到数据库之前,它将以SQL查询为键向缓存层询问数据(2)。如果高速缓存中不包含键的数据(3),则SQL查询发送到关系数据库(4)。然后,将结果(5)使用SQL查询作为键(6)存储在高速缓存中。下次应用程序要执行查询时,它将询问现在包含缓存表(8)的缓存层(7)。

要实现缓存,您只需要知道缓存项的键即可。这可以是SQL查询,文件名,URL或用户ID。您拿走钥匙,然后向缓存询问结果。如果未找到结果,请再次致电知道真相的基础数据存储。

使用Redis,您还可以使用其他选项将数据存储在各种其他数据结构中,例如Redis SortedSet。如果数据存储在Redis SortedSet中,则检索排名数据的效率很高。您可以存储球员及其得分并按得分排序。SQL查询的等效命令为:

这将返回名为” player-scores”的排序集中的十个玩家。
内存中键值存储的两个最受欢迎的实现是Memcached和Redis。表1比较了它们的功能。

Amazon ElastiCache提供托管的Memcached和Redis集群。托管的内容包括:

  • 安装:AWS为您安装了该软件并增强了基础引擎。
  • 管理:AWS为您管理Memcached/Redis,并为您提供了通过参数组配置集群的方法。 AWS还可以检测并自动执行故障转移(仅限Redis)。
  • 监控:AWS为您发布指标到CloudWatch。
  • 修补:AWS在可自定义的时间范围内执行安全升级。
  • 备份:AWS可以选择在可自定义的时间窗口(仅限Redis)中备份数据。
  • 复制:AWS可以选择设置复制(仅限Redis)。

相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1922638