PG主备库搭建与切换
主备库环境说明
主机名 | IP | 角色 | 端口 |
---|---|---|---|
master | 192.168.30.11 | master | 5432 |
slave1 | 192.168.30.12 | slave1 | 5432 |
配置hosts
vim /etc/hostss
在主备服务器安装postgres数据库软件
由于前面写过类似的,这边就不在重复编写了。
初始化master数据库(若有库可省略)
initdb -D /postgres/data
pg_ctl -D /postgres/data start
主库创建用户
创建用户用于复制WAL日志
CREATE USER repuser replication LOGIN CONNECTION LIMIT 3 ENCRYPTED PASSWORD '123456';
主备库库都需要创建.pgpass文件
vim /home/postgres/.pgpass
配置pg_hba.conf
在主库的pg_hba.conf最后一行增加如下:
host replication repuser slave1 md5
配置postgresql.conf
在主库上配置如下:
listen_addresses = '*'
port = 5432
max_connections = 100
superuser_reserved_connections = 10
full_page_writes = on
wal_log_hints = off
max_wal_senders = 50
hot_standby = on
log_destination = 'csvlog'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S'
log_statement = 'mod'
log_timezone = 'Asia/Shanghai'
timezone = 'Asia/Shanghai'
dynamic_shared_memory_type = posix
full_page_writes = on
wal_level = replica
archive_mode = on
archive_command = ''cp %p /postgres/arch/archived_log%f'
archive_timeout = 60s
#若要数据同步方式为同步,更改synchronous_standby_names参数,其后跟备库的application_name
synchronous_standby_names = 'slave1'
其他可配置参数:
以下四个参数值,在备库上参数值不应小于主库上的值,否则会导致无法启动。
max_connections
max_prepared_transactions
max_locks_per_transaction
max_worker_processes
注:如果修改参数值大小:
将参数值改大,先修改所有备库,再修改主库
将参数值改小,先修改主库,再修改备库
创建上述配置所需归档路径(主库与备库都要创建)
mkidr /postgres/arch
重启数据库
pg_ctl -D /postgres/data restart
pg_basebackup 创建备库(主库要启动,并且打开防火墙)
在slave1端的postgres用户下执行
pg_basebackup -h 192.168.30.11 -p 5432 -U repuser -w -Fp -Xs -Pv -R -D /postgres/data
修改slave中data目录下的pg_hba.conf
修改备库postgresql.conf配置文件
vim /postgres/data/postgresql.conf
编辑内容如下
listen_addresses = '* '
wal_level = hot_standby
max_connections = 200 # 一般比主库大一些.
hot_standby = on
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on # 如果有错误的数据复制,是否向 主进行范例.
修改备库postgresql.auto.conf配置文件(添加application_name参数)
vim /postgres/data/postgresql.auto.conf
编辑内容如下
primary_conninfo = 'application_name=slave1 user=repuser passfile=''/home/postgres/.pgpass'' host=192.168.30.11 port=5432 sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
验证查看进程、状态
主库
查看主库的WAL日志发送进程是否正常
ps -ef|grep walsender
备库
查看主库的WAL日志发送进程是否正常
ps -ef |grep walreceiver
主库查看复制状态
流同步复制
\x on;
select * from pg_stat_replication;
参数:
username:复制用户
client_addr:从库IP
sync_state:同步还是异步,这边是同步
测试数据
主库创建测试数据
psql
create table t1 (id int);
insert into t1 values(100);
备库查看测试数据
pqsl
select * from t1;
主从切换
1、主备库进程查看
主库
pg_controldata -D /postgres/data
备库
pg_controldata -D /postgres/data
2、停掉主库
pg_ctl -D /postgres/data stop
查看主库状态是否处于stop状态
pg_controldata -D /postgres/data |grep 'Database cluster state'
3、提升从库为主库
这个时候从库保持运行状态,不需要停掉
pg_ctl promote -D /postgres/data
pg12开始新增了一个pg_promote()函数,让我们可以通过SQL命令激活备库。
pg_promote()语法:
pg_promote(wait boolean DEFAULT true, wait_seconds integer DEFAULT 60)
两个参数:
wait: 表示是否等待备库的 promotion 完成或者 wait_seconds 秒之后返回成功,默认值为 true。
wait_seconds: 等待时间,单位秒,默认 60
查看状态
pg_controldata -D /postgres/data |grep 'Database cluster state'
4、尝试在原来的从库写入数据
insert into t1 values(100);
写入新增数据,从库(即原来的主库)启动后,模拟差异数据是否同步到从库
5、将原来的主库部署为从库
附:区分主库还是备库的方法
方法1:pg_controldata
主库
pg_controldata -D /postgres/data
备库
pg_controldata -D /postgres/data
从上述 Data cluster state参数可以清楚的将主库给分辨出来。
方法2:字典表pg_stat_replication
只有主库才能查到数据
select * from pg_stat_replication;
方法3.根据PG进程
进程中显示wal sender的是主库,显示wal receiver的是备库,如下:
主库
查看主库的WAL日志发送进程是否正常
ps -ef|grep walsender
备库
查看主库的WAL日志发送进程是否正常
ps -ef |grep walreceiver
方法4.通过pg_is_in_recovery函数
备库是t,主库是f。
select pg_is_in_recovery();