repmgr安装及常用运维指令

简介

repmgr 由 EDB 与其他个人和组织的贡献一起开发,安装部署相对较为简单

安装

repmgr官网上传对应的安装到服务器上
安装前/etc/hosts IP映射、始终同步、免密通信本文忽略
repmgr的安装相对较为简单,目前repmgr-5仅仅支持到postgresql-15

postgresql必要参数配置

shared_preload_libraries = 'repmgr'
wal_log_hints = on
synchronous_standby_names = '*'
archive_mode = on		
archive_command = 'test ! -f /home/postgres/archivedir/%f && cp %p /home/postgres/archivedir/%f'	
安装必要依赖

yum install -y 	flex libselinux-devel libxml2-devel libxslt-devel openssl-devel pam-devel readline-devel
# 或使用以下指令sudo yum check-update -ysudo yum groupinstall "Development Tools" -ysudo yum install yum-utils openjade docbook-dtds docbook-style-dsssl docbook-style-xsl -ysudo yum-builddep postgresql96 -y
# 安装repmgr
tar -zxvf repmgr-5.4.1.tar.gz 
cd repmgr-5.4.1/
./configure && make install
# 数据库创建repmgr数据库createuser -s repmgrcreatedb repmgr -O repmgr
# 修改repmgr用户的seach_path
ALTER USER repmgr SET search_path TO repmgr, "$user", public;#  配置repmgr配置项目node_id=134			 
node_name='vm134'			 
conninfo='host=vm134 user=repmgr dbname=repmgr'			 
data_directory='/home/postgres/pg/data'		 
replication_user='repmgr'	 
use_replication_slots=true	 
pg_bindir='/home/postgres/pg/bin'				
ssh_options='-q -o ConnectTimeout=10'	## 测试链接参数是否正常  使用
psql 'host=vm134 user=repmgr dbname=repmgr connect_timeout=2' 链接测试

image.png

postgresql白名单配置
repmgr需要设置trust 登录

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    repmgr     repmgr          10.0.0.136/32     trust
host    repmgr     repmgr          10.0.0.135/32     trust
host    repmgr     repmgr          10.0.0.134/32     trust
host    all             all             0.0.0.0/0       scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128       scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     repmgr          10.0.0.136/32     trust
host    replication     repmgr          10.0.0.135/32     trust
host    replication     repmgr          10.0.0.134/32     trust
host    replication     all             0.0.0.0/0     scram-sha-256
host    replication     repmgr          ::1/128       scram-sha-256
创建postgresql守护进程
## sudo vim /etc/systemd/system/postgresql.service
[Unit]
Description=PostgreSQL database server
After=network.target[Service]
Type=forking
User=postgres
Group=postgres# 设置环境变量(可选,根据需要修改)
Environment=PGDATA=/home/postgres/pg/data
ExecStart=/home/postgres/pg/bin/pg_ctl start -D ${PGDATA}
ExecStop=/home/postgres/pg/bin/pg_ctl stop -D ${PGDATA}
ExecReload=/home/postgres/pg/bin/pg_ctl reload -D ${PGDATA}# 重启策略
Restart=on-failure
RestartSec=5s[Install]
WantedBy=multi-user.target
注册主节点
repmgr -f  repmgr.conf primary register
# 查看集群状态
repmgr -f  repmgr.conf cluster show

image.png

注册克隆节点
repmgr -h vm134 -U repmgr -d repmgr -f  repmgr.conf standby clone --dry-runrepmgr -h vm134 -U repmgr -d repmgr -f  repmgr.conf standby clone## 启动数据库
pg_ctl start 
#进行注册
repmgr -f  repmgr.conf standby register
查看集群状态
repmgr -f  repmgr.conf cluster show

image.png
image.png

修改配置文件路径

将repmgr.conf文件移动到以下路径,可以避免每一次指令添加-f的繁琐
[root@vm134 ~]# pg_config --sysconfdir
/home/postgres/pg/etc

常用指令

查看集群状态
repmgr  cluster show
克隆节点(也可做备份)
repmgr -h vm135 -U repmgr -d repmgr   standby clone  
移除集群节点
repmgr  standby unregister --force --node-id=136
加入集群
 repmgr standby register --force ## 以备库身份加入
repmgr witness register     ## 以见证者身份加入
repmgr primary register    ## 以主库身份加入
手工主从切换
当前主库停库
pg_ctl stop 新主库进行升主
repmgr   standby promote其余从库follow新主库repmgr standby follow 旧主库rewind追日志
repmgr  node rejoin -d 'host=10.0.0.134 dbname=repmgr user=repmgr ' --force-rewindrewind  执行失败的时候使用以下指令组合,将旧的主节点注销重新以备节点身份加入移除节点
repmgr  primary unregister --force --node-id=136
重新克隆
repmgr -h vm135 -U repmgr -d repmgr   standby clone
重新加入repmgr standby register --force

使用pg_rewind 的时候可以使用pg_checksums -e 打开–data-checksums功能

[postgres@vm134 ~]$ pg_checksums  -e 
Checksum operation completed
Files scanned:   1254
Blocks scanned:  3834
Files written:  1035
Blocks written: 3834
pg_checksums: syncing data directory
pg_checksums: updating control file
Checksums enabled in cluster

配置autofailover

配置repmgr守护进程

#vim /usr/lib/systemd/system/repmgr.service[Unit]
Description=A replication manager, and failover management tool for PostgreSQL
After=syslog.target
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
# PID file
PIDFile=/home/postgres/pg/data/repmgrd.pid
# Location of repmgr conf file:
Environment=REPMGRDCONF=/home/postgres/pg/etc/repmgr.conf
Environment=PIDFILE=/home/postgres/pg/data/repmgrd.pid
# Where to send early-startup messages from the server 
# This is normally controlled by the global default set by systemd
# StandardOutput=syslog
ExecStart=/home/postgres/pg/bin/repmgrd -f ${REPMGRDCONF} --pid-file ${PIDFILE} -d --verbose
ExecStop=/usr/bin/kill -TERM $MAINPID
ExecReload=/usr/bin/kill -HUP $MAINPID
# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300
[Install]
WantedBy=multi-user.target

修改配置文件内容

node_id=136			 ## 每个主机唯一整数		
node_name='vm136'		## 每个主机唯一字符		 
conninfo='host=vm136 user=repmgr dbname=repmgr connect_timeout=2 password=repmgr'	## 链接到本地数据库				 
data_directory='/home/postgres/pg/data'		 
config_directory='/home/postgres/pg/data/postgresql.conf'		 
replication_user='repmgr'	 
replication_type='physical'	 
location='ShangHai'		  ## 此参数与主库同名的会优先升主,优于priority
use_replication_slots=true	 
log_level='INFO'		 
log_facility='STDERR'		 
log_file='/home/postgres/repmgrd.log'			 
pg_bindir='/home/postgres/pg/bin'				
ssh_options='-q -o ConnectTimeout=10'	
restore_command='cp /home/postgres/archivedir/%f %p'			
shutdown_check_timeout=3	
standby_reconnect_timeout=3		
wal_receive_check_timeout=3	
node_rejoin_timeout=3	
failover='automatic'			
priority=100		 ## 	升主的优先等级值越高,优先级别越高	
connection_check_type='query' 		
reconnect_attempts=3			
reconnect_interval=3			
promote_command='/home/postgres/pg/bin/repmgr standby promote -f /home/postgres/pg/etc/repmgr.conf --log-to-file && /home/postgres/pg/etc/repmgr_manage_vip.sh add'		
follow_command='/home/postgres/pg/bin/repmgr standby follow -f home/postgres/pg/etc/repmgr.conf  --upstream-node-id=%n '			
monitoring_history=true			
monitor_interval_secs=2		
degraded_monitoring_timeout=-1		
standby_disconnect_on_failover=true	
sibling_nodes_disconnect_timeout=3
primary_visibility_consensus=false	
always_promote=true			
failover_validation_command='/home/postgres/pg/etc/repmgr_manage_vip.sh  del'		
election_rerun_interval=3		
service_start_command = 'sudo systemctl start postgresql'
service_stop_command = 'sudo systemctl stop postgresql'
service_restart_command = 'sudo systemctl restart postgresql'
service_reload_command = 'sudo systemctl reload postgresql'
repmgrd_service_start_command = 'sudo systemctl start repmgr.service'
repmgrd_service_stop_command = 'sudo systemctl stop repmgr.service'

新增VIP管理脚本repmgr_manage_vip.sh

#!/bin/bashVIP="10.0.0.133"
NETMASK="24"
INTERFACE="ens33"
REMOTE_USER="postgres"
LOG_FILE="/home/postgres/repmgrd.log"# 检查本地是否已绑定 VIP
function is_vip_on_local() {ip addr show dev "$INTERFACE" | grep -q "$VIP/$NETMASK"return $? # 返回 0 表示已绑定,非零表示未绑定
}# 检查 VIP 是否可达
function is_vip_pingable() {ping -c 1 -W 1 "$VIP" &>/dev/nullreturn $? # 返回 0 表示可达,非零表示不可达
}# 删除远程主机上的 VIP
function remove_vip_remote() {local remote_host="$1"for i in {1..3}; do# 通过 SSH 在远程主机删除 VIPssh "$REMOTE_USER@$remote_host" "sudo ip addr del '$VIP/$NETMASK' dev '$INTERFACE'" && {echo "$(date '+%Y-%m-%d %H:%M:%S') - VIP $VIP 从 $remote_host 上移除成功" >> "$LOG_FILE"return 0}echo "$(date '+%Y-%m-%d %H:%M:%S') - 尝试从 $remote_host 移除 VIP 失败,重试中..." >> "$LOG_FILE"sleep 1doneecho "$(date '+%Y-%m-%d %H:%M:%S') - VIP $VIP 从 $remote_host 上移除失败" >> "$LOG_FILE"return 1
}# 注册 VIP 到本地
function add_vip_local() {sudo ip addr add "$VIP/$NETMASK" dev "$INTERFACE"if [ $? -eq 0 ]; thenecho "$(date '+%Y-%m-%d %H:%M:%S') - VIP $VIP 成功注册到本地 $INTERFACE." >> "$LOG_FILE"return 0elseecho "$(date '+%Y-%m-%d %H:%M:%S') - VIP $VIP 注册到本地失败." >> "$LOG_FILE"return 1fi
}# 主逻辑
case "$1" inadd)if is_vip_on_local; then# 如果 VIP 已经绑定到本地,则什么也不做,返回状态 0echo "VIP $VIP 已经注册在本地主机,无需重复操作."exit 0else# 如果 VIP 不在本地,尝试远程删除并本地注册if is_vip_pingable; thenremote_host=$(ping -c 1 "$VIP" | grep -oP '\d+\.\d+\.\d+\.\d+')remove_vip_remote "$remote_host" && add_vip_localelse# 如果 VIP 不可达,直接在本地注册add_vip_localfiexit $? # 返回 add_vip_local 或 remove_vip_remote 的退出状态fi;;del)if is_vip_on_local; then# 如果 VIP 在本地,什么也不做,返回状态 0echo "VIP $VIP 已经绑定到本地主机,无需删除."exit 0else# 如果 VIP 不在本地,尝试远程删除if is_vip_pingable; thenremote_host=$(ping -c 1 "$VIP" | grep -oP '\d+\.\d+\.\d+\.\d+')remove_vip_remote "$remote_host"elseecho "VIP $VIP 不可达,无法删除."exit 1fiexit $? # 返回 remove_vip_remote 的退出状态fi;;*)echo "无效的操作参数。请使用 'add' 或 'del' 参数。"exit 1;;
esac

为postgres配置sudo免密权限

postgres ALL=(ALL) NOPASSWD: /bin/systemctl * postgresql, \/bin/systemctl * repmgr, \
/usr/sbin/ip addr * \

配置相关路径

创建归档路径
mkdir -p /home/postgres/archiver/
使用指令调试路径是否正确
repmgrd -f /home/postgres/pg/etc/repmgr.conf --pid-file /home/postgres/pg/data/repmgrd.pid --verbose查看日志  启动正常时,使用守护进程启动。

在repmgr安装完成后会创建一个repmgr、repmgrd两个工具,repmgr主要是对集群的管理工具,repmgrd主要是管理进程管理工具。

相关运维指令

单节点指定指令
查看集群状态

repmgr service status 
repmgr cluster show 

image.png

暂停服务

repmgr service pause 
#此时集群不会发生故障切换,流传输仍然保持正常查看暂停状态,此时的Paused并不会马上展示出来
repmgr service status  repmgr service unpause

image.png

阶段运行状态检查

 repmgr node check repmgr node status
## 输出信息可用于故障排查的

image.png

执行checkpoint

repmgr node service --action=restart --checkpoint 
## action 可以是"start", "stop", "restart" or "reload",避免停服导致的数据丢失

image.png

停止,启动repmgr

 repmgr daemon  stop repmgr daemon  start 
## 调用参数配置的repmgrd_service_stop_command 、repmgrd_service_stop_command 指令。默认情况下是停留15秒之后才会执行参数的指令   repmgr daemon  stop --no-wait   repmgr daemon  start 	--no-wait   
使用--no-wait  会立即停止或者启动

启停postgresql

重启postgresql,要求配置service_restart_command
repmgr node service --action=restart
启动postgresql,要求配置service_start_command
repmgr node service --action=start
停止postgresql,要求配置service_stop_command
repmgr node service --action=stop
加载postgresql,要求配置service_reload_command
repmgr node service --action=reload指令后缀增加--list-actions参数,可以查看对应指令指向的配置参数值repmgr node service --action=restart  --list-actions
repmgr node service  --list-actions

image.png
备库升主

## 备库升主有以下两个指令,不推荐使用promote ,执行切换前使用 --dry-run进行预检查,执行切换都需要停掉当前的主库
repmgr standby promote --dry-run 
等价于repmgr node service   --action=promote --dry-run
使用node service的时候 增加--list-actions --dry-run  预先查看参数配置是否齐全##promote 需要预先停掉当前主库,使用repmgr node service --action=stop --checkpoint ,升主成功之后,使用repmgr node rejoin -d'host=vm136 user=repmgr dbname=repmgr' 在此加入到新的主库中去。

image.png
image.png
切换后的状态
image.png

使用switchover 进行切换

repmgr standby switchover --siblings-follow  --force-rewind --dry-run

image.png
去掉dry-run 之后正式执行切换。
image.png

使用–siblings-follow 参数会自动将其余备库更新follow新的主库

更新配置信息表

repmgr standby register --force  ## 强制再次注册才会更新配置文件路径
## 该库下会存放着集群的监控信息以及元数据信息。该库信息不可轻易变动
\c repmgr repmgr 

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477929.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv-python 分离边缘粘连的物体(距离变换)

import cv2 import numpy as np# 读取图像,这里添加了判断图像是否读取成功的逻辑 img cv2.imread("./640.png") # 灰度图 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊 gray cv2.GaussianBlur(gray, (5, 5), 0) # 二值化 ret, binary cv2…

SATA接口不通分析案例分享

问题: 反馈有台NVR的某个接口SATA不通(共有4个SATA接口,采用SATA HUB JMB575),挂载硬盘不上。 分析: 1、直接对换问题口SATA1与正常口SATA2的SATA数据线,SATA1口还是异常,挂在不上…

【Web前端】如何构建简单HTML表单?

HTML 表单是 Web 开发中非常重要的组成部分。它们是与用户交互的主要方式,能够收集用户输入的数据。表单的灵活性使它们成为 HTML 中最复杂的结构之一,但若使用正确的结构和元素,可以确保其可用性和无障碍性。 表单的基本结构 HTML 表单使用…

Flutter:AnimatedIcon图标动画,自定义Icon通过延时Interval,实现交错式动画

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// late延迟初始化 AnimationControllerlate AnimationController _controller;overridevoid initStat…

PyQt学习笔记

一.PyQt5的安装 当我们安装好开发环境后&#xff0c;打开pycharm在其设置里面点击按钮自动安装即可。 安装完成后我们会在这里面看到这几个东西说明安装成功了。 二.PyQt5 GUI程序框架 1.一个简单的PyQt5应用程序 首先我们用pycharm创建一个demo.py的文件。 我们创建文件为s…

HTML5好看的音乐播放器多种风格(附源码)

文章目录 1.设计来源1.1 音乐播放器风格1效果1.2 音乐播放器风格2效果1.3 音乐播放器风格3效果1.4 音乐播放器风格4效果1.5 音乐播放器风格5效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&…

ReactPress(阮一峰推荐工具):一款基于Next.js的免费开源博客CMS系统

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 此项目是用于构建博客网站的&#xff0c;包含前台展示、管理后台和后端。 此项目是基于 React antd NestJS NextJS MySQL 的&#xff0c;项目已经开源&#xff0c;项目地址在 …

pytorch自定义算子导出onnx

文章目录 1、为什么要自定义算子&#xff1f;2、如何自定义算子3、自定义算子导出onnx4、example1、重写一个pytorch 自定义算子&#xff08;实现自定义激活函数&#xff09;2、现有算子上封装pytorch 自定义算子&#xff08;实现动态放大超分辨率模型&#xff09; 1、为什么要…

构建高效在线教育:SpringBoot课程管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理在线课程管理系统的相关信息成为必然。开发…

CSS3新特性——字体图标、2D、3D变换、过渡、动画、多列布局

目录 一、Web字体 二、字体图标 三、2D变换 1.位移 &#xff08;1&#xff09;浮动 &#xff08;2&#xff09;相对定位 &#xff08;3)绝对定位和固定定位 &#xff08;4&#xff09;位移 用位移实现盒子的水平垂直居中 2.缩放 利用缩放调整字体到12px以下&#xff…

python Flask指定IP和端口

from flask import Flask, request import uuidimport json import osapp Flask(__name__)app.route(/) def hello_world():return Hello, World!if __name__ __main__:app.run(host0.0.0.0, port5000)

linux ubuntu的脚本知

目录 一、变量的引用 二、判断指定的文件是否存在 三、判断目录是否存在 四、判断最近一次命令执行是否成功 五、一些比较符号 六、"文件"的读取和写入 七、echo打印输出 八、ubuntu切换到root用户 N、其它可以参考的网址 脚本功能强大&#xff0c;用起来也…

C++(进阶) 第1章 继承

C&#xff08;进阶) 第1章 继承 文章目录 前言一、继承1.什么是继承2.继承的使用 二、继承方式1.private成员变量的&#xff08;3种继承方式&#xff09;继承2. private继承方式3.继承基类成员访问⽅式的变化 三、基类和派生类间的转换1.切片 四、 继承中的作⽤域1.隐藏规则&am…

Load-Balanced-Online-OJ(负载均衡式在线OJ)

负载均衡式在线OJ 前言1. 项目介绍2. 所用技术与环境所用技术栈开发环境 3. 项目宏观结构3.1 项目核心模块3.2 项目的宏观结构 4. comm公共模块4.1 日志&#xff08;log.hpp &#xff09;4.1.1 日志主要内容4.1.2 日志使用方式4.1.2 日志代码 4.2 工具&#xff08;util.hpp&…

c++->内部类 匿名对象

内部类&#xff1a;&#xff08;例如&#xff1a;b定义在a类中&#xff09; 注意事项&#xff1a; &#xff08;1&#xff09;内部类b可以直接使用外部类的static变量&#xff0c;但是并不属于外部类的友元&#xff01;&#xff01;&#xff01;&#xff01; #include <s…

C++ std::unique_ptr的使用及源码分析

目录 1.简介 2.使用方法 2.1.创建 unique_ptr 2.2.删除对象 2.3.转移所有权 2.4.自定义删除器 2.5.从函数返回 std::unique_ptr 2.6.将 std::unique_ptr 作为函数参数 3.适用场景 4.与原始指针的区别 5.优缺点 6.源码分析 6.1.构造函数 6.2.存储分析 6.3.默认删…

系统思考—关键决策

最近听到一句话特别扎心&#xff1a;“不是环境毁了企业&#xff0c;而是企业误判了环境。” 在大环境变化面前&#xff0c;很多企业的反应是快速调整&#xff0c;但这真的有效吗&#xff1f;其实&#xff0c;太快的动作&#xff0c;往往是误判的开始。 环境变化带来压力&…

【Java 解释器模式】实现高扩展性的医学专家诊断规则引擎

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

ES八股相关知识

为什么要使用ElasticSearch&#xff1f;和传统关系数据库&#xff08;如 MySQL&#xff09;有什么不同&#xff1f; 典型回答 数据模型 Elasticsearch 是基于文档的搜索引擎&#xff0c;它使用 JSON 文档来存储数据。在 Elasticsearch 中&#xff0c;相关的数据通常存储在同…

局域网与广域网:探索网络的规模与奥秘(3/10)

一、局域网的特点 局域网覆盖有限的地理范围&#xff0c;通常在几公里以内&#xff0c;具有实现资源共享、服务共享、维护简单、组网开销低等特点&#xff0c;主要传输介质为双绞线&#xff0c;并使用少量的光纤。 局域网一般是方圆几千米以内的区域网络&#xff0c;其特点丰富…