在 CentOS 8 上配置 PostgreSQL 14 的主从复制,并设置 WAL 归档到特定路径 /home/postgres/archives
的步骤如下:
主服务器配置(主库)
-
配置 PostgreSQL:
- 编辑
postgresql.conf
文件:
vim /data/postgres/pgdata/postgresql.conf
- 设置以下参数:
listen_addresses = '*' # 允许所有地址连接 wal_level = replica # 设置 WAL 级别为 replica(默认的,不需要改 ) wal_log_hints = on #pg_rewind需要用到 max_wal_senders = 10 # 设置最大 WAL 发送者数量 archive_mode = on # 打开归档模式 archive_command = 'cp %p /home/postgres/archives/%f' # 设置 WAL 归档命令
- 编辑
-
配置客户端认证文件(pg_hba.conf):
- 允许从服务器连接到主服务器:
vim /data/postgres/pgdata/pg_hba.conf
- 添加以下行:
host replication replica_user slave_ip/32 trust
其中
replica_user
是复制用户,slave_ip
是从服务器的 IP 地址。 -
创建复制用户:
psql -c "CREATE USER replica_user REPLICATION LOGIN CONNECTION LIMIT 5;"
-
创建归档目录:
sudo mkdir -p /home/postgres/archives sudo chown postgres:postgres /home/postgres/archives sudo chmod 700 /home/postgres/archives
-
重启 PostgreSQL 服务:
sudo systemctl restart postgresql-14
从服务器配置(从库)
-
创建归档目录:
sudo mkdir -p /home/postgres/archives sudo chown postgres:postgres /home/postgres/archives sudo chmod 700 /home/postgres/archives
-
停止 PostgreSQL 服务:
sudo systemctl stop postgresql-14
-
清空数据目录:
- 确保
/data/postgres/pgdata/
目录是空的。
sudo rm -rf /data/postgres/pgdata/*
- 确保
-
使用 pg_basebackup 复制数据:
sudo -u postgres pg_basebackup -h master_ip -D /data/postgres/pgdata/ -U replica_user -v -P -R --wal-method=stream
其中
master_ip
是主服务器的 IP 地址。这里要加-R 会自动创建standby.signal文件 -
启动 PostgreSQL 服务:
sudo systemctl start postgresql-14
验证复制和归档状态
-
在主服务器上验证复制状态:
sudo -u postgres psql -c "SELECT * FROM pg_stat_replication;"
-
在从服务器上验证是否处于恢复模式:
sudo -u postgres psql -c "SELECT pg_is_in_recovery();"
-
检查 WAL 归档:
- 确认
/home/postgres/archive
目录中是否有 WAL 文件被归档。
- 确认
注意事项
- 确保归档目录
/home/postgres/archives
有足够的磁盘空间。 - 定期监控和管理归档目录,以防止其过度增长。
- 在生产环境中,考虑实施更复杂的归档策略。
这些步骤涉及基本的主从复制和 WAL 归档配置,具体需求和环境可能需要额外的调整和优化。
报错解决:
要修改 PostgreSQL 中已经创建的用户的连接限制数,您可以使用 ALTER USER
命令。在您的案例中,如果您想将 replica_user
用户的连接限制从当前值更改为 5,您应该执行以下命令:
ALTER USER replica_user CONNECTION LIMIT 5;
这个命令将更新用户 replica_user
的连接限制数为 5。请确保在执行此命令时您有足够的权限来修改用户设置。
如果您需要在 psql 命令行工具中执行此命令,可以使用以下格式:
psql -c "ALTER USER replica_user CONNECTION LIMIT 5;"
请确保在适当的数据库环境中执行这个命令,或者在命令中指定需要连接的数据库。
相关结果说明:
这个命令 SELECT * FROM pg_stat_replication;
在 PostgreSQL 中用于显示关于当前正在进行的复制进程的信息。这是一种监控和管理数据库复制状态的方法。输出的每一行代表一个活动的复制进程。我将解释每个字段的含义:
-
pid: 这是负责复制的进程的进程ID。
-
usesysid: 用户的系统ID。
-
usename: 正在进行复制的用户的名称。
-
application_name: 连接到数据库的应用程序的名称。
-
client_addr: 正在进行复制的客户端的IP地址。
-
client_hostname: 客户端的主机名(如果可用)。
-
client_port: 客户端连接到服务器的端口号。
-
backend_start: 后台进程开始的时间。
-
backend_xmin: 用于复制的事务ID的最小值(如果可用)。
-
state: 复制的当前状态,例如 “streaming” 表示正在进行流式复制。
-
sent_lsn, write_lsn, flush_lsn, replay_lsn: 这些是日志序列号(LSN),分别表示服务器发送的最后一个日志位置、写入的、刷新的和重放的。
-
write_lag, flush_lag, replay_lag: 这些字段表示写入延迟、刷新延迟和重放延迟。
-
sync_priority: 同步复制的优先级。
-
sync_state: 同步状态,例如 “async” 表示异步复制。
-
reply_time: 最后一次收到复制确认的时间。
在您提供的输出中,有两个复制进程正在进行,都是由用户 replica_user
发起的,分别连接自IP地址 192.168.197.130 和 192.168.197.128。两个进程都处于 “streaming” 状态,表明它们正在活跃地进行数据复制。