一、搭建环境说明
本次测试基于 PostgreSQL 16 版本,因只有一台虚拟机,故在同一台机器上创建两个实例:主库实例(main)、从库实例(test),用于学习PostgreSQL主从复制的基本搭建流程。
数据库版本:PostgreSQL 16(Ubuntu 16.13-0ubuntu0.24.04.1)
主库实例:main,端口 5432,数据目录 /var/lib/postgresql/16/main,配置目录 /etc/postgresql/16/main
从库实例:test,端口 5433,数据目录 /var/lib/postgresql/16/test,配置目录 /etc/postgresql/16/test
操作用户:postgres(PostgreSQL默认系统用户)
二、搭建步骤(完整操作记录)
2.1 创建从库test实例
使用pg_createcluster命令创建test实例,指定端口为5433(避免与主库5432端口冲突),操作及输出如下:
# 创建test实例 postgres@lzy:~$ pg_createcluster 16 test -p 5433 Creating new PostgreSQL cluster 16/test ... /usr/lib/postgresql/16/bin/initdb -D /var/lib/postgresql/16/test --auth-local peer --auth-host scram-sha-256 --no-instructions The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale "en_US.UTF-8". The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "english". Data page checksums are disabled. fixing permissions on existing directory /var/lib/postgresql/16/test ... ok creating subdirectories ... ok selecting dynamic shared memory implementation ... posix selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting default time zone ... Etc/UTC creating configuration files ... ok running bootstrap script ... ok performing post-bootstrap initialization ... ok syncing data to disk ... ok Warning: systemd does not know about the new cluster yet. Operations like "service postgresql start" will not handle it. To fix, run: sudo systemctl daemon-reload Ver Cluster Port Status Owner Data directory Log file 16 test 5433 down postgres /var/lib/postgresql/16/test /var/log/postgresql/postgresql-16-test.log # 查看所有实例状态 postgres@lzy:~$ pg_lsclusters Ver Cluster Port Status Owner Data directory Log file 16 main 5432 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16-main.log 16 test 5433 down postgres /var/lib/postgresql/16/test /var/log/postgresql/postgresql-16-test.log2.2 主库(main)配置修改
修改主库的postgresql.conf和pg_hba.conf配置文件,开启WAL复制相关参数,允许从库连接。
# 修改主库postgresql.conf配置文件 vim /etc/postgresql/16/main/postgresql.conf # 在文件末尾添加以下配置(开启主从复制所需参数) listen_addresses = '*' port = 5432 wal_level = replica max_wal_senders = 10 max_replication_slots = 10 hot_standby = on wal_log_hints = on # 修改主库pg_hba.conf配置文件(设置访问权限) vim /etc/postgresql/16/main/pg_hba.conf # 在文件末尾添加以下配置,允许本地从库连接进行复制 host replication all 127.0.0.1/32 trust2.3 重启主库使配置生效
postgres@lzy:~$ pg_ctlcluster 16 main restart Warning: the cluster will not be running as a systemd service. Consider using systemctl: sudo systemctl restart postgresql@16-main2.4 主库创建复制专用用户
登录主库,创建具有REPLICATION权限的用户repl,用于从库拉取主库数据进行同步。
-- 登录主库(默认端口5432,可省略-p参数) psql -p 5432 -- 创建复制用户 CREATE ROLE repl REPLICATION LOGIN; ALTER ROLE repl PASSWORD '123456'; -- 退出数据库 \q2.5 从库(test)配置
清空从库test的数据目录,使用pg_basebackup命令从主库拉取全量数据,完成从库初始化配置。
# 查看实例状态(确认test实例处于down状态) postgres@lzy:~$ pg_lsclusters Ver Cluster Port Status Owner Data directory Log file 16 main 5432 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16-main.log 16 test 5433 down postgres /var/lib/postgresql/16/test /var/log/postgresql/postgresql-16-test.log # 清空从库数据目录(确保目录为空,避免数据冲突) postgres@lzy:~$ rm -rf /var/lib/postgresql/16/test/* # 从主库拉取全量备份,自动配置主从同步关系 postgres@lzy:~$ pg_basebackup \ -h 127.0.0.1 \ -p 5432 \ -U repl \ -D /var/lib/postgresql/16/test \ -Fp -Xs -P -R Password: 38524/38524 kB (100%), 1/1 tablespace # 启动从库test postgres@lzy:~$ pg_ctlcluster 16 test start Warning: the cluster will not be running as a systemd service. Consider using systemctl: sudo systemctl start postgresql@16-test # 再次查看实例状态(确认test实例处于online,recovery状态) postgres@lzy:~$ pg_lsclusters Ver Cluster Port Status Owner Data directory Log file 16 main 5432 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16-main.log 16 test 5433 online,recovery postgres /var/lib/postgresql/16/test /var/log/postgresql/postgresql-16-test.log三、主从同步验证测试
通过在主库创建表、插入数据,在从库查询数据,验证主从同步是否正常;同时确认从库处于只读恢复状态。
# 查看主库复制状态(确认从库连接) postgres@lzy:~$ psql -p 5432 -c "SELECT * FROM pg_stat_replication;" # 主库创建测试表并插入数据 postgres@lzy:~$ psql -p 5432 -c "CREATE TABLE test_sync(id int); INSERT INTO test_sync VALUES (100);" CREATE TABLE INSERT 0 1 # 从库查询测试数据(验证同步是否正常) postgres@lzy:~$ psql -p 5433 -c "SELECT * FROM test_sync;" id ----- 100 (1 row) # 查看从库状态(确认从库处于恢复模式,只读) postgres@lzy:~$ psql -p 5433 -c "SELECT pg_is_in_recovery();" pg_is_in_recovery ------------------- t (1 row)四、学习总结
本次测试成功在单台虚拟机上完成了PostgreSQL 16的主从搭建,核心流程为:创建从库实例→配置主库复制参数→创建复制用户→从库拉取主库全量备份→启动从库→验证同步。
关键要点:主从实例端口需区分(避免冲突),主库需开启wal_level=replica等复制参数,pg_basebackup命令的-R参数可自动配置主从连接关系,从库启动后处于online,recovery状态(只读),可正常同步主库数据。
五、补充说明
操作过程中出现的systemd相关警告,可通过执行sudo systemctl daemon-reload更新systemd配置,使系统识别新创建的test实例,不影响主从同步功能。