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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 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
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3月前
|
负载均衡 算法 调度
负载均衡原理分析与源码解读
负载均衡原理分析与源码解读
|
3月前
|
消息中间件 负载均衡 Kafka
Kafka 实现负载均衡与故障转移:深入分析 Kafka 的架构特点与实践
【8月更文挑战第24天】Apache Kafka是一款专为实时数据处理和流传输设计的高性能消息系统。其核心设计注重高吞吐量、低延迟与可扩展性,并具备出色的容错能力。Kafka采用分布式日志概念,通过数据分区及副本机制确保数据可靠性和持久性。系统包含Producer(消息生产者)、Consumer(消息消费者)和Broker(消息服务器)三大组件。Kafka利用独特的分区机制实现负载均衡,每个Topic可以被划分为多个分区,每个分区可以被复制到多个Broker上,确保数据的高可用性和可靠性。
69 2
|
4月前
|
负载均衡 NoSQL 应用服务中间件
搭建高可用及负载均衡的Redis
【7月更文挑战第10天】
135 1
|
4月前
|
负载均衡 安全 Cloud Native
云上负载均衡:构建高可用、高性能的网络应用架构
与云原生技术深度融合:随着云原生技术的普及和发展未来的云上负载均衡将更加紧密地与云原生技术相结合。例如与Kubernetes等容器编排平台集成实现自动化的服务发现和路由管理;与Serverless架构结合提供无缝的流量接入和请求处理能力。 安全性能提升:面对日益严峻的网络安全威胁云上负载均衡将更加注重安全性能的提升。通过引入加密传输、访问控制、DDoS防护等安全措施确保网络流量的安全性和隐私性;同时还将建立完善的安全监控和应急响应机制以应对各种安全事件和突发事件。 支持多协议和多场景:未来的云上负载均衡将支持更多种类的网络协议和应用场景以满足不同用户和业务的需求。例如支持HTTP/2、
238 0
|
4月前
|
负载均衡 算法 Java
实现高可用和可扩展的负载均衡系统的Java方法
实现高可用和可扩展的负载均衡系统的Java方法
|
5月前
|
负载均衡 应用服务中间件 开发工具
技术笔记:nginx和keeplive实现负载均衡高可用
技术笔记:nginx和keeplive实现负载均衡高可用
|
6月前
|
负载均衡 关系型数据库 分布式数据库
【PolarDB开源】PolarDB读写分离实践:优化读取性能与负载均衡策略
【5月更文挑战第26天】PolarDB是云原生关系型数据库,通过读写分离优化性能和扩展性。它设置主节点处理写操作,从节点处理读操作,异步复制保证数据一致性。优化读取性能的策略包括增加从节点数量、使用只读实例和智能分配读请求。负载均衡策略涉及基于权重、连接数和地理位置的分配。实践示例中,电商网站通过主从架构、只读实例和负载均衡策略提升商品查询效率。PolarDB的读写分离与负载均衡为企业应对大数据和高并发提供了有效解决方案。
236 0
|
5月前
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
122 2
|
4月前
|
负载均衡 算法 应用服务中间件
nginx自定义负载均衡及根据cpu运行自定义负载均衡
nginx自定义负载均衡及根据cpu运行自定义负载均衡
82 1
|
4月前
|
运维 负载均衡 算法
SLB与NGINX的异同是什么
SLB与NGINX的异同是什么
434 2