转载备份
影子 DOM(Shadow DOM)
你的 docker stop,它优雅吗? - 无糖拿铁,谢谢
清理Docker的container,image与volume · 零壹軒·笔记
Create a PyPI Mirror Site with devpi-server – SRE
优雅的终止 docker 容器 | iTimothy
Odoo 14 开发者指南第二十一章 性能优化 | Alan Hou 的个人博客
Odoo 14 开发者指南第八章 高级服务端开发技巧 | Alan Hou 的个人博客
kafka 系列:设置日志数据保存过期时间(含某个 topic)、日志策略_NIO4444-CSDN 博客_kafka 配置数据过期时间
Chromium 历史版本离线安装包 - 下载方法
怎样将 props 传递给 {this.props.children} | WebFuse
HappyBaseDoc
用户指南 — HappyBase 1.2.0 文档
安装指南 — HappyBase 1.2.0 文档
API 参考 — HappyBase 1.2.0 文档
PostgreSQL 时间转换
JS 中创建给定长度的数组
GSAP 入门 - 学习中心 - 绿袜
操作系统复习 | Happy Coding
如何理解 ip 路由和操作 linux 的路由表 - CodeAntenna
Elasticsearch 7.11 tokenizer, analyzer and filter 以及 IK 分词配置同义词、远程拓展词库 – Brave new world
podman 容器内访问 host 主机的端口 - 知识库 - BSMI KB 基础标准矿产工业
吐血总结!100 道经典 Python 面试题集锦上(附答案)
中共党史简表(1919 年 - 1949 年)
Dockerfile 详解_万 wu 皆可爱的博客 - CSDN 博客_dockerfile
为你的 Python 应用选择一个最好的 Docker 映像 | 亚马逊 AWS 官方博客
Ubuntu Server 支持中文
docker push | Docker Documentation
docker 创建本地仓库详解 (push/pull)_乱红飞的博客 - CSDN 博客_docker push 本地仓库
基于 Ubuntu 20.04 安装 Kubernetes 1.18
PostgreSQL 集群篇——PostgreSQL 的配置文件解析_51CTO 博客_postGresql
【PostgreSQL】——主从流复制_Teingi 的博客 - CSDN 博客_postgresql 主从复制
PostgreSQL: Documentation: 14: 27.4. Hot Standby
postgresql 主从复制、主从切换_偷懒的小陈的博客 - CSDN 博客_postgresql 主从
Postgres 用户、角色与权限 :: 68hub — 技术博客
中国共产党第二十次全国代表大会在京开幕 一图速览二十大报告
配置 docker 通过代理服务器拉取镜像
IPVS no destination available - Kubernetes 实践指南
Python 风格规范 — Google 开源项目风格指南
互动测试!党的二十大报告 100 题
自定义 ESlint 规则
Java 读取 OpenSSL 生成的秘钥, 进行 RSA 加解密 | 数字魔法
CSS(一)chrome 浏览器表单自动填充默认样式 - autofil_半个 GIS 半个前端的博客 - CSDN 博客
Nginx 多级代理下的真实 IP 透传 - CodeAntenna
Jenkins 环境变量
人民币金额大写规范 - 内蒙古农业大学财务处
[转]nginx 开启 websocket - 浅忆博客
ceph 创建使用 rbd
《三》配置 ceph 存储池 pool - Buxl's blog
基于 K8S 搭建 Ceph 分部署存储 – 唐玥璨 | 博客
序言 · Kubernetes 中文指南——云原生应用架构实战手册
服务器配置 - Redis 安装配置 | 灰帽子 - 任令仓的技术博客
Ubuntu 配置 sudo 命令不需要输入密码_ubuntu sudo 免密_一路向前 - 执着的博客 - CSDN 博客
修改 Docker 数据目录位置,包含镜像位置 - 腾讯云开发者社区 - 腾讯云
微服务架构实践(API Gateway)
微服务网关:从对比到选型,由理论到实践 | Java 程序员进阶之路
聊聊微服务网关
微服务网关:从对比到选型,由理论到实践
odoo 实现表分区 partition
使用 keepalived 搭建高可用服务 - 简书
业务网关的落地实践_文化 & 方法_Qunar 技术沙龙_InfoQ 精选文章
部署 Kubernetes PostgreSQL 实例 | domac 的菜园子
一套包含完整前后端的系统如何在 K8S 中部署?_k8s 前端_木讷大叔爱运维的博客 - CSDN 博客
前端安全系列(二):如何防止 CSRF 攻击? - 美团技术团队
traefik 自定义中间件 | coolcao 的小站
CSRF 原理和实战利用 - FreeBuf 网络安全行业门户
安全运维 - 如何在 Kubernetes 中使用注释对 ingress-nginx 及后端应用进行安全加固配置实践_唯一极客知识分享的技术博客_51CTO 博客
Kubernetes 进阶使用之 Helm,Kustomize
各种加密算法比较
Docker 的三种网络代理配置 · 零壹軒 · 笔记
本文档使用 MrDoc 发布
-
+
首页
postgresql 主从复制、主从切换_偷懒的小陈的博客 - CSDN 博客_postgresql 主从
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [blog.csdn.net](https://blog.csdn.net/m0_52544877/article/details/125449202) ### [postgresql](https://so.csdn.net/so/search?q=postgresql&spm=1001.2101.3001.7020) 主从复制、主从切换 #### 一、 不再需要配置 recovery.conf 文件 从 PostgreSQL 12 开始,在执行通过流复制来配置主备数据库的时候,不再需要配置额外配置 recovery.conf 文件了。取而代之的是在备库环境的 $PGDATA 路径下配置一个 standby.signal 文件,注意该文件是 1 个普通的文本文件,内容为空。理解起来就是,该文件是一个标识文件。如果备库通过执行 pg_ctl promote 提升为主库的话,那么该文件将自动消失。 #### 二、 备库执行基础备份时新的命令行选项 - R PostgreSQL 9.4.10 版本: ``` [postgres@psql ~]$ pg_basebackup -V pg_basebackup (PostgreSQL) 9.4.10 [postgres@psql ~]$ pg_basebackup --help pg_basebackup takes a base backup of a running PostgreSQL server. Usage: pg_basebackup [OPTION]... Options controlling the output: -D, --pgdata=DIRECTORY receive base backup into directory -F, --format=p|t output format (plain (default), tar) -r, --max-rate=RATE maximum transfer rate to transfer data directory (in kB/s, or use suffix "k" or "M") -R, --write-recovery-conf write recovery.conf after backup -T, --tablespace-mapping=OLDDIR=NEWDIR relocate tablespace in OLDDIR to NEWDIR -x, --xlog include required WAL files in backup (fetch mode) -X, --xlog-method=fetch|stream include required WAL files with specified method ``` PostgreSQL 12.8 版本: ``` [postgres@psql ~]$ pg_basebackup -V pg_basebackup (PostgreSQL) 12.8 [postgres@psql ~]$ pg_basebackup --help pg_basebackup takes a base backup of a running PostgreSQL server. Usage: pg_basebackup [OPTION]... Options controlling the output: -D, --pgdata=DIRECTORY receive base backup into directory -F, --format=p|t output format (plain (default), tar) -r, --max-rate=RATE maximum transfer rate to transfer data directory (in kB/s, or use suffix "k" or "M") -R, --write-recovery-conf write configuration for replication -T, --tablespace-mapping=OLDDIR=NEWDIR relocate tablespace in OLDDIR to NEWDIR --waldir=WALDIR location for the write-ahead log directory -X, --wal-method=none|fetch|stream include required WAL files with specified method -z, --gzip compress tar output -Z, --compress=0-9 compress tar output with given compression level ``` 从对比中,可以看到在 9.4.10 版本中,-R 选项用于创建 recovery.conf 文件,而在 12.8 版本中,-R 则是用于创建用于 replication 的配置文件,其实就是生成 $PGDATA/standby.signal 文件。 #### 三、 如何生成 standby.signal 文件 两种方式,一种是在备库执行基础备份的时候,加上 - R 选项用于自动创建 $PGDATA/standby.signal 文件: ``` [postgres@psql pg12.8]$ pwd /postgres/pg12.8 [postgres@psql pg12.8]$ ll total 20 drwxrwxr-x 2 postgres postgres 4096 Oct 19 15:01 bin drwxrwxr-x 6 postgres postgres 4096 Oct 19 15:01 include drwxrwxr-x 4 postgres postgres 4096 Oct 19 15:01 lib drwxrwxr-x 8 postgres postgres 4096 Oct 19 15:01 share [postgres@psql pg12.8]$ pg_basebackup -h 192.168.40.133 -p 5432 -U replica --password -X stream -Fp --progress -D $PGDATA -R Password: 24597/24597 kB (100%), 1/1 tablespace [postgres@psql pg12.8]$ ll data total 120 -rw------- 1 postgres postgres 224 Oct 20 15:11 backup_label drwx------ 5 postgres postgres 4096 Oct 20 15:11 base drwx------ 2 postgres postgres 4096 Oct 20 15:11 global drwx------ 2 postgres postgres 4096 Oct 20 15:11 pg_commit_ts drwx------ 2 postgres postgres 4096 Oct 20 15:11 pg_dynshmem -rw------- 1 postgres postgres 4867 Oct 20 15:11 pg_hba.conf -rw------- 1 postgres postgres 1636 Oct 20 15:11 pg_ident.conf drwx------ 4 postgres postgres 4096 Oct 20 15:11 pg_logical drwx------ 4 postgres postgres 4096 Oct 20 15:11 pg_multixact drwx------ 2 postgres postgres 4096 Oct 20 15:11 pg_notify drwx------ 2 postgres postgres 4096 Oct 20 15:11 pg_replslot drwx------ 2 postgres postgres 4096 Oct 20 15:11 pg_serial drwx------ 2 postgres postgres 4096 Oct 20 15:11 pg_snapshots drwx------ 2 postgres postgres 4096 Oct 20 15:11 pg_stat drwx------ 2 postgres postgres 4096 Oct 20 15:11 pg_stat_tmp drwx------ 2 postgres postgres 4096 Oct 20 15:11 pg_subtrans drwx------ 2 postgres postgres 4096 Oct 20 15:11 pg_tblspc drwx------ 2 postgres postgres 4096 Oct 20 15:11 pg_twophase -rw------- 1 postgres postgres 3 Oct 20 15:11 PG_VERSION drwx------ 3 postgres postgres 4096 Oct 20 15:11 pg_wal drwx------ 2 postgres postgres 4096 Oct 20 15:11 pg_xact -rw------- 1 postgres postgres 337 Oct 20 15:11 postgresql.auto.conf -rw------- 1 postgres postgres 26718 Oct 20 15:11 postgresql.conf -rw------- 1 postgres postgres 0 Oct 20 15:11 standby.signal [postgres@psql pg12.8]$ ``` 方式 2:如果在备库上执行 pg_basebackup 对主库进行备份的时候,没有使用 - R 选项的话,我们可以在备库的 $PGDATA 路径下,touch standby.signal 就好了。 记住:该文件只是一个标识文件,它的存在就是告诉数据库,当我们执行 pg_ctl start 启动的时候,当前库的角色是 standby,不是 primary 角色。 #### 四、 部署和配置环境 <table><thead><tr><th>主机</th><th>IP 地址</th><th>版本</th></tr></thead><tbody><tr><td>psql-master(主库)</td><td>192.168.40.133</td><td>psql-14</td></tr><tr><td>psql-slave(备库)</td><td>192.168.40.147</td><td>psql-14</td></tr></tbody></table> ##### 1 修改主机名 ``` [root@localhost ~]# hostnamectl set-hostname pgsql-master [root@localhost ~]# bash [root@localhost ~]# hostnamectl set-hostname pgsql-slave [root@localhost ~]# bash ``` ##### 2 配置防火墙规则,放行 5432 端口 ``` [root@pgsql-master ~]# firewall-cmd --add-port=5432/tcp --permanent success [root@pgsql-master ~]# firewall-cmd --reload success ``` ##### 3 安装 postgresql-14 ``` #安装常用工具 [root@pgsql-master ~]# yum -y install vim bash-com* #创建脚本文件 [root@pgsql-master ~]# touch install.sh [root@pgsql-master ~]# chmod +x install.sh [root@pgsql-master ~]# cat install.sh #!/bin/bash #配置pgsql网络源 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm #安装pgsql sudo yum install -y postgresql14-server #初始化 sudo /usr/pgsql-14/bin/postgresql-14-setup initdb #设置开机自启 sudo systemctl enable postgresql-14 sudo systemctl start postgresql-14 #执行脚本 [root@pgsql-master ~]# ./install.sh #查看服务是否开启 [root@pgsql-master ~]# ss -antl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:5432 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:5432 :::* LISTEN 0 100 ::1:25 :::* ``` ##### 4 配置环境变量 ``` #切换用户 [root@pgsql-master ~]# su - postgres 上一次登录:三 5月 11 13:57:38 CST 2022pts/0 上 -bash-4.2$ #配置环境变量 -bash-4.2$ vi ~/.bash_profile export PATH=$PATH:$HOME/bin:/usr/pgsql-14/bin #在最后一行下面添加此行 #添加完后执行:使它立即生效 -bash-4.2$ source ~/.bash_profile ``` ##### 5 修改 postgres 用户密码 ``` [root@pgsql-master ~]# su - postgres -bash-4.2$ -bash-4.2$ psql psql (14.2) 输入 "help" 来获取帮助信息. postgres=# postgres=# select user; user ---------- postgres (1 行记录) postgres=# postgres=# alter role postgres with password 'postgres' ; ALTER ROLE postgres=# postgres=# exit -bash-4.2$ exit ``` ##### 6 修改数据存放路径(默认的可能在 / 下,这不太安全) ``` #建目录/赋权限 mkdir -p /ofa/postgres_data hown -R postgres:root /ofa/postgres_data ls -lld /ofa drwxr-xr-x 3 root root 27 Dec 1 12:28 /ofa ls -lld /ofa/postgres_data drwxr-xr-x 2 postgres root 6 Dec 1 12:28 /ofa/postgres_data vi /var/lib/pgsql/14/data/postgresql.conf data_directory='/ofa/postgres_data' #同步数据 rsync -av /var/lib/pgsql/14/data/ /ofa/postgres_data/ #重启数据库 systemctl restart postgresql-14 ``` **也可以使用默认数据存放路径:/var/lib/pgsql/14/data/** #### 五、 执行 stream 主备配置流程 主体思路跟 PostgreSQL 11 及以前版本的配置流程大同小异,甚至是更简单一些了。 ##### 1 主库切换用户,修改监听地址 ``` [root@pgsql-master ~]# su - postgres 上一次登录:一 5月 9 10:48:28 CST 2022pts/0 上 -bash-4.2$ #修改监听地址 -bash-4.2$ psql -c "ALTER SYSTEM SET listen_addresses TO '*';" 用户 postgres 的口令: ALTER SYSTEM -bash-4.2$ #改配置文件 -bash-4.2$ vim /var/lib/pgsql/14/data/postgresql.conf ... #listen_addresses = 'localhost' # what IP address(es) to listen on; listen_addresses = '*' ... ``` ##### 2 主库创建流复制的用户 ``` 方式一: -bash-4.2$ psql -c "CREATE ROLE replicator login replication encrypted password 'postgres';" 用户 postgres 的口令: CREATE ROLE -bash-4.2$ 方式二: -bash-4.2$ createuser --replication -P -e replicator 为新角色输入的口令: 再输入一遍: 口令: SELECT pg_catalog.set_config('search_path', '', false); CREATE ROLE replicator PASSWORD 'SCRAM-SHA-256$4096:gY5s1JPnO4nueRyTiEcHEQ==$C9KLSfPPrX/9XQ9kdzzhY65E01B4AaS9g5WbEl1Bl50=:qiMzW4B+9kaZxXhfQlxu73mwf3S9TORjOBC9RWVaR9c=' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN REPLICATION; -bash-4.2$ ``` ##### 3 主库修改 pg_hba.conf 文件,允许备库 IP 通过复制用户访问数据库 ``` -bash-4.2$ vim /var/lib/pgsql/14/data/pg_hba.conf ... #在最下面添加 host replication replicator 192.168.40.147/24 md5 ... ``` 最后一行,添加了 replicaor 用户可以从备库 IP 192.168.40.147 访问主库。 ##### 4 备库备份旧数据,删掉,然后备份主库数据 ``` -bash-4.2$ mkdir /opt/psql_data -bash-4.2$ cp -R /var/lib/pgsql/14/data/ /opt/psql_data -bash-4.2$ cd /var/lib/pgsql/14/data/ -bash-4.2$ rm -rf * ``` ##### 5 备库上执行对于主库的基础备份 ``` -bash-4.2$ pg_basebackup -h 192.168.40.133 -D /var/lib/pgsql/14/data -U replicator -P -v -R -X stream -C -S pgstandby1 口令: pg_basebackup: 开始基础备份,等待检查点完成 pg_basebackup: 已完成检查点 pg_basebackup: 预写日志起始于时间点: 0/2000028, 基于时间轴1 pg_basebackup: 启动后台 WAL 接收进程 pg_basebackup: 已创建复制槽"pgstandby1" 26952/26952 kB (100%), 1/1 表空间 pg_basebackup: 预写日志结束点: 0/2000100 pg_basebackup: 等待后台进程结束流操作... pg_basebackup: 同步数据到磁盘... pg_basebackup: 将backup_manifest.tmp重命名为backup_manifest pg_basebackup: 基础备份已完成 ``` 注意,备份选项上带有 - R 选项。 ##### 4 备库就可以执行 pg_ctl start 启动了 这时,就可以看到备库服务器上自动生成了 standby.signal 文件。同时,也看到在 $PGDATA 路径下,数据库自动帮我们配置了关于流复制的主库的信息: ``` -bash-4.2$ cat data/postgresql.auto.conf # Do not edit this file manually! # It will be overwritten by the ALTER SYSTEM command. primary_conninfo = 'user=replicator password=postgres host=192.168.40.133 port=5432 sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any' ``` 当然了,如果我们没有使用 - R 来备份主库的话。我们完全可以在备库上手工创建 standby.signal 文件,然后手工编辑 postgresql.auto.conf,并在其内容中配置主库的信息。 ##### 5 备库数据库进程信息 ``` -bash-4.2$ ps -ef|grep postgres postgres 8911 1 0 Oct20 ? 00:00:00 /postgres/pg12.8/bin/postgres postgres 8912 8911 0 Oct20 ? 00:00:00 postgres: startup recovering 000000010000000000000003 postgres 8913 8911 0 Oct20 ? 00:00:00 postgres: checkpointer postgres 8914 8911 0 Oct20 ? 00:00:00 postgres: background writer postgres 8915 8911 0 Oct20 ? 00:00:00 postgres: stats collector postgres 8916 8911 0 Oct20 ? 00:00:32 postgres: walreceiver streaming 0/3000148 root 18015 18014 0 16:13 pts/0 00:00:00 su - postgres postgres 18016 18015 0 16:13 pts/0 00:00:00 -bash postgres 18055 18016 0 16:13 pts/0 00:00:00 ps -ef postgres 18056 18016 0 16:13 pts/0 00:00:00 grep --color=auto postgres ``` 备库上,可以看到 walreceiver 进程,正在读取日志 streaming 0/3000148,执行恢复 recovering 000000010000000000000003。 ##### 6 主库数据库进程信息 ``` -bash-4.2$ ps -ef|grep postgres postgres 3708 1 0 Oct20 ? 00:00:00 /postgres/pg12.8/bin/postgres postgres 3710 3708 0 Oct20 ? 00:00:00 postgres: checkpointer postgres 3711 3708 0 Oct20 ? 00:00:00 postgres: background writer postgres 3712 3708 0 Oct20 ? 00:00:00 postgres: walwriter postgres 3713 3708 0 Oct20 ? 00:00:00 postgres: autovacuum launcher postgres 3714 3708 0 Oct20 ? 00:00:00 postgres: stats collector postgres 3715 3708 0 Oct20 ? 00:00:00 postgres: logical replication launcher postgres 4174 3708 0 Oct20 ? 00:00:00 postgres: walsender replicator 192.168.40.147(57926) streaming 0/3000148 root 30410 30409 0 16:11 pts/1 00:00:00 su - postgres postgres 30411 30410 0 16:11 pts/1 00:00:00 -bash postgres 30868 30411 0 16:13 pts/1 00:00:00 ps -ef postgres 30869 30411 0 16:13 pts/1 00:00:00 grep --color=auto postgres ``` 主库上看到,后台进程 walsender,正在向 replicator 192.168.40.147(57926) streaming 0/3000148 推送日志信息。 ##### 7 主库查看数据库复制信息 ``` -bash-4.2$ psql -xc "select * from pg_stat_replication" -[ RECORD 1 ]----+------------------------------ pid | 4174 usesysid | 16384 usename | replicator application_name | walreceiver client_addr | 192.168.40.147 client_hostname | client_port | 57926 backend_start | 2021-10-20 15:45:37.817863+08 backend_xmin | state | streaming sent_lsn | 0/3000148 write_lsn | 0/3000148 flush_lsn | 0/3000148 replay_lsn | 0/3000148 write_lag | flush_lag | replay_lag | sync_priority | 0 sync_state | async reply_time | 2021-10-21 16:11:58.438541+08 ``` #### 六、 主备切换及注意事项 如果因为意外或故障导致主库不可用的情况下,可以直接将备库提升为主库对外提供服务。然后视具体情况看原来的主库是否需要重建,或者是否待故障恢复之后,可以直接作为新的备库,然后从新的主库 (原备库) 同步数据。 下面是模拟切换步骤: ##### 1 主库停止,模拟故障 ``` -bash-4.2$ ps -ef|grep postgres postgres 3708 1 0 Oct20 ? 00:00:00 /postgres/pg12.8/bin/postgres postgres 3710 3708 0 Oct20 ? 00:00:00 postgres: checkpointer postgres 3711 3708 0 Oct20 ? 00:00:00 postgres: background writer postgres 3712 3708 0 Oct20 ? 00:00:00 postgres: walwriter postgres 3713 3708 0 Oct20 ? 00:00:00 postgres: autovacuum launcher postgres 3714 3708 0 Oct20 ? 00:00:00 postgres: stats collector postgres 3715 3708 0 Oct20 ? 00:00:00 postgres: logical replication launcher postgres 4174 3708 0 Oct20 ? 00:00:00 postgres: walsender replicator 192.168.40.147(57926) streaming 0/3000148 postgres 4747 30411 0 16:42 pts/1 00:00:00 ps -ef postgres 4748 30411 0 16:42 pts/1 00:00:00 grep --color=auto postgres root 30410 30409 0 16:11 pts/1 00:00:00 su - postgres postgres 30411 30410 0 16:11 pts/1 00:00:00 -bash -bash-4.2$ pg_ctl status pg_ctl: server is running (PID: 3708) /postgres/pg12.8/bin/postgres -bash-4.2$ pg_ctl stop -m fast waiting for server to shut down.... done server stopped -bash-4.2$ ps -ef|grep postgres postgres 4843 30411 0 16:43 pts/1 00:00:00 ps -ef postgres 4844 30411 0 16:43 pts/1 00:00:00 grep --color=auto postgres root 30410 30409 0 16:11 pts/1 00:00:00 su - postgres postgres 30411 30410 0 16:11 pts/1 00:00:00 -bash -bash-4.2$ pg_ctl status pg_ctl: no server running ``` 通过 pg_ctl stop -m fast 停止原来的主库之后,数据库后台进程都没有了。 ##### 2 备库提升为新主库,对外提供服务 ``` -bash-4.2$ ps -ef|grep postgres postgres 8911 1 0 Oct20 ? 00:00:00 /postgres/pg12.8/bin/postgres postgres 8912 8911 0 Oct20 ? 00:00:00 postgres: startup recovering 000000010000000000000003 postgres 8913 8911 0 Oct20 ? 00:00:00 postgres: checkpointer postgres 8914 8911 0 Oct20 ? 00:00:00 postgres: background writer postgres 8915 8911 0 Oct20 ? 00:00:00 postgres: stats collector root 18015 18014 0 16:13 pts/0 00:00:00 su - postgres postgres 18016 18015 0 16:13 pts/0 00:00:00 -bash postgres 25404 18016 0 16:43 pts/0 00:00:00 ps -ef postgres 25405 18016 0 16:43 pts/0 00:00:00 grep --color=auto postgres -bash-4.2$ pg_ctl status pg_ctl: server is running (PID: 8911) /postgres/pg12.8/bin/postgres -bash-4.2$ pg_ctl promote waiting for server to promote.... done server promoted -bash-4.2$ ps -ef|grep postgres postgres 8911 1 0 Oct20 ? 00:00:00 /postgres/pg12.8/bin/postgres postgres 8913 8911 0 Oct20 ? 00:00:00 postgres: checkpointer postgres 8914 8911 0 Oct20 ? 00:00:00 postgres: background writer postgres 8915 8911 0 Oct20 ? 00:00:00 postgres: stats collector root 18015 18014 0 16:13 pts/0 00:00:00 su - postgres postgres 18016 18015 0 16:13 pts/0 00:00:00 -bash postgres 25622 8911 0 16:44 ? 00:00:00 postgres: walwriter postgres 25623 8911 0 16:44 ? 00:00:00 postgres: autovacuum launcher postgres 25624 8911 0 16:44 ? 00:00:00 postgres: logical replication launcher postgres 25628 18016 0 16:44 pts/0 00:00:00 ps -ef postgres 25629 18016 0 16:44 pts/0 00:00:00 grep --color=auto postgres -bash-4.2$ ``` 重要 1:启动备库为新主库的命令是 pg_ctl promote。 提升备库为主库之后,可以看到,后台进程中不再有 startup recovering,以及 walreceiver streaming 进程了。同时,多了 postgres: walwriter 写进程。 重要 2:$PGDATA/standby.signal 文件自动消失了。这是告诉 PostgreSQL,我现在不再是备库了,我的身份是主库了。 ##### 3 新主库修改 pg_hba.conf 文件 修改新主库 (原备库 192.168.40.147) 的 $PGDATA/pg_hba.conf 文件,在其中添加允许新备库 (原主库 192.168.40.133) 可以通过 replica 用户访问数据库的条目信息。 ``` host replication replicaotr 192.168.40.133/24 md5 ``` 如果不做这一步配置的话,将来启动原主库为新备库的时候,可能会遇到下述错误。 ``` 2021-10-21 17:13:20.464 CST [11394] FATAL: could not connect to the primary server: FATAL: no pg_hba.conf entry for replication connection from host "192.168.40.133", user "replica", SSL off 2021-10-21 17:13:20.466 CST [11395] FATAL: could not connect to the primary server: FATAL: no pg_hba.conf entry for replication connection from host "192.168.40.133", user "replica", SSL off ``` 注意:如果主从环境的数据库没有配置浮动 IP 的话,则这里的 IP 地址,应该直接填原主库的实际 IP 地址。 ##### 4 原主库新建 $PGDATA/standby.signal 文件 ``` -bash-4.2$ pwd /var/lib/pgsql/14/data -bash-4.2$ touch standby.signal -bash-4.2$ ll standby.signal -rw-rw-r-- 1 postgres postgres 0 Oct 21 16:54 standby.signal ``` 注意:这一步骤非常非常重要,如果不配置该文件的话,那么原来的主库一旦重新启动话,就将成为了 1 个新的独立主库,脱离了主从数据库环境。 ##### 5 原主库修改 $PGDATA/postgresql.auto.conf 文件 注意,应该用单引号,而不是双引号。否则遇到下述错误。 ``` -bash-4.2$ cat postgresql.auto.conf # Do not edit this file manually! # It will be overwritten by the ALTER SYSTEM command. primary_conninfo="user=replica password=replica host=192.168.40.147 port=5432" -bash-4.2$ -bash-4.2$ pg_ctl start -l ~/pg.log waiting for server to start.... stopped waiting pg_ctl: could not start server Examine the log output. -bash-4.2$ tailf ~/pg.log 数据库启动日志 2021-10-21 09:07:06.512 GMT [10045] LOG: syntax error in file "/postgres/pg12.8/data/postgresql.auto.conf" line 3, near token """ 2021-10-21 09:07:06.512 GMT [10045] FATAL: configuration file "postgresql.auto.conf" contains errors ``` 修改 $PGDATA/postgresql.auto.conf 配置文件为下述正确的格式: ``` -bash-4.2$ cat postgresql.auto.conf # Do not edit this file manually! # It will be overwritten by the ALTER SYSTEM command. primary_conninfo='user=replica password=replica host=192.168.40.147 port=5432' ``` ##### 6 启动原主库,变为新备库 ``` -bash-4.2$ pg_ctl start -l ~/pg.log waiting for server to start.... done server started -bash-4.2$ ps -ef|grep postgres root 8116 8115 0 16:58 pts/0 00:00:00 su - postgres postgres 8118 8116 0 16:58 pts/0 00:00:00 -bash root 8598 8597 0 17:00 pts/2 00:00:00 su - postgres postgres 8600 8598 0 17:00 pts/2 00:00:00 -bash postgres 11368 8118 0 17:13 pts/0 00:00:00 tailf pg.log postgres 11389 1 0 17:13 ? 00:00:00 /postgres/pg12.8/bin/postgres postgres 11390 11389 0 17:13 ? 00:00:00 postgres: startup recovering 000000020000000000000003 postgres 11391 11389 0 17:13 ? 00:00:00 postgres: checkpointer postgres 11392 11389 0 17:13 ? 00:00:00 postgres: background writer postgres 11393 11389 0 17:13 ? 00:00:00 postgres: stats collector postgres 11440 11389 0 17:13 ? 00:00:00 postgres: walreceiver streaming 0/3013AC8 postgres 12545 30411 0 17:18 pts/1 00:00:00 ps -ef postgres 12546 30411 0 17:18 pts/1 00:00:00 grep --color=auto postgres root 30410 30409 0 16:11 pts/1 00:00:00 su - postgres postgres 30411 30410 0 16:11 pts/1 00:00:00 -bash -bash-4.2$ tailf pg.log 2021-10-21 17:13:45.488 CST [11440] LOG: fetching timeline history file for timeline 2 from primary server 2021-10-21 17:13:45.493 CST [11440] LOG: started streaming WAL from primary at 0/3000000 on timeline 1 2021-10-21 17:13:45.493 CST [11440] LOG: replication terminated by primary server 2021-10-21 17:13:45.493 CST [11440] DETAIL: End of WAL reached on timeline 1 at 0/30001C0. 2021-10-21 17:13:45.494 CST [11390] LOG: new target timeline is 2 2021-10-21 17:13:45.494 CST [11440] LOG: restarted WAL streaming at 0/3000000 on timeline 2 2021-10-21 17:13:45.539 CST [11390] LOG: redo starts at 0/30001C0 ``` 这样,就完成了一次主从数据库环境的切换操作了。 #### 七、小结 1. 随着新版本的发行,数据库的配置和使用也越来越简单顺手了。 2. 备库提升为主库的命令:pg_ctl promote; 3. 新主库 (原备库) 的 pg_hba.conf 文件,要开放允许流复制访问数据库的信息给原主库的 IP 地址; 4. 原主库配置为新备库的时候,务必要创建 $PGDATA/standby.signal 文件; 5. 原主库配置为新备库的时候,务必要修改 $PGDATA/postgresql.auto.conf 文件,添加主库 primary_conninfo 的信息;
幻翼
2022年10月12日 09:24
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码