主从复制
1. 基于文件的日志传送
创建一个高可用性(HA)集群配置可采用连续归档,集群中主服务器工作在连续归档模式下,备服务器工作在连续恢复模式下(1台或多台可随时接管主服务器),备持续从主服务器读取WAL文件。
连续归档不需要对数据库表做任何改动,可有效降低管理开销,对主服务器的性能影响也相对较低。
直接从一个数据库服务器移动WAL记录到另一台服务器被称为日志传送,PostgreSQL通过一次一文件(WAL段)的WAL记录传输实现了基于文件的日志传送。
- 日志传送所需的带宽取根据主服务器的事务率而变化;
- 日志传送是异步的,即WAL记录是在事务提交后才被传送,那么在一个窗口期内如果主服务器发生灾难性的失效则会导致数据丢失,还没有被传送的事务将会被丢失;
- 数据丢失窗口可以通过使用参数archive_timeout进行限制,可以低至数秒,但同时会增加文件传送所需的带宽。
2. 流复制
PostgreSQL在9.x之后引入了主从的流复制机制,所谓流复制,就是备服务器通过tcp流从主服务器中同步相应的数据,主服务器在WAL记录产生时即将它们以流式传送给备服务器,而不必等到WAL文件被填充。
- 默认情况下流复制是异步的,这种情况下主服务器上提交一个事务与该变化在备服务器上变得可见之间客观上存在短暂的延迟,但这种延迟相比基于文件的日志传送方式依然要小得多,在备服务器的能力满足负载的前提下延迟通常低于一秒;
- 在流复制中,备服务器比使用基于文件的日志传送具有更小的数据丢失窗口,不需要采用archive_timeout来缩减数据丢失窗口;
- 将一个备服务器从基于文件日志传送转变成基于流复制的步骤是:把recovery.conf文件中的primary_conninfo设置指向主服务器;设置主服务器配置文件的listen_addresses参数与认证文件即可。
操作系统: CentOS 7
数据库: PostgreSQL 12
一、主库配置
1、创建具有流复制权限的用户
CREATE ROLE replica login replication encrypted password ‘replica的密码‘;
2、编辑pg_hba.conf
# 新增或修改下列属性设置 # 监听所有IP listen_addresses = ‘*‘ # 开启归档 archive_mode = on #归档命令 archive_command = ‘test ! -f /var/lib/pgsql/12/data/pg_archive/%f && cp %p /var/lib/pgsql/12/data//pg_archive/%f‘ # 9.6开始没有hot_standby(热备模式) wal_level = replica #最多有2个流复制连接 max_wal_senders = 2 wal_keep_segments = 16 #流复制超时时间 wal_sender_timeout = 60s # 最大连接数,据说从机需要大于或等于该值 max_connections = 100
3、重启postgres
pg_ctl -D /var/lib/pgsql/12/data -l logfile restart
二、从库配置
1、验证在从库是否可以访问主节点
psql -h 10.20.2.195 -U postgres
2、停止从库postgres服务
pg_ctl -D /var/lib/pgsql/12/data -l logfile stop
3、清空从库数据存储文件夹
rm -rf /var/lib/pgsql/12/data/*
4、从主服务器上copy数据到从服务器,这一步叫做“基础备份”
pg_basebackup -h 主节点IP -p 5432 -U replica -Fp -Xs -Pv -R -D /var/lib/pgsql/12/data
5、此时data目录下会出现standby.signal文件,编辑此文件
## 加入 standby_mode = ‘on‘
6、修改postgresql.conf文件
#从机信息和连接用户 primary_conninfo = ‘host=主节点IP port=5432 user=replica password=replica用户的密码‘ #说明恢复到最新状态 recovery_target_timeline = latest #大于主节点,正式环境应当重新考虑此值的大小 max_connections = 120 #说明这台机器不仅用于数据归档,还可以用于数据查询 hot_standby = on #流备份的最大延迟时间 max_standby_streaming_delay = 30s #向主机汇报本机状态的间隔时间 wal_receiver_status_interval = 10s #r出现错误复制,向主机反馈 hot_standby_feedback = on
7、重启从库
pg_ctl -D /var/lib/pgsql/12/data -l logfile start
三、验证主从搭建是否成功
1、连接主库执行
select client_addr,sync_state from pg_stat_replication;
说明从服务器正在接收流,而且是异步流复制。主从配置成功
四、主从切换
主数据库是读写的,备数据库是只读的。当主数据库宕机了,可以通过pg_controldata命令将从库提升为主库(将只读模式变成读写),实现一些基本的HA应用。也可以通过建立触发文件提升为主库,不推荐。命令快捷不容易出错。
1、查看/var/lib/pgsql/12/data复制状态
主库
从库
2、主库故障,停止主库服务
3、提升从库为主库
su - postgres -c "pg_ctl promote" server promoting
4、查看从库日志
cat /var/lib/pgsql/912/data/pg_log/postgresql-Mon.log