Postgresql数据库的同步流复制
在主节点初始化数据库,并且配置好 postgresql.conf 文件,在 pg_hba.conf中添加好对应的从节点 IP 段,重启数据库后,行如下操作:
(1)主节点操作
主节点初始化并启动后,psql进入数据库中,修改postgres超级用户密码,并创建复制用户
postgres=# alter user postgres with password 'postgres';
ALTER ROLE
postgres=# create role replicator with login replication password 'replicator';
CREATE ROLE
主节点要配置pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
host replication all 192.168.1.9/24 trust
主节点配置postgresql.conf文件添加
listen_addresses = '*'
max_wal_senders = 5
wal_level = hot_standby
synchronous_standby_names = 'standby01'
(2)从节点操作
从节点编译完成并配置好环境变量后(指定pgdata目录即可,不需要重启服务),执行数据备份操作:
pg_basebackup -h 主节点 IP -U replicator -D /home/postgres/pgdata -X stream -P
Password:
23407/23407 kB (100%), 1/1 tablespace
例如:pg_basebackup -h 192.168.1.6 -U replicator -D /home/postgres/pgdata -X stream -P
传完数据记得授权 chown 700 pgdata
chown -R postgres:postgres postgres
(3)从节点创建配置文件
cd /home/postgres/pgdata
创建并配置recovery.conf 文件:
vi recovery.conf
standby_mode = 'on'
primary_conninfo = 'host= 主节点 IP port= 端口 user= 流 复 制 用 户application_name=节点 password=密码 keepalives_idle=60 keepalives_interval=5 keepalives_count=5'
restore_command = ''
recovery_target_timeline = 'latest'
例如:
standby_mode = 'on'
primary_conninfo = 'host= 192.168.1.6 port= 5432 user= replicator application_name=standby01 password=replicator keepalives_idle=60 keepalives_interval=5 keepalives_count=5'
restore_command = ''
recovery_target_timeline = 'latest'
(4)启动备数据库
[postgres@localhost pgdata]$ pg_ctl start -D /home/postgres/pgdata/
等待服务器进程启动 ....2022-04-28 17:23:37.638 CST [46035] 日志: listening on IPv4 address "0.0.0.0", port 5432
2022-04-28 17:23:37.638 CST [46035] 日志: listening on IPv6 address "::", port 5432
2022-04-28 17:23:37.640 CST [46035] 日志: listening on Unix socket "/tmp/.s.PGSQL.5432"
2022-04-28 17:23:37.675 CST [46036] 日志: 数据库系统中断;上一次的启动时间是在2022-04-28 17:21:52 CST
2022-04-28 17:23:37.691 CST [46036] 日志: 正在进入备用模式
2022-04-28 17:23:37.696 CST [46036] 日志: redo 在 0/6000028 开始
2022-04-28 17:23:37.698 CST [46036] 日志: 在0/60000F8上已到达一致性恢复状态
2022-04-28 17:23:37.699 CST [46035] 日志: 数据库系统准备接受只读请求的连接
2022-04-28 17:23:37.709 CST [46043] 日志: 在时间点: 0/7000000 (时间安排1)启动日志的流操作
完成
服务器进程已经启动
(5)验证是否成功
主库建表插入数据
create table test (id integer);
insert into test values (1);
select * from test;
备库查看数据是否传输
postgres=# select * from test;
主库:
postgres=# insert into test values (1);
INSERT 0 1
postgres=# select * from test;
id
----
1
1
1
1
(4 行记录)
备库:
postgres=# select * from test;
id
----
1
1
1
1
(4 行记录)
postgres=#
注: application_name中节点对应主节点 postgresql.conf 配置文件中synchronous_standby_names 参数的节点列表,如果节点名称一致,则可以配置成同步模式,不一致则是异步模式。例如:主节点 postgresql.conf配置文件中synchronous_standby_names=’ndoe2,node3’ ,在 node2 节点 recovery.conf 配置文件中 application_name=’node2’或 application_name=’node3’则说明是同步流模式; 如果是 application_name=’’或 application_name=’node4’,则为异步流模式。
其他从节点搭建方法如上。