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:

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)

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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐