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)
在主库创建数据库插入数据、在从库查询是否同步。
暂无评论内容