【数据库架构】设置 PostgreSQL 多主复制:变得简单
多主复制是一种允许多个节点接受写入请求的方法。在本文中,您将了解如何使用 BDR 设置 PostgreSQL 多主复制。这是本文的大纲。
目录
- 什么是复制?
- 单主复制
- 什么是多主复制?
- PostgreSQL 多主复制
- 使用 BDR 设置 PostgreSQL 多主复制的步骤
- 第 1 部分:初始配置
- 第 2 部分:创建单个 BDR 节点
- 第 3 部分:创建另一个 BDR 节点
- 第 4 部分:配置 HAProxy
- 第 5 部分:将 PgBouncer 与 HAProxy 结合使用
- 第 6 部分:节点切换
- 结论
什么是复制?
复制是将数据从一个数据库服务器复制到另一个数据库服务器。源服务器一般称为主服务器或主服务器。接收数据库服务器也称为副本或从属服务器。
复制通常用于提高性能、创建备份、可扩展性并减少主服务器上的负载。对主服务器所做的更改会传递到从服务器。这些更改可以同时复制,也可以分批复制。如果它在两个服务器中同时发生,则称为同步复制。如果它分批发生,则称为异步。
复制允许您在不影响主节点操作的情况下执行分析。您可以使用复制进行横向扩展,尤其是在写入次数较少而读取次数较多的情况下。
单主复制
在单主多从场景中,只允许一台服务器(主服务器)对数据进行更改。其他服务器不接受来自除主服务器之外的任何地方的写查询。
什么是多主复制?
考虑有几个可以更新数据的连接数据库服务器的情况。在这种情况下,组中的一个成员所做的更改会波及所有其他成员。这可以通过多主复制系统来完成。因此,多主复制为该过程添加了一个双向元素。
多主复制允许多个节点接受写入查询,并且所有涉及的节点都包含相同的数据。多主复制的主要目的当然是高可用性。当主服务器发生故障时,无需等待物理备用服务器被提升。
建议 PostgreSQL 用户不要通过单主复制就足够的多主复制来使设计复杂化。这是因为多主复制使系统变得复杂和混乱。例如,如果您的应用程序具有增量字段并且两个节点没有集成此因素,则可能会导致冲突。
PostgreSQL 多主复制
虽然 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/
- 790 次浏览