随笔 - 17  文章 - 0  评论 - 13  阅读 - 63018 

注意:PostgreSQL 12对主从复制实现和配置做了重大改进,如废弃了recovery.conf,并将参数转换为普通的PostgreSQL配置参数,使得配置群集和复制更加简单。

PostgreSQL数据库支持多种复制解决方案,以构建高可用性,可伸缩,容错的应用程序,其中之一是预写日志(WAL)传送。该解决方案允许使用基于文件的日志传送或流复制,或者在可能的情况下,将两种方法结合使用来实现备用服务器。

使用流复制时,备用(复制从属)数据库服务器被配置为连接到主服务器/主服务器,主服务器/主服务器在生成WAL记录时将其流传输到备用服务器,而无需等待WAL文件被填充。

默认情况下,流复制是异步的,其中在将事务提交到主服务器后将数据写入备用服务器。这意味着在主服务器中提交事务与更改在备用服务器中变得可见之间存在很小的延迟。这种方法的一个缺点是,如果主服务器崩溃,则可能无法复制任何未提交的事务,这可能导致数据丢失。

示例环境:

Postgresql master database server: 10.20.20.1
Postgresql standby database server: 10.20.20.2

一. 配置主服务器

1. 修改监听端口

su - postgres
psql -c "ALTER SYSTEM SET listen_addresses TO '*';"/
ls -l /var/lib/pgsql/12/data/ # 会生成一个postgresql.auto.conf文件

ALTER SYSTEM SET会将配置保存在一个postgresql.conf.auto中,与postgresql.conf并存,系统会优先使用.auto配置。

2. 创建复制角色

# su – postgres
createuser --replication -P -e replicator # -P:设置密码,-e:回显
exit

3. 角色授权
vim /var/lib/pgsql/12/data/pg_hba.conf

host replication replicator 10.20.20.2/24 md5

4. 重启服务

systemctl restart postgresql-12.service

5. 设置防火墙(非必选)

firewall-cmd --add-service=postgresql --permanent
firewall-cmd --reload

二. 配置从服务器

1. 将主机基础数据备份到从机

# 先停掉服务,备份下本地数据,并清除本地数据
systemctl stop postgresql-12.service
su - postgres
tar -zcvf /var/lib/pgsql/12/data.tar.gz /var/lib/pgsql/12/data #备份一下
rm -rf /var/lib/pgsql/12/data/*
# 使用pg_basebackup工具备份
pg_basebackup -h 10.20.20.1 -D /var/lib/pgsql/12/data -U replicator -P -v -R -X stream -C -S pgstandby1
exit
  • -h –指定作为主服务器的主机。
  • -D –指定数据目录。
  • -U –指定连接用户。
  • -P –启用进度报告。
  • -v –启用详细模式。
  • -R–启用恢复配置的创建:创建一个standby.signal文件,并将连接设置附加到数据目录下的postgresql.auto.conf
  • -X–用于在备份中包括所需的预写日志文件(WAL文件)。流的值表示在创建备份时流式传输WAL。
  • -C –在开始备份之前,允许创建由-S选项命名的复制插槽。
  • -S –指定复制插槽名称。

备份过程完成后,会在data目录下创建了一个standby.signal,并将primary_conninfo写入postgresql.auto.conf

ls -l /var/lib/pgsql/12/data/
cat /var/lib/pgsql/12/data/postgresql.auto.conf

如果postgresql.conf中的hot_standby参数设置为on(默认值),并且数据目录中存在Standby.signal文件,则replication slave将在“热备”模式下运行。

2. 验证主机(master)复制插槽信息

# su - postgres
$ psql -c "SELECT * FROM pg_replication_slots;"
$ exit

pg_replication_slots视图会看到名为pgstandby1的复制插槽信息。

3. 启动从服务(standby)

#systemctl start postgresql-12

三. 测试主从服务

1. 查看从服务(WAL接收器进程)状态:

psql -c "\x" -c "SELECT * FROM pg_stat_wal_receiver;"
扩展显示已打开.
-[ RECORD 1 ]---------+----------------------------
pid | 3240
status | streaming
receive_start_lsn | 0/3000000
receive_start_tli | 1
received_lsn | 0/3013BF8
received_tli | 1
last_msg_send_time | 2020-06-22 18:12:29.985512+08
last_msg_receipt_time | 2020-06-22 18:12:29.761575+08
latest_end_lsn | 0/3013BF8
latest_end_time | 2020-06-22 17:02:51.977569+08
slot_name | pgstandby1
sender_host | 10.20.20.1
sender_port | 5432
conninfo | user=replicator password=******** dbname=replication host=10.20.20.1 port=5432 fallback_application_name=walreceiver sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any

查看进程信息,会有walsender的相关信息。

$ ps aux | grep postgres
postgres ... postgres: walsender replicator 10.20.20.2(38418) streaming 0/3013BF8
...

2. 查看主服务(WAL发送器进程)状态:

psql -c "\x" -c "SELECT * FROM pg_stat_replication;"
-[ RECORD 1 ]----+------------------------------
pid | 4647
usesysid | 16384
usename | replicator
application_name | walreceiver
client_addr | 10.20.20.2
client_hostname |
client_port | 38418
backend_start | 2020-06-22 16:54:54.391772+08
backend_xmin |
state | streaming # ☆☆☆服务状态☆☆☆
sent_lsn | 0/3013BF8
write_lsn | 0/3013BF8
flush_lsn | 0/3013BF8
replay_lsn | 0/3013BF8
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async # ☆☆☆同步状态☆☆☆
reply_time | 2020-06-22 18:18:20.293569+08

查看进程信息,会有walreceiver的相关信息。

$ ps aux | grep postgres
postgres ...postgres: walreceiver streaming 0/3013BF8
...

3. 数据测试

master创建replica_demo数据库,在standby上可以看到同步效果

[master] #CREATE DATABASE replica_demo;
[standby]#\l

参考链接

https://www.tecmint.com/configure-postgresql-streaming-replication-in-centos-8/

posted on   布史  阅读(4612)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示