世界上只有一种英雄主义,就是看清生活的真相之后依然热爱生活!

PostgreSQL 10.x 数据库主从流复制配置

2019-07-08
300次查阅
2019/7/8

PostgreSQL 在 9.0 之后引入了主从的流复制机制,所谓流复制,就是从服务器通过 tcp 流从主服务器中同步相应的数据。这样当主服务器数据丢失时从服务器中仍有备份。

与基于文件日志传送相比,流复制允许保持从服务器更新。 从服务器连接主服务器,其产生的流 WAL 记录到从服务器, 而不需要等待主服务器写完 WAL 文件。

PostgreSQL 流复制默认是异步的。在主服务器上提交事务和从服务器上变化可见之间有一个小的延迟,这个延迟远小于基于文件日志传送,通常1秒能完成。如果主服务器突然崩溃,可能会有少量数据丢失。

同步复制必须等主服务器和从服务器都写完WAL后才能提交事务。这样在一定程度上会增加事务的响应时间。

配置同步复制仅需要一个额外的配置步骤:synchronous_standby_names必须设置为一个非空值。synchronous_commit也必须设置为on

这里部署的是异步的流复制模式。

注:主从服务器所在节点的系统、环境最好一致。PostgreSQL版本也最好一致,否则可能会有问题。

配置环境说明:

  • 操作系统:CentOS Linux release 7.6.1810 (Core) 
  • 软件版本:PostgreSQL-10.9
  • Master:192.168.0.3  主库
  • Slave:   192.168.0.4  从库

安装数据库这里省略,参考:PostgreSQL数据库编译安装需要注意的是从库不需要初始化数据库

主库配置

1、创建用于主从同步的同步账户replica

su - postgres
psql
CREATE ROLE replica login replication encrypted password 'replica';
\q

2、修改pg_hba.conf文件,指定replica登录网络

vim /data/pgsql/data/pg_hba.conf

# 在配置文件中追加从库访问限制,允许从库发起流复制
host    replication     replica         192.168.0.4/32          trust

3、编辑 postgresql 配置文件postgresql.conf

vim /data/pgsql/data/postgresql.conf

listen_address = '*'       # 监听所有ip
wal_level = replica        # 该级别支持wal归档和复制
max_wal_senders = 10       # 并发的从库数量
wal_keep_segments = 256    # 默认是0,代表主库wal日志文件保存的个数,设置数量多一点可以防止主库生成日志太快而被覆盖的情况发生
wal_sender_timeout = 60s   # 流复制超时时间
max_connections = 100      # 最大连接时间,必须要小于从库的配置

4、重启主库

pg_ctl restart -D /data/pgsql/data

从库配置

1、和主库一样安装数据库,然后不要初始化数据(initdb)。若是已运行的库先停止,然后删除原数据文件。所有者postgres,权限0700

2、同步主库目前的所有数据

pg_basebackup -h 192.168.0.3 -U replica -F p -X stream -P -R -D /data/pgsql/data/ -l backup20190708 -W
Password: <输入replica用户密码>
32398/32398 kB (100%), 1/1 tablespace

参数说明:

  • -h指定连接的数据库的主机名或 IP 地址。
  • -U指定连接的用户名。
  • -F指定了输出的格式,支持p(原样输出)或者t(tar格式输出)。
  • -X表示备份开始后,启动另一个流复制连接从主库接收WAL日志。
  • -P表示允许在备份过程中实时的打印备份的进度。
  • -R表示会在备份结束后自动生成recovery.conf文件。
  • -D指定备份写入的数据目录,需要与数据库配置的数据库目录一致,初次备份之前从库的数据目录需要手动清空。
  • -l表示指定一个备份的标识。
  • -W强制密码提示输入。

3、编辑 recovery.conf

vim /data/pgsql/data/recovery.conf

standby_mode = 'on'
primary_conninfo = 'user=replica password=replica host=192.168.0.3 port=5432 sslmode=prefer sslcompression=1 target_session_attrs=any'
recovery_target_timeline = 'latest'

4、启动从库

pg_ctl -D /data/pgsql/data -l /data/pgsql/log/logfile start

验证是否同步

在主库执行:

[postgres@pg-master ~]$ psql
psql (10.9)
Type "help" for help.
postgres=# 
postgres=# SELECT client_addr,sync_state FROM pg_stat_replication;
 client_addr | sync_state 
-------------+------------
 192.168.0.4 | async
(1 row)

在主库创建数据库插入数据、在从库查询是否同步。

评论

想说点什么?