主库安装
(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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




