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