作者:伊布拉尔·艾哈迈德(Ibrar Ahmed)在2018年7月加入Percona。在加入Percona之前,Ibrar曾在EnterpriseDB担任高级数据库架构师10年。Ibrar拥有18年的软件开发经验。Ibrar在PostgreSQL上写了多本书。
译者:魏波,中国PG分会培训认证执行总监、资深数据库工程师,十多年的数据库运维管理及培训经验,掌握PostgreSQL架构部署、性能优化等,致力于推动PostgreSQL在中国的发展。
由于数据量巨大,因此可伸缩性已成为数据库领域中最热门的主题之一。可伸缩性可以水平或垂直实现。垂直可伸缩性意味着向现有节点添加更多资源/硬件,以增强数据库存储和处理更多数据的能力,例如,向现有节点添加CPU,内存或磁盘。每个DBMS引擎都通过改进锁定/互斥机制和并发性,从而可以更有效地使用新添加的资源,从而提高了垂直可伸缩性的能力。数据库引擎提供配置参数,这有助于更有效地利用可用的硬件资源。
由于硬件成本以及在现有节点中添加新硬件的限制,因此并非总是可以添加新硬件。因此,需要水平可伸缩性,这意味着向现有网络节点添加更多节点而不是增强现有节点的功能。
与垂直可伸缩性相反,水平可伸缩性难以实施。这需要更多的开发工作。
PostgreSQL为垂直可伸缩性和水平可伸缩性提供了相当丰富的功能集。它支持具有多个处理器和大量内存的计算机,并提供配置参数来管理这些资源的使用。PostgreSQL中并行性的新功能使垂直可伸缩性更加突出,但也不缺乏水平可伸缩性。复制是水平可伸缩性的关键支柱,PostgreSQL支持单向主从复制,这足以满足许多用例。
数据库复制
数据库复制将数据复制到其他服务器上,并将其存储在多个节点上。在此过程中,数据库实例从一个节点转移到另一节点,并进行了精确的复制。数据复制用于提高数据可用性,这是HA的一项关键功能。通常有一个完整的数据库实例,或者一些经常使用或所需的对象被复制到另一台服务器。复制提供了数据库的多个一致副本,它不仅提供了高可用性,而且还提高了查询性能。
同步复制
将数据写入磁盘时,有两种策略:“同步”和“异步”。同步复制意味着同时将数据写入主服务器和从服务器,换句话说,“同步复制”意味着提交等待远程端的写入/刷新。同步复制用于具有即时故障转移要求的高端事务环境中。
异步复制
异步意味着首先将数据写入主机,然后再复制到从机。在崩溃的情况下,可能会发生数据丢失,但是异步复制提供的开销很小,因此在大多数情况下是可以接受的。它不会使主机负担过重。与同步复制相比,从主数据库到从数据库的故障转移需要更长的时间。
简而言之,同步和异步之间的主要区别在于何时将数据写入主服务器和从服务器。
单主复制
单一主复制意味着仅允许在单个节点上修改数据,并将这些修改复制到一个或多个节点。只能在主节点上进行数据更新和插入。在这种情况下,应用程序需要将流量路由到主服务器,这会增加应用程序的复杂性。因为只有一个主节点负责写入数据,所以没有冲突的机会。在大多数情况下,单主复制对于应用程序来说就足够了,因为配置和管理起来并不那么复杂。但在某些情况下,单主复制是不够的,您需要多主复制。
多主复制
多主复制意味着有多个节点充当主节点。数据在节点之间复制,并且可以在一组主节点上进行更新和插入。在这种情况下,数据有多个副本。该系统还负责解决并发更改之间发生的任何冲突。有多个主复制有两个主要原因。一个是高可用性,第二个是性能。在大多数情况下,某些节点专用于密集写入操作,而某些节点专用于某些节点或用于故障转移。
多主复制的优缺点
优点:
缺点:
正如我们已经讨论的那样,在大多数情况下,单主复制就足够了,强烈建议这样做,但是在某些情况下,仍然需要多主复制。PostgreSQL具有内置的单主复制,但不幸的是,PostgreSQL主版本中没有多主复制。有一些可用的多主复制解决方案,其中一些以应用程序的形式出现,而有些则是PostgreSQL分支。这些派生有其自己的小型社区,并且大多由单个公司管理,而不由PostgreSQL国际社区管理。
这些解决方案有多种类别,包括开放源/封闭源,优先级,免费和付费。
1.BDR(双向复制)
BDR是多主复制解决方案,并且具有不同的版本。BDR的早期版本是开放源代码,但其最新版本是封闭源代码。这个解决方案是由2ndQuadrant开发的,也是迄今为止最优雅的多主解决方案之一。BDR提供异步多主逻辑复制。这基于PostgreSQL逻辑解码功能。 由于BDR应用实质上是在其他节点上重播事务,因此如果正在应用的事务与在接收节点上提交的事务之间存在冲突,则重播操作可能会失败。
2.xDB
EnterpriseDB用Java开发了自己的双向复制解决方案,称为xDB。它基于自己的协议。因为它是一个封闭源代码的解决方案,所以没有设计信息为外界所知。
3.PostgreSQL XC / XC2
PostgreSQL-XC由EnterpriseDB和NTT开发。它是一个同步复制解决方案。Postgres-XC是一个开源项目,旨在提供可写扩展、同步、对称和透明的PostgreSQL集群解决方案。多年来,我从未在EnterpriseDB和NTT上看到PostgreSQL-XC的大量开发。目前,华为正在为此努力。对于OLAP,已经报告了一些性能提升,但不适用于TPS。
4.PostgreSQL XL
它是PostgreSQL-XC的一个分支,目前受2ndQuadrant支持。它会落后于社区 PostgreSQL的版本迭代。据了解,它基于PostgreSQL 10.6,它与PostgreSQL最新版本PostgreSQL-12不兼容。我们知道它是基于PostgreSQL-XC的,当我们谈论OLAP时,它非常好,但不太适合高TPS。
注意:所有PostgreSQL XC / XC2 / XL都被认为是“ PostgreSQL衍生软件”,与PostgreSQL的当前开发没有同步。
5.Rubyrep
它是阿恩.特莱曼(Arndt Lehmann)开发的异步主/主复制。它声称具有最简单的配置特征,并且可以跨平台(包括Windows)运行。它始终在两台服务器上运行,在Rubyrep术语中分别称为“左”和“右”。因此,将其称为“2-master”设置而不是“ multi-master”会更符合其特点。
注意:–就开发而言,该项目在过去三年中一直没有开展。
6.Bucardo
Bucardo 是End Point 公司的Jon Jensen和Greg Sabino Mullane开发的基于触发器的复制解决方案。Bucardo的解决方案已经存在了将近20年,最初设计为“惰性”异步解决方案,最终可以复制所有更改。有一个Perl守护程序,它监听NOTIFY请求并对其执行操作。表上发生的更改记录在表(bucardo_delta)中,并通知守护程序。守护程序通知控制器,该控制器启动一个子进程以同步表更改。如果存在冲突,则使用标准或自定义冲突处理程序进行处理。
单主机复制的大多数情况就足够了,并且已经观察到人们正在配置多主机复制并使他们的设计过于复杂。强烈建议设计系统,并尝试避免多主复制,而仅在没有其他方法的情况下使用它。原因有两个:第一,它使系统过于复杂且难以调试;第二,由于没有可用的社区维护的多主复制,因此您将无法从PostgreSQL社区获得支持。
原文链接:
https://www.percona.com/blog/2020/06/09/multi-master-replication-solutions-for-postgresql/
更多精彩内容,请关注以下平台、网站:
中国Postgre SQL分会官方公众号(技术文章、技术活动):
开源软件联盟PostgreSQL分会
中国Postgre SQL分会技术问答社区:
www.pgfans.cn
中国Postgre SQL分会官方网站:
www.postgresqlchina.com