暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PG流复制从零开始搭建教程

原创 进击的CJR 2025-03-05
42

主库安装


(1)下载软件包
https://www.postgresql.org/ftp/source/v16.6/

(2)安装必要包
yum -y install readline readline-devel zlib zlib-devel gettext gettext-devel openssl openssl-devel pam pam-devel libxml2 libxml2-devel libxslt libxslt-devel perl perl-devel tcl-devel uuid-devel gcc gcc-c++ make flex bison perl-ExtUtils*  libicu  libicu-devel  ntp libcurl-devel

(3)创建用户
groupadd dba -g 2000
useradd postgres -g 2000 -u 2000
id postgres
echo "postgres"|passwd --stdin postgres

(4)配置目录
mkdir -p /opt/soft
mkdir -p /opt/pg16
mkdir -p /opt/pgdata
mkdir -p /opt/pgwal
mkdir -p /opt/pgarchive
chown -R postgres:dba  /opt
chmod 0700 /opt/pgdata/
chmod 0700 /opt/pgwal/
chmod 0700 /opt/pgarchive/

(5)解压
mv postgresql-16.6.tar.gz  /opt/soft
su - postgres 
cd /opt/soft
tar -xzvf postgresql-16.6.tar.gz 

(6)编译安装
su - postgres
cd  /opt/soft
cd postgresql-16.6/
./configure --prefix=/opt/pg16 --with-pgport=5432  
make world
make install-world #包含扩展包和文档

使用  make 或者  make world
使用 make install 或者 make install-world 进行安装 后者包含扩展包和文档


(7)初始化和启动
初始化:输入密码123456
/opt/pg16/bin/initdb -D /opt/pgdata/ -X /opt/pgwal/  -E UTF8 -Upostgres -W

启动
/opt/pg16/bin/pg_ctl -D /opt/pgdata/ -l logfile start

查看版本
/opt/pg16/bin/postgres --version

(8)配置环境变量
vi ~/.bash_profile

export PGPORT=5432
export PGUSER=postgres
export PGHOME=/opt/pg16
export PGDATA=/opt/pgdata
export PATH=$PGHOME/bin:$PATH

source ~/.bash_profile

(9)数据库启停
查看数据库运行状态
pg_ctl -D /opt/pgdata status

启动数据库
pg_ctl -D /opt/pgdata start &
pg_ctl -D /opt/pgdata/ -l logfile start
 
查看数据库运行状态
pg_ctl -D /opt/pgdata status
 
停止数据库
pg_ctl -D /opt/pgdata stop

重启数据库
pg_ctl -D /opt/pgdata restart &

复制

主库修改配置

(1)主节点创建复制用户
create user repl with replication login password 'replpassword';

(2)主节点pg_hba连接配置
host    replication     repl            43.138.214.171/32       md5

replication表示允许replication连接请求,此时不指定任何特定的数据库。可以用逗号分隔来指定多个数据库,值 all 匹配所有的数据库。
在 PostgreSQL 的 pg_hba.conf 文件中,规则的顺序非常重要。PostgreSQL 会从上到下逐行匹配规则,第一条匹配的规则生效,后续的规则会被忽略。

(3)编辑postgresql.conf文件修改参数

#使主库可以接受来自任何IP的连接请求‌
listen_addresses = '*'                                                                      
port = 5432                             
max_connections = 100      

#确保生成足够的WAL数据进行流复制‌
wal_level = replica  
max_wal_senders = 32  

#定义流复制发送数据的超时时间‌
wal_sender_timeout = 60s

#确保在切换过程中有足够的WAL日志‌
max_wal_size = 1GB
min_wal_size = 800MB

#确保事务提交时必须等待WAL数据写入本地日志文件‌
synchronous_commit = on

重启生效
pg_ctl -D /opt/pgdata restart

(4)创建复制槽
SELECT * FROM pg_create_physical_replication_slot('slot_name');
SELECT * FROM pg_create_physical_replication_slot('pgstandby_slave01');

(5)主节点复制槽名称确认(如果存在删除)
    主节点上创建slot
SELECT * FROM pg_create_physical_replication_slot('pgstandby_slave01');
     
#查看复制槽信息
SELECT * FROM pg_replication_slots;
#删除复制槽之前,该槽不再被任何复制消费者使用。
select pg_drop_replication_slot('pgstandby_slave01');
#使用复制槽
在从库的 recovery.conf 或 postgresql.conf 中配置复制槽:
primary_slot_name = 'my_slot'
复制

搭建备库

(1)备份
从节点通过pg_basebackup将主节点的数据备份到当前实例下,在启动后基于pgbasebackup备份时生成的postgresql.auto.conf文件,启动时会自动接入主节点进行复制。

pg_basebackup -h 43.138.214.171 -p 5432 -U repl --password -R -P -v -C --slot=pgstandby_slave01 -D /opt1/databak/
  -R 说明会创建standby.signal文件,以及补充postgresql.auto.conf的内容
  -P 显示备份进度
  -v 显示更加详细信息
  -C 同时创建复制槽
  --slot 指定复制槽的名字(一个备库一个名字)
  -D 生成备库的路径
  -z, --gzip 压缩 tar 输出
   -Z, --compress=0-9 使用给定的压缩级别压缩 tar 输出

     # -Ft p|t,t输出tar包格式
     # -z 压缩
     # -Z5 压缩比

pg_basebackup -h 43.138.214.171 -p 5432 -U repl --password -R -P -v -C --slot=pgstandby_slave01 -D /opt/databak/
Password: 
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/5000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created replication slot "pgstandby_slave01"
23598/23598 kB (100%), 1/1 tablespace                                         
pg_basebackup: write-ahead log end point: 0/5000138
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: renaming backup_manifest.tmp to backup_manifest
pg_basebackup: base backup completed


备份后会自动在数据目录下创建两个文件
postgresql.auto.conf和standby.signal
postgresql.auto.conf的内容如下,其实就是用pg_basebackup备份时的账号密码,自动生成启动流复制之后连接到主节点的配置信息


(2)备份完成后重新授权文件路径权限给postgres用户
  chown postgres.dba -R /opt/databak/
  chmod 700 -R /opt/databak/
  
(3)启动从库
启动前,如果在同一台主机上测试,需要修改下配置文件端口号
	pg_ctl -D /opt/databak/ start
复制

主备信息查看

主库查看
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid              | 32293 
usesysid         | 16388 
usename          | repl 
application_name | walreceiver
client_addr      | 43.138.214.171
client_hostname  | 
client_port      | 53372
backend_start    | 2025-02-28 17:32:32.984753+08
backend_xmin     | 
state            | streaming
sent_lsn         | 0/60011D8
write_lsn        | 0/60011D8
flush_lsn        | 0/60011D8
replay_lsn       | 0/60011D8
write_lag        | 
flush_lag        | 
replay_lag       | 
sync_priority    | 0
sync_state       | async
reply_time       | 2025-02-28 17:35:53.168454+08

从库上查看
select pg_is_wal_replay_paused() ;
 pg_is_wal_replay_paused 
-------------------------
 f
select pg_wal_replay_pause()             #立即暂停恢复(仅限于超级用户)。
select pg_wal_replay_resume()            #如果恢复被暂停,重启之(仅限于超级用户)。
select pg_last_xact_replay_timestamp();

postgres=# select * from pg_stat_wal_receiver;
-[ RECORD 1 ]---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid                   | 32292
status                | streaming
receive_start_lsn     | 0/6000000
receive_start_tli     | 1
written_lsn           | 0/60012C0
flushed_lsn           | 0/60012C0
received_tli          | 1
last_msg_send_time    | 2025-02-28 17:39:28.452896+08
last_msg_receipt_time | 2025-02-28 17:39:28.454832+08
latest_end_lsn        | 0/60012C0
latest_end_time       | 2025-02-28 17:37:28.403308+08
slot_name             | pgstandby_slave01
sender_host           | 43.138.214.171
sender_port           | 5432
conninfo              | user=repl password=******** channel_binding=disable dbname=replication host=43.138.214.171 port=5432 fallback_application_name=walreceiver sslmode=disable sslcompression=0 sslcertmode=disable sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable


复制

主备切换

(1)停止主库,模拟故障
pg_ctl -D /opt/pgdata stop
    
(2)备库提升为新主库,对外提供服务
pg_ctl promote -D /opt/databak

(3)新主库修改pg_hba.conf文件
host    replication     repl            43.138.214.171/32       md5

(4)原主库新建$PGDATA/standby.signal文件
touch standby.signal

(5)原主库修改$PGDATA/postgresql.auto.conf文件
primary_conninfo='user=repl password=replpassword host=43.138.214.171 port=6432'

(6)启动原主库
pg_ctl -D /opt/pgdata start

主备切换重点:
备库提升为主库的命令:pg_ctl promote;
新主库(原备库)的pg_hba.conf文件,要开放允许流复制访问数据库的信息给原主库的IP地址;
原主库配置为新备库的时候,务必要创建$PGDATA/standby.signal文件;
原主库配置为新备库的时候,务必要修改$PGDATA/postgresql.auto.conf文件,添加主库primary_conninfo的信息;
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

目录
  • 主库安装
  • 主库修改配置
  • 搭建备库
  • 主备信息查看
  • 主备切换