跳转到主要内容
SEO Title
Setting up PostgreSQL Multi-master Replication: Made Easy

多主复制是一种允许多个节点接受写入请求的方法。在本文中,您将了解如何使用 BDR 设置 PostgreSQL 多主复制。这是本文的大纲。

目录

  • 什么是复制?
  • 单主复制
  • 什么是多主复制?
  • PostgreSQL 多主复制
  • 使用 BDR 设置 PostgreSQL 多主复制的步骤
    • 第 1 部分:初始配置
    • 第 2 部分:创建单个 BDR 节点
    • 第 3 部分:创建另一个 BDR 节点
    • 第 4 部分:配置 HAProxy
    • 第 5 部分:将 PgBouncer 与 HAProxy 结合使用
    • 第 6 部分:节点切换
  • 结论

什么是复制?


复制是将数据从一个数据库服务器复制到另一个数据库服务器。源服务器一般称为主服务器或主服务器。接收数据库服务器也称为副本或从属服务器。

复制通常用于提高性能、创建备份、可扩展性并减少主服务器上的负载。对主服务器所做的更改会传递到从服务器。这些更改可以同时复制,也可以分批复制。如果它在两个服务器中同时发生,则称为同步复制。如果它分批发生,则称为异步。

复制允许您在不影响主节点操作的情况下执行分析。您可以使用复制进行横向扩展,尤其是在写入次数较少而读取次数较多的情况下。

单主复制


在单主多从场景中,只允许一台服务器(主服务器)对数据进行更改。其他服务器不接受来自除主服务器之外的任何地方的写查询。

什么是多主复制?


考虑有几个可以更新数据的连接数据库服务器的情况。在这种情况下,组中的一个成员所做的更改会波及所有其他成员。这可以通过多主复制系统来完成。因此,多主复制为该过程添加了一个双向元素。

多主复制允许多个节点接受写入查询,并且所有涉及的节点都包含相同的数据。多主复制的主要目的当然是高可用性。当主服务器发生故障时,无需等待物理备用服务器被提升。

建议 PostgreSQL 用户不要通过单主复制就足够的多主复制来使设计复杂化。这是因为多主复制使系统变得复杂和混乱。例如,如果您的应用程序具有增量字段并且两个节点没有集成此因素,则可能会导致冲突。

PostgreSQL 多主复制

PostgreSQL Multi-Master Replication Solution

虽然 PostgreSQL 中内置了单主复制,但多主复制没有。 有一些 PostgreSQL 分叉由小公司和社区管理。

目前有一种流行的产品在 PostgreSQL 中支持多主复制。 它被称为由 2ndQuadrant 创建的双向复制BDR 的早期版本是开源的,但不是最新版本。

请注意,在事务速度和防止数据冲突之间进行权衡时,BDR 更喜欢低延迟,允许出现一些冲突(如果不可避免)并在以后解决它们。

使用 BDR 设置 PostgreSQL 多主复制的步骤


第 1 部分:初始配置


在安装 BDR 和 pglogical 插件(充当逻辑复制解决方案)后的此步骤中,您修改 postgresql.conf 和 pg_hba.conf 文件,然后重新启动服务。

Step1:安装 BDR 和 pglogical 插件。

第 2 步:将 postgresql.conf 配置为这些值。

wal_level = logical
shared_preload_libraries= ‘pg_logical, bdr’
track_commit_timestamp= ‘on’  # This is necessary for conflict resolution.


第 3 步:创建具有超级用户权限的用户来管理 BDR 连接。

CREATE USER my_user WITH SUPERUSER REPLICATION PASSWORD ‘my_password’;


第 4 步:通过添加这些行来更改 pg_hba.conf 文件。

host   all         bdr   10.20.30.40/24   md5
host   replication bdr   10.20.30.40/24   md5


第 5 步:将用户添加到 .pgpass 文件。

hostname:port:database:my_user: my_password


第 6 步:重新启动 Postgresql。

第 2 部分:创建单个 BDR 节点


将主机 my_host1 上的 my_db 上的 BDR 激活为 my_user。

第 1 步:创建扩展。

CREATE EXTENSION bdr CASCADE; # CASCADE also creates the pglogical extension.


第 2 步:使用 bdr.create_node 函数初始化当前节点。

SELECT bdr.create_node
( node_name:= ‘initail_node’, 
local_dsn:= ‘dbname=my_db host= my_host1 user=my_user’);


第 3 步:使用 bdr.create_node_group 函数创建 BDR 集群定义。

SELECT bdr.create_node_group(node_group_name:='the_node_group');


第 4 步:使用 bdr.wait_for_join_completion 函数等待全部完成。

SELECT bdr.wait_for_join_completion();


第 3 部分:创建另一个 BDR 节点


第 1 步:创建 BDR 扩展。

CREATE EXTENSION bdr CASCADE;


第 2 步:使用 bdr.create_node 函数初始化当前节点。

SELECT bdr.create_node
( node_name:= ‘next_node’,
 local_dsn:= ‘dbname=my_db host= my_host2 user=my_user’);


第 3 步:使用 bdr.join_node_group 函数创建 BDR 集群定义。

SELECT bdr.join_node_group
(join_target_dsn:= ‘dbname=my_db 
host= my_host1 user=my_user’, wait_for_completion:=True);


第 4 部分:配置 HAProxy


HAProxy 是一个提供高可用性的开源代理软件。它会自动将流量引导到任何在线节点。为此,您需要先安装 HAProxy。

第 1 步:修改 haproxy.cfg 文件的全局部分。

global
    state socket /var/run/haproxy/sock level admin 
# This allows us to get information and send commands to HAProxy.


第 2 步:修改 haproxy.cfg 文件的 bk_db 部分。

stick-table type ip size 1
stick on dst
server bdr_initial_node my_host1: 5432 check
server bdr_next_node my_host2: 5432 backup check


步骤 3:通过触发 HAProxy 重新加载配置文件。

sudo systemctl reload haproxy


第 5 部分:将 PgBouncer 与 HAProxy 结合使用

PgBouncer 是 PostgreSQL 的连接池。在 PgBouncer 的帮助下,PostgreSQL 可以与更多的客户端进行交互。这对于事务管理来说是必不可少的。当 HAProxy 重定向流量时,PgBouncer 允许交易完成。以下步骤需要安装 PgBouncer。

第 1 步:修改 ft_postgresql 部分的 haproxy.cfg 文件。

frontend ft_postgresql
    bind *: 5433
    default_backend bk_db


第 2 步:更改 pgbouncer.ini 文件中的数据库部分以包含以下行。

* = host= proxy_server port= 5433


修改 pgbouncer 部分。

listen_port = 5432


第 3 步:重新启动 HAProxy,然后重新启动 PgBouncer。

第 6 部分:节点切换


我们正在将连接从初始节点移开。首先,我们使用 HAProxy 禁用 bdr_initial_node,以便不会向它发送新连接。我们将 RECONNECT 命令传递给 pgbouncer 以确保在当前事务之后重新连接。现在 HAProxy 将导致重新连接到第二个服务器。然后在进行更改后,再次启用初始服务器。

第 1 步:在 HAProxy 中禁用 initial_node。

echo “disable server bk_db/bdr_initial_node” |  socat /var/run/haproxy/sock –


步骤 2:交易完成后,PgBouncer 应该重新连接并等待连接重新建立。

psql –h proxy_server –U pgbouncer pgbouncer –c “RECONNECT”
psql –h proxy_server –U pgbouncer pgbouncer –c “WAIT_CLOSE”


第 3 步:在重新启用之前处理初始节点。

第 4 步:再次重新启用初始节点。

echo “enable server bk_db/bdr_initial_node” |  socat /var/run/haproxy/sock –


结论


上述步骤绝不是完整的。在处理序列、安装、在线版本之间的升级以及测试故障转移过程时,您会遇到一些复杂情况。您可以在 PostgreSQL 12 High Availability Cookbook 中找到完整而全面的指南。这本书不仅详细介绍了 PostgreSQL 多主机复制,还详细介绍了设计高可用性服务器的其他几种方法。

无论如何,PostgreSQL多主复制需要大量的技术理解和学习。但 Hevo 可以帮助您应对这些挑战。 Hevo Data 是一种无代码数据管道,可以帮助您实时复制数据,而无需编写任何代码。 Hevo 作为一个完全托管的系统,提供了一个高度安全的自动化解决方案,使用其交互式 UI 只需单击几下即可帮助执行复制。

原文:https://hevodata.com/learn/postgresql-multi-master-replication/

本文:https://jiagoushi.pro/node/2154

Tags