[占位符]

我们的基础设施我该怎么挣钱啊内性能调优的Postgres

在squarespace,边缘球队管理 我该怎么挣钱啊 基础设施,它可以处理数以百万计的客户使用SSL证书的生命周期。 ESTA带给我们的最大用户之一 让我们来加密,一个免费,自动化,和开放的证书颁发机构(CA)。我们使用PostgreSQL作为持久性存储我们的SSL相关的数据。 Postgres的是由一个内存中缓存层更快的检索数据的当用户请求它门前。

几个月前,我们开始注意到比平常一些错误和警告和警报的更高correspondiente从我们的我该怎么挣钱啊基础设施的到来。经过调查,我们发现大多数的这些错误和警告都涉及到数据库操作:连接超时,高查询响应延迟,等等。

在squarespace,每个小组负责通过他们的服务所产生的工程警报和随时待命,为那些警报。所以我们开始发现什么是生病我们的系统和剥夺我们我们宝贵的睡眠!这篇博客是我们没有提高我们的数据层的性能,并减少错误和来自数据库的警告工作的总结。

工作的高度概括做

  • 分裂读取初级和次级数据库之间/写操作。

  • 调整参数,如数据库连接数,超时时间,重试次数,等等。

  • 增加了新的指标来利用的Postgres' 仅索引 扫描。

  • 用于读取并从数据库编写单独的服务。

  • 有效地删除了非常大的未使用表中的数据。


我们的架构的Postgres

我们在同一时间跨两个数据中心运行我们的我该怎么挣钱啊服务,只有一个“积极的”。我们的Postgres复制跨两个数据中心那些主/辅关系,其中活跃的数据中心主机主实例Postgres的本地操作。辅助节点位于两个数据中心。

主节点是唯一的节点有能力接受的写操作,这意味着你五月Postgres的所有SQL命令执行反对。所有的次级是设置 双机热备 模式,这意味着你可能会遇到只读查询对付他们。

从辅助数据库读

我们做的第一件事是开关为所有读中学的Postgres实例。在原来的设置,数据库我们必须引导到位于活动数据中心的主数据库中所有我们的操作。我们改变了我们的我该怎么挣钱啊服务读取配置数据库从活动数据中心辅助节点阅读。莫非我们从备用数据中心中存在的问题的情况下,在活动数据中心的数据库实例读也ESTA的意思。

调整和调整的连接参数高性能影响

我们走过去,我们用它来校准我们的Postgres的读/写操作,并确定和改变,可能会导致更好的资源利用率,增加交易成功的数量的那些配置参数:

  1. 一些交易,我们标记为只读。 我们使用优秀 hikaricp 连接池工具,用于管理到Postgres连接。标志着hikaricp只读交易启用连接池的更有效使用,并在通过该连接池执行的所有读取操作较低的延迟效果。

  2. 我们增加了并发连接数到数据库。 操作上每个连接的过程模型poststoneware。它创建并致力过程(而不是一个线程)为你打开它的每个连接。这比维持一个线程或每个连接协程等车型更贵。创建新的进程或拆除现有的CPU和RAM的时间超过较轻的替代品。尽管每个连接一个过程是相当耗费资源,我们已经发现了我们并没有在我们的最大化资源使用率数据库机。我们使用虚拟机托管Postgres的情况下,允许我们从我们使用之前增加连接的数量。因此我们调升连接的数量,以更好地利用现有资源。

  3. 我们增加了超时时间对服务不太严格的延迟要求。其结果是,服务可以示数之前等待更长的时间。不是所有的服务都在用户的请求和响应的关键路径。可以容忍不太重要的服务稍长等待时间而不牺牲正确性或数据的一致性。

  4. 增加我们的重试次数,某些服务。难道我们以前只重试不成功的查询十一点。遵循类似的推理#3以上的超时,我们试从1提高到3对某些服务的数量。这些服务ESTA意味着更多的比现在可能引发错误之前尝试十一点。


我该怎么挣钱啊

错误的改进:

errors-improvement.png

P95的改进如下:

read-p95-improvement.png

P99响应时间的改善:

response-time-p99-improvement.png

的连接数的改善:

number-of-connections-improvement.png

趁着仅索引扫描

我们使用poststoneware“ 解释[分析] 和非常有益的 pghero 工具找出我们最慢的查询。一旦我们有疑问,我们想提高的列表,我们就开始想出办法来优化这些查询的响应延迟。

当一个表进行操作,Postgres有做一个选择 仅索引扫描 我该怎么挣钱啊

为了利用仅索引扫描的优势,我们增加基于我们的查询模式新的索引。并且它确实使我们的查询的性能有很大的区别。

那查询了 COUNT(*) 在他们第看见最改进。像查询

选择从类别计数(*)
where 2nd_indexed_col >= 500 and 3rd_indexed_col >= 1000 ;

那里只有一个指标与主键(1st_indexed_col),可制成利用的指标,只有在以下列添加额外的索引扫描:

2nd_indexed_col,3rd_indexed_col;

与上一个复合索引 (2nd_indexed_col,3rd_indexed_col),查询可以执行根据表中的数据和尺寸大小要快好几个数量级。

之后,我们添加了新的指标,一些查询看到响应时间的幅度的改进3个数量级。关于看到很多查询速度慢10倍的响应时间的改善。

此外ESTA帮助我们减少了错误,由于连接超时(由于高等待时间):

connection-timeout-errors.png

从用户面临严重的时间码中分离出的非面向用户的代码

我们几个跑(微)服务作为我们的我该怎么挣钱啊基础设施的一部分。这些服务是至关重要的客户squarespace,因为他们在休息在我们的平台,并在运输过程中squarespace和用户之间提供安全和用户数据的安全性。 

这些服务的非平凡部分专用于收集各种指标和数据点监测服务的健康状况。该服务的其他一些地方运行后台任务包括任务,我们需要通常运行定期保持数据一致性和及时更新。我们决定从服务突出运行免于饥饿和资源潜力这些服务的机器也将一些对数据库进行操作,以只读模式更为关键和时间敏感的用户代码删除这些功能。

我们将所有后台任务,并与新的服务代码生成指标。我们提出的新的服务,以只从辅助Postgres的实例读取,同时保持附接到主Postgres的面向用户的代码。这些指标将写入到不同的数据库我该怎么挣钱啊' Postgres的,所以使得它只读不是一个问题。后台任务写出一个排队系统,这就是后来被其他服务倒掉,所以这是不是也只读了Postgres数据库使得新服务阻断剂。

修补的数据保留政策和实施

一些在我们的数据库中的表都有数十亿行的。每一行数据在一定的时间量之后变得过时。我们并不真的需要留住的数据已经变得过时。非常大的表意的一些疑问将需要更长的时间,从期望中的那些表返回数据之前。因此,我们实施了新的数据方案,从系统中删除旧的清除数据。

我们的老数据删除过程是不是很可扩展性,因为它试图在一天中的某个点,同时删除数据的行数太多。随着我们的新计划,我们现在删除分批更精细的数据。为了实现这个新的配料工艺,我们利用这将是填充了数据的批量消息队列有资格为删除从数据库中。消费过程中会流失的队列,并从这些数据库中的数据删除批次。减少数据库上的负载,我们限制消息队列生产者来处理在只读模式的二次Postgres的实例。消费者进程操作来与主实例POSTGRES作为其修饰(删除)数据库的内容。

在一个更平滑的数据删除进程的结果,并减少了一半我们的数据库大小这个新的数据保留政策的实施。

这些变化的查询时间,资源利用率,错误率P95,数据库大小等一些显着的改进导致

response-time-improvement.png

CPU负载的改进:

cpu-load-improvement.png

整体效果

所有这些变化帮助我们做出一个强大的和有效的数据基础设施层为我们的我该怎么挣钱啊。

我该怎么挣钱啊

  • 没有涉及到数据库连接或超时错误。数据库连接现在正在使用的非常有效地在我们的所有服务。 ADH ESTA上游服务戏剧效果取决于结果从数据层,这反过来又为我该怎么挣钱啊的帮助下为广大客户提供安全流畅的体验。

  • 减少PagerDuty警报。现在我们得到的显着减少经常分页。是随叫随到,现在是一个相当愉快的经历感谢所有这些我们在数据层所做的更改。

  • 的平均响应时间P95下降到〜50从200毫秒毫秒去了。上游服务现在迅捷看到来自数据库的响应。

  • 上的Postgres减少CPU的负荷,尤其是主实例。 CPU典型用法下来到10%以下,这意味着大量的CPU带宽留给意外出现在请求。

  • 数据库大小的一半归功于降低到新的数据保留政策的实施。

我该怎么挣钱啊

创建代码审查文化,第2部分:代码评审