坚不可摧的PostgreSQL,或如何为“开放” DBMS提供容错能力

互联网上充斥着有关如何构建容错PostgreSQL数据库管理系统的信息。但是,它不适用于大公司的任务,并且不能承受严格的企业标准。在为新的AIS OSAGO创建IT基础架构的项目中,我们不得不全力以赴解决这一难题。经过对许多解决方案的严格选择和测试后,我们找到了最佳的IT工具和方案集,以确保数据库的高可用性。我们分享我们得到的食谱。







最近,大型俄罗斯公司越来越多地寻求负担得起的存储解决方案。开源DBMS成为Oracle,SAP HANA,Sybase,Informix:PostgreSQL,MySQL,MariaDB等的竞争对手。西方巨头-阿里巴巴,Instagram,Skype-在其IT环境中使用它们已有很长时间了。



在俄罗斯汽车保险业者联盟(RSA)的项目中,Jet Infosystems正在为新的AIS OSAGO构建IT基础结构,开发人员使用了PostgreSQL DBMS。并且我们考虑了如何在发生硬件故障时确保最大的数据库可用性和最小的数据丢失。而且该解决方案的“纸上”描述看起来就像2 + 2一样简单,实际上,我们的团队不得不努力工作以实现容错能力。



PostgreSQL有几种故障转移群集工具。这些是Stolon,Patroni,Repmgr,Pacemaker + Corosync等。



我们选择Patroni是因为该项目是积极开发的,与类似的项目不同,它具有清晰的文档并且正日益成为数据库管理员的选择。



“汤套餐”的组成



Patroni是一组python脚本,用于自动将PostgreSQL数据库服务器的主角切换到副本。它还可以存储,修改和应用PostgreSQL DBMS本身的参数。事实证明,无需分别在每个服务器上保持PostgreSQL配置文件为最新。



PostgreSQL是一个开源的关系数据库。它已证明可以处理大型复杂的分析过程。



Keepalived-在多节点配置中,它用于在群集的当前正使用主要PostgreSQL节点角色的节点上启用专用IP地址。 IP地址是应用程序和用户的入口点。



DCS是分布式配置存储。Patroni使用它来存储有关群集组成,群集服务器的角色的信息,以及存储它自己的和PostgreSQL配置参数。本文将重点介绍etcd。



细微差别的实验



为了寻找最佳的容错解决方案,并且为了检验关于不同选项的操作的假设,我们创建了多个测试台。最初,我们考虑的解决方案与目标体系结构不同:例如,我们使用Haproxy作为PostgreSQL的主节点,或者DCS与PostgreSQL位于同一服务器上。我们组织了内部黑客马拉松,研究了Patroni在服务器组件故障,网络不可用,文件系统溢出等情况下的行为。也就是说,他们制定了各种故障方案。这些“科学研究”的结果是,形成了容错解决方案的最终体系结构。



美食IT菜



PostgreSQL中有服务器角色:primary-具有写入/读取数据能力的实例;副本-只读实例,与主实例不断同步。当PostgreSQL运行时,这些角色是静态的,并且如果具有主要角色的服务器发生故障,则DBA必须手动将副本角色提升为主要角色。



Patroni创建故障转移群集,也就是说,它将具有主要角色和副本角色的服务器组合在一起。万一发生故障,它们之间会自动进行角色转换。





上图显示了应用程序服务器如何连接到Patroni集群中的服务器之一。此配置使用一个主节点和两个副本,其中之一是同步的。通过同步复制,PostgreSQL的工作方式使得主数据库始终等待将更改写入到副本中。如果同步副本不可用,则主副本将不会对其自身写入更改,而是只读的。这是PostgreSQL的体系结构。为了“改变其性质”,使用了第二个副本-异步(如果不需要同步复制,则可以将自己限制为一个副本)。



当使用两个或多个副本并启用同步复制时,Patroni始终仅制作一个同步副本。如果主节点发生故障,Patroni将提高同步副本的级别。



下图显示了在工业企业解决方案中至关重要的其他Patroni功能-将数据复制到备份站点。





Patroni将此功能称为standby_cluster。它允许Ratroni群集在远程站点上用作异步副本。如果主站点丢失,Patroni群集将像主站点一样开始工作。



备份站点群集的节点之一称为备用领导者。它是主站点主节点的异步副本。备份站点群集的其余两个节点从备用领导者接收数据。这就是实现级联复制的方式,从而减少了技术站点之间的通信量。



Patroni集群应用程序的组成



启动后,Patroni将创建一个单独的TCP端口。向该端口发出HTTP请求后,您可以了解群集的哪个节点是主节点,哪个是副本。





在keepalived中,我们指定了一个小的自制脚本作为监视Patroni TCP端口的监视对象。该脚本需要HTTP GET 200响应,响应的群集节点是主节点,在该节点上keepalived启动专用于连接到群集的IP地址。



如果将第二个keepalived实例配置为等待来自同步副本的HTTP GET 200响应,则在同一群集节点上的keepalived将会启动另一个专用IP地址。应用程序可以使用此地址从数据库读取数据。例如,此选项对于准备报告很有用。



由于Patroni是一组脚本,因此它在每个节点上的实例不会彼此直接“通信”,而是为此使用配置存储。我们将etcd用作它,这是Patroni本身的法定人数-当前的主节点会不断更新etcd存储库中的密钥,表明它是领先者。其余的群集节点会不断读取此密钥,并“理解”它们是副本。 etcd服务位于专用服务器上,数量为3或5。这些服务器之间的etcd存储中的数据同步是通过etcd服务本身执行的。



在我们的实验过程中,我们发现etcd服务需要移到单独的服务器上。首先,etcd对网络延迟和磁盘子系统响应非常敏感,并且不会加载专用服务器。其次,如果Patroni群集的节点之间可能存在网络分离,则可能会发生“大脑分裂”-将出现两个主节点,彼此之间将一无所知,因为etcd群集也将“分解”。



练习检查



在为AIS OSAGO构建IT基础架构的项目规模上,实现PostgreSQL的容错能力是将开放式DBMS“植入”公司IT领域的任务之一。其次是将PostgreSQL集群与备份系统集成,基础架构监视和信息安全以及备份站点的可靠数据安全性的相关问题。这些方向都有其自身的陷阱和绕过它们的方法。我们已经写过其中之一-我们讨论了使用企业解决方案进行PostgreSQL备份





经我们在展台上思考和测试的PostgreSQL容错架构已在实践中证明了其有效性。该解决方案已准备好“继承”各种系统和逻辑故障。现在,它可以在10个高负载的Patroni集群上运行,并且可以承受PostgreSQL每小时​​处理数百GB数据的负载。



作者:Dmitry Erykin,Jet Infosystems计算系统的工程师设计师



All Articles