1. 环境准备
1.1 主机环境
- 主机 IP: 192.24.215.121
- 操作系统: CentOS 9
- PostgreSQL 版本: 16.4
1.2 从机环境
- 从机 IP: 192.24.215.122
- 操作系统: CentOS 9
- PostgreSQL 版本: 16.4
2. 安装 PostgreSQL 16.4
在主从两台机器上都需要安装 PostgreSQL 16.4。
2.1 添加 PostgreSQL 源
对于 CentOS,添加 PostgreSQL 的 YUM 源:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum makecache
2.2 安装 PostgreSQL
在两台机器上分别安装 PostgreSQL 16.4:
sudo apt-get install -y postgresql-16
或
sudo yum install -y postgresql16-server postgresql16-contrib
2.3 初始化数据库
在主节点上初始化数据库:
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
在从节点上初始化数据库:
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
3. 配置主节点
3.1 编辑配置文件
编辑主节点的 postgresql.conf
文件:
vim /home/data/pgdb/postgresql.conf
修改以下参数:
listen_addresses = '*'
wal_level = replica
max_wal_senders = 32
wal_keep_size = 1GB
hot_standby = on
archive_mode = on
archive_command = 'test ! -f /home/data/pgdb/pg_wal/archive_status/%f && cp %p /home/data/pgdb/pg_wal/archive_status/%f'
3.2 配置 pg_hba.conf
编辑主节点的 pg_hba.conf
文件:
vim pg_hba.conf
添加以下行以允许从节点连接:
host replication all 192.24.215.122/24 md5
4. 配置从节点
4.1 编辑配置文件
编辑从节点的 postgresql.conf
文件:
vim /home/data/pgdb/postgresql.conf
修改以下参数:
listen_addresses = '*'
hot_standby = on
4.2 配置 pg_hba.conf
编辑从节点的 pg_hba.conf
文件:
vim /home/data/pgdb/pg_hba.conf
添加以下行以允许主节点连接:
host replication all 192.24.215.121/24 md5
5. 启动 PostgreSQL 服务
在两台机器上分别启动 PostgreSQL 服务:
$PGHOME/pg_ctl -D /home/data/pgdb start
确保服务启动成功:
$PGHOME/pg_ctl -D /home/data/pgdb status
6. 设置主节点
6.1 创建复制用户
在主节点上创建一个用于复制的用户:
su - postgres
psql
在 PostgreSQL 命令行中执行:
CREATE ROLE repl WITH REPLICATION LOGIN ENCRYPTED PASSWORD '123123';
6.2 允许复制用户连接
确保主节点的 pg_hba.conf
中允许复制用户从从节点连接:
host replication repl 192.24.215.122/24 md5
重新加载配置:
$PGHOME/pg_ctl -D /home/data/pgdb restart
7. 设置从节点
7.1 备份主节点数据
在从节点上备份主节点的数据:
su - postgres
pg_basebackup -h 192.24.215.121 -D /home/data/pgdb -U repl -P -v -R --wal-method=stream
输入复制用户的密码。
7.2 修改从节点配置
可以看到该目录下多了个standby.signal 文件,并且在postgresql.auto.conf文件下多了如下配置信息:
cat /home/data/pgdb/postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=repl password=123456 channel_binding=prefer host=172.24.215.121 port=5432 sslmode=prefer sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable'
7.3 启动从节点
启动从节点的 PostgreSQL 服务:
$PGHOME/pg_ctl -D /home/data/pgdb start
8. 验证复制
连接主库执行 select client_addr,state,sync_state from pg_stat_replication; 可以看到从库的信息:
在主节点上插入一些数据,然后在从节点上查询这些数据,确保数据同步:
su - postgres
psql
postgres=# CREATE TABLE test01 (id int primary key, name varchar(40));
postgres=# INSERT INTO test VALUES (1, '张三');
postgres=# INSERT INTO test VALUES (2, '李四');
postgres=# INSERT INTO test VALUES (3, '王五');
在从节点上查询:
su - postgres
psql
postgres=# SELECT * FROM test01;
如果数据同步,则表示集群配置成功。
9. 监控和管理
您可以使用以下命令监控复制状态:
postgres=# SELECT * FROM pg_stat_replication;
如果有任何问题,可以通过检查 PostgreSQL 的日志文件 /home/data/pgdb/log
来诊断。
10. 故障切换
如果主节点发生故障,可以将从节点提升为主节点:
sudo -u postgres touch /home/data/pgdb/trigger_file
从节点将会切换为主节点,并开始接受写操作。
11. 清理和优化
根据需要调整 postgresql.conf
中的参数,例如 checkpoint_timeout
、max_connections
等,以优化性能。
12.总结
本次的postgresql 16.4主备同步与我上次做postgresql 11 主备同步的变化
1、数据库安装方法
其实本次我选择的rpm包方法安装,上次使用二进制tar包安装postgresql 11的,这个不属于版本间的差异;
2、主备同步参数配置
wal_level本次要设置为replica,上次11.2的时候我设置为hot_standby,如果在16.4设置为hot_standby就不能进行同步;
3、主备同步后产生的文件
16.4配置了主备同步后,在备库的$PGDATA的目录下生成了standby.signal和backup_manifest两个文件,standby.signal为一个空文件,这在11.2的主备同步中备库是没有的文件
4、备库中primary_conninfo连接信息
在16.4中存放在postgresql.auto.conf,而在11.2中存放在recovery.conf文件中,16.4版本中没有recovery.conf文件。
5、pg_controldata的使用
在11.2中可以使用pg_controldata查看主备库的角色信息,主库的集群状态为in production,备库的集群状态为in archive recovery,但在16.4中不能使用该pg_controldata工具。