14-Master-Slave_Operation

Master-Slave_Operation

Postgresql只支持简单的主从,没有自动主从切换。

环境

  • 两台或多台 Linux 服务器(CentOS/Ubuntu)
  • PostgreSQL 12 或更高版本(本文以 PostgreSQL 14 为例)
  • 网络互通,防火墙开放相关端口

服务器规划

角色 IP地址 主机名 数据目录
主库 192.168.1.100 pg-master /var/lib/pgsql/14/data
从库 192.168.1.101 pg-slave /var/lib/pgsql/14/data

主库配置

配置访问权限

修改/var/lib/postgre/data/pg_hba.conf,添加以下内容,保证允许复制,读取

# 允许从库连接进行流复制
host    replication     repuser        192.168.1.101/32        md5

# 允许应用从从库读取(可选)
host    all             all            192.168.1.0/24          md5

创建复制用户

# 切换到postgres用户
sudo su - postgres

# 进入psql命令行
psql

-- 创建复制专用用户
CREATE USER repuser WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'RepPass123!';

-- 查看用户是否创建成功
\du

-- 退出psql
\q

然后重启主库服务

systemctl restart postgresql

从库配置

停止从库服务并清空数据目录

# 停止PostgreSQL服务
sudo systemctl stop postgresql

# 备份原有数据(如果有)
sudo mv /var/lib/pgsql/data /var/lib/pgsql/data.backup.$(date +%Y%m%d)

# 创建新数据目录
sudo mkdir -p /var/lib/pgsql/data
sudo chown postgres:postgres /var/lib/pgsql/data

使用pg_basebackup进行基础备份

# 切换到postgres用户
sudo su - postgres

# 从主库拉取基础备份
pg_basebackup -h 192.168.1.100 -D /var/lib/pgsql/14/data -U repuser -P -v -R -W
# 这里没有使用-F归档模式,直接就是源配置文件

# 输入上面设置的密码:RepPass123!

# 退出postgres用户
exit

检查生成的配置文件

备份完成后,从库的data目录下会生成standby.signal文件(表示这是备用服务器),以及postgresql.auto.conf文件包含主库连接信息:

# 查看自动生成的配置
cat /var/lib/pgsql/14/data/postgresql.auto.conf

# 输出类似:
primary_conninfo = 'user=repuser password=RepPass123! host=192.168.1.100 port=5432 sslmode=prefer sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any'

配置从库参数

编辑 /var/lib/pgsql/data/postgresql.conf

# 设置从库为热备模式(允许只读查询)
hot_standby = on

# 从库报告给主库的最大延迟(可选)
hot_standby_feedback = on

# 从库恢复期间最大并行进程数
max_standby_archive_delay = 30s
max_standby_streaming_delay = 30s

# 其他优化参数
shared_buffers = 256MB

启动从库服务

sudo systemctl start postgresql

创建测试数据验证同步

-- 在主库上执行
CREATE TABLE test_replication (
    id SERIAL PRIMARY KEY,
    data VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO test_replication (data) VALUES ('测试主从同步数据');

-- 在从库上查询(应该能查到)
SELECT * FROM test_replication;

主节点查看从节点

select * from pg_stat_replication;

从节点查看主节点

select * from pg_stat_wal_r;
posted @ 2026-01-05 16:28  大胖熊哈  阅读(2)  评论(0)    收藏  举报