Pgpool-II实现高可用+读写分离+负载均衡(四)---- failover.sh分析

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: Pgpool-II故障转移脚本failover.sh分析


#!/bin/bash# This script is run by failover_command.set-o xtrace
# Special values:# 1)  %d = failed node id# 2)  %h = failed node hostname# 3)  %p = failed node port number# 4)  %D = failed node database cluster path# 5)  %m = new main node id# 6)  %H = new main node hostname# 7)  %M = old main node id# 8)  %P = old primary node hostname# 9)  %r = new main port number# 10) %R = new main database cluster path# 11) %N = old primary node hostname# 12) %S = old primary node port number# 13) %% = '%' characterFAILED_NODE_ID="$1"FAILED_NODE_HOST="$2"FAILED_NODE_PORT="$3"FAILED_NODE_PGDATA="$4"NEW_MAIN_NODE_ID="$5"NEW_MAIN_NODE_HOST="$6"OLD_MAIN_NODE_ID="$7"OLD_PRIMARY_NODE_ID="$8"NEW_MAIN_NODE_PORT="$9"NEW_MAIN_NODE_PGDATA="${10}"OLD_PRIMARY_NODE_HOST="${11}"OLD_PRIMARY_NODE_PORT="${12}"# PostgreSQL目录PGHOME=/usr/local/pgsql16
# 复制槽名称REPL_SLOT_NAME=${FAILED_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 failover.sh: start: failed_node_id=$FAILED_NODE_IDfailed_host=$FAILED_NODE_HOST \
old_primary_node_id=$OLD_PRIMARY_NODE_IDnew_main_node_id=$NEW_MAIN_NODE_IDnew_main_host=$NEW_MAIN_NODE_HOST## If there's no main node anymore, skip failover.if [ $NEW_MAIN_NODE_ID-lt0 ]; thenecho failover.sh: All nodes are down. Skipping failover.
exit0fi## 检查是否可以免密登录指定节点ssh-T${SSH_OPTIONS}${POSTGRESQL_STARTUP_USER}@${NEW_MAIN_NODE_HOST}ls /tmp > /dev/null
if [ $?-ne0 ]; thenecho failover.sh: passwordless SSH to ${POSTGRESQL_STARTUP_USER}@${NEW_MAIN_NODE_HOST} failed. Please setup passwordless SSH.
exit1fi## 如果down机的是从节点,跳过if [ $OLD_PRIMARY_NODE_ID !="-1"-a$FAILED_NODE_ID !=$OLD_PRIMARY_NODE_ID ]; then# If Standby node is down, drop replication slot.${PGHOME}/bin/psql -h${OLD_PRIMARY_NODE_HOST}-p${OLD_PRIMARY_NODE_PORT} postgres \
-c"SELECT pg_drop_replication_slot('${REPL_SLOT_NAME}');"  >/dev/null 2>&1
if [ $?-ne0 ]; thenecho ERROR: failover.sh: drop replication slot \"${REPL_SLOT_NAME}\" failed. You may need to drop replication slot manually.
fiecho failover.sh: end: standby node is down. Skipping failover.
exit0fi## 如果down机的是主节点,则提升指定从节点为主节点## 新的从节点由Pgpool投票选出echo failover.sh: primary node is down, promote new_main_node_id=$NEW_MAIN_NODE_ID on ${NEW_MAIN_NODE_HOST}.
## ssh到新的主节点并执行pg_ctl -D $PG_HOME promote提升从节点ssh-T${SSH_OPTIONS}${POSTGRESQL_STARTUP_USER}@${NEW_MAIN_NODE_HOST}${PGHOME}/bin/pg_ctl -D${NEW_MAIN_NODE_PGDATA}-w promote
## 提升失败退出,返回1if [ $?-ne0 ]; thenecho ERROR: failover.sh: promote failed
exit1fi## 提示提升成功并退出,返回0echo failover.sh: end: new_main_node_id=$NEW_MAIN_NODE_ID on ${NEW_MAIN_NODE_HOST} was successfully promoted to primary
exit0

脚本相对比较好理解,本脚本是故障转移的第一步。Pgpool-II检测到主库down机,则投票选举出新的主服务器,然后ssh到新主机上调用pg_ctl promote提升从节点。该脚本总共有12个参数:

# 1)  %d = 失效节点ID(对应该主机PGPOOL_HOME/etc/pgpool_node_id文件里的ID)

# 2)  %h = 失效节点名

# 3)  %p = 失效节点端口号

# 4)  %D = 失效节点PG_DATA目录

# 5)  %m = 新主节点ID(对应该PGPOOL_HOME/etc/pgpool_node_id文件里的ID

# 6)  %H = 新主节点主机名

# 7)  %M = 旧主节点ID

# 8)  %P = 旧主节点主机名

# 9)  %r = 新主节点端口号

# 10) %R = 新主节点PG_DATA目录

# 11) %N = 旧主节点主机名

# 12) %S = 旧主节点端口号

注意:这里失效节点并不一定就是旧主节点,所以要分别设置参数。


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