Pgpool-II实现高可用+读写分离+负载均衡(七)---- recovery_1st_stage分析

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: recovery_1st_stage是Pgpool online recovery的第一阶段,位于PG_DATA目录下,主要功能就是使用pg_basebackup恢复(recovery)从节点。


#!/bin/bash# This script is executed by "recovery_1st_stage" to recovery a Standby node.set-o xtrace
# 参数1 - master节点PGDATA目录PRIMARY_NODE_PGDATA="$1"# 参数2 - 目的节点主机名或IPDEST_NODE_HOST="$2"# 参数3 - 目的节点PGDATA目录DEST_NODE_PGDATA="$3"# 参数4 - 主节点端口号PRIMARY_NODE_PORT="$4"# 参数5 - 目的节点ID(对应etc目录下的pgpool_node_id文件内容)DEST_NODE_ID="$5"# 参数6 - 目的节点端口号DEST_NODE_PORT="$6"# 参数7 - 主节点主机名或IPPRIMARY_NODE_HOST="$7"# pg安装目录PGHOME=/usr/local/pgsql16
# archive log目录ARCHIVEDIR=/data01/pgsql16/archive
# 流复制用户名REPLUSER=replica
# 复制槽名REPL_SLOT_NAME=${DEST_NODE_HOST//[-.]/_}# PostgreSQL数据库启动用户POSTGRESQL_STARTUP_USER=postgres
# ssh免密登录密钥文件名SSH_KEY_FILE=id_rsa
SSH_OPTIONS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ~/.ssh/${SSH_KEY_FILE}"echo recovery_1st_stage: start: pg_basebackup for Standby node$DEST_NODE_ID## 测试ssh免密登录ssh-T${SSH_OPTIONS}${POSTGRESQL_STARTUP_USER}@${DEST_NODE_HOST}ls /tmp > /dev/null
if [ $?-ne0 ]; thenecho recovery_1st_stage: passwordless SSH to ${POSTGRESQL_STARTUP_USER}@${DEST_NODE_HOST} failed. Please setup passwordless SSH.
exit1fi## 获取PostgreSQL主版本号PGVERSION=`${PGHOME}/bin/initdb -V | awk '{print $3}' | sed 's/\..*//' | sed 's/\([0-9]*\)[a-zA-Z].*/\1/'`if [ $PGVERSION-ge12 ]; thenRECOVERYCONF=${DEST_NODE_PGDATA}/myrecovery.conf
elseRECOVERYCONF=${DEST_NODE_PGDATA}/recovery.conf
fi## 创建复制槽 "${REPL_SLOT_NAME}"${PGHOME}/bin/psql -h${PRIMARY_NODE_HOST}-p${PRIMARY_NODE_PORT} postgres \
-c"SELECT pg_create_physical_replication_slot('${REPL_SLOT_NAME}');"  >/dev/null 2>&1
if [ $?-ne0 ]; thenecho ERROR: recovery_1st_stage: create replication slot \"${REPL_SLOT_NAME}\" failed. You may need to create replication slot manually.
fi## 执行pg_basebackup恢复从节点ssh-T${SSH_OPTIONS}${POSTGRESQL_STARTUP_USER}@$DEST_NODE_HOST"    set -o errexit    # 删除从节点PG_DATA目录    [ -d \"${DEST_NODE_PGDATA}\" ] && rm -rf ${DEST_NODE_PGDATA}    # 删除从节点archive log目录    [ -d \"${ARCHIVEDIR}\" ] && rm -rf ${ARCHIVEDIR}/*    # 执行pg_basebackup${PGHOME}/bin/pg_basebackup -h $PRIMARY_NODE_HOST -U $REPLUSER -p $PRIMARY_NODE_PORT -D $DEST_NODE_PGDATA -X stream    # 创建从节点流复制配置文件    cat > ${RECOVERYCONF} << EOTprimary_conninfo = 'host=${PRIMARY_NODE_HOST} port=${PRIMARY_NODE_PORT} user=${REPLUSER} application_name=${DEST_NODE_HOST} passfile=''/home/postgres/.pgpass'''recovery_target_timeline = 'latest'restore_command = 'scp ${SSH_OPTIONS}${PRIMARY_NODE_HOST}:${ARCHIVEDIR}/%f %p'primary_slot_name = '${REPL_SLOT_NAME}'EOT    # 修改postgresql.conf,加入加载流复制配置文件的设置    if [ ${PGVERSION} -ge 12 ]; then        sed -i -e \"\\\$ainclude_if_exists = '$(echo ${RECOVERYCONF} | sed -e 's/\//\\\//g')'\" \               -e \"/^include_if_exists = '$(echo ${RECOVERYCONF} | sed -e 's/\//\\\//g')'/d\" ${DEST_NODE_PGDATA}/postgresql.conf        # 生成从节点标志文件                       touch ${DEST_NODE_PGDATA}/standby.signal    else        echo \"standby_mode = 'on'\" >> ${RECOVERYCONF}    fi    sed -i \        -e \"s/#*port = .*/port = ${DEST_NODE_PORT}/\" \        -e \"s@#*archive_command = .*@archive_command = 'cp \\\"%p\\\" \\\"${ARCHIVEDIR}/%f\\\"'@\" \${DEST_NODE_PGDATA}/postgresql.conf"if [ $?-ne0 ]; then# 如果pg_basebackup失败,删除前面创建的复制槽${PGHOME}/bin/psql -h${PRIMARY_NODE_HOST}-p${PRIMARY_NODE_PORT} postgres \
-c"SELECT pg_drop_replication_slot('${REPL_SLOT_NAME}');"  >/dev/null 2>&1
if [ $?-ne0 ]; thenecho ERROR: recovery_1st_stage: drop replication slot \"${REPL_SLOT_NAME}\" failed. You may need to drop replication slot manually.
fiecho ERROR: recovery_1st_stage: end: pg_basebackup failed. online recovery failed
exit1fiecho recovery_1st_stage: end: recovery_1st_stage is completed successfully
exit0
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
3月前
|
存储 缓存 运维
解密一致性哈希算法:实现高可用和负载均衡的秘诀
解密一致性哈希算法:实现高可用和负载均衡的秘诀
174 0
|
4月前
|
Kubernetes 负载均衡 监控
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
|
4月前
|
缓存 负载均衡 应用服务中间件
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
在本章内容中,我们将深入探讨 Tomcat 服务器的运行架构、LVS 负载均衡的运行机制以及 Cache 缓存机制,并提供相应的解决方案和指导。通过理解这些关键概念和机制,您将能够优化您的系统架构,提高性能和可扩展性。
208 4
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
|
5月前
|
tengine Kubernetes Cloud Native
Tengine-Ingress 高性能高可用的云原生网关
Tengine-Ingress 高性能高可用的云原生网关
|
6月前
|
负载均衡 算法 网络协议
Keepalived+LVS搭建高可用负载均衡
Keepalived+LVS搭建高可用负载均衡
187 1
|
6月前
|
负载均衡 关系型数据库 PostgreSQL
Pgpool-II实现高可用+读写分离+负载均衡(八)---- 维护工具
Pgpool提供了一些维护工具,用于日常观察Pgpool运行状态、上线、下线节点等操作。主要有:pcp_stop_pgpool,pcp_node_count,pcp_node_info,pcp_health_check_stats,pcp_proc_count,pcp_proc_info,pcp_detach_node,pcp_attach_node,pcp_recovery_node,pcp_promote_node,pcp_pool_status,pcp_watchdog_info,pcp_reload_config
192 0
|
6月前
|
负载均衡 前端开发 网络协议
Keepalived+HAProxy 搭建高可用负载均衡(二)
Keepalived+HAProxy 搭建高可用负载均衡
|
23天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
35 0
|
4月前
|
负载均衡 应用服务中间件 nginx
百度搜索:蓝易云【Nginx和tomcat实现负载均衡教程】
至此,你已经成功地使用Nginx和Tomcat实现了负载均衡。Nginx将根据配置的负载均衡策略将客户端请求分发到多个Tomcat服务器上,以提高系统的性能和可用性。请注意,在实际生产环境中,还需要进行其他配置和优化,如健康检查、会话保持等,以满足具体的需求。
35 0
|
13天前
|
负载均衡 应用服务中间件 nginx
Nginx 负载均衡
Nginx 负载均衡
23 2