当前位置: 首页 > article >正文

Repmgr管理PostgreSQL服务器集群笔记

目录

  • Repmgr管理PostgreSQL服务器集群笔记
    • 一、概述
      • (一)主要工具
      • (二)用户和元数据
    • 二、准备工作
      • (一)基本环境
      • (二)PostgreSQL用户创建、目录规划
      • (三)互信配置
      • (四)pg12编译安装
    • 三、搭建PG主备(异步流复制)
      • (一)修改HA1的配置
      • (二)机器HA2使用pg_basebackup做基础备份
      • (三)机器HA2修改postgresql.conf
      • (四)机器HA2配置standby.signal
      • (五)启动HA2
    • 四、repmgr安装配置
      • (一)主库创建repmgr库存储元数据
      • (二)主库pg_hba配置repmgr策略
      • (三)所有服务器安装repmgr
      • (四)停备库并删除数据文件
      • (五)免密配置
      • (六)主库创建配置文件repmgr.conf
      • (七)使用repmgr命令注册主库
      • (八)使用repmgr命令克隆备库
        • 1. 配置备库参数
        • 2. 检查是否可以完成repmgr搭建备库
        • 3. 正式克隆
        • 4. 修改备库host指向
      • (九)查看日志确认
      • (十)使用repmgr命令注册备库
      • (十一)查看集群状态
    • 五、切换测试
      • (一)HA2执行有计划的switchover
      • (二)HA1执行有计划的switchover

Repmgr管理PostgreSQL服务器集群笔记

一、概述

Repmgr是一套开源工具,用于管理PostgreSQL服务器集群中的复制和故障转移。它支持并增强了PostgreSQL的内置流复制,提供单个读/写主服务器和一个或多个只读备用数据库,备用数据库包含主服务器数据库的近实时副本。

(一)主要工具

  1. repmgr:用于执行管理任务的命令行工具,可设置备用服务器、将备用服务器升级为主服务器、切换主服务器和备用服务器、显示复制群集中的服务器状态。
  2. repmgrd:一个守护程序,主动监视复制集群中的服务器,可监控和记录复制性能、通过检测主服务器故障并提升最合适的备用服务器来执行故障转移,还能将有关群集中事件的通知提供给用户定义的脚本,该脚本可执行诸如通过电子邮件发送警报等任务。

(二)用户和元数据

为有效管理复制集群,repmgr需在专用数据库中存储有关集群中服务器的信息。此模式由repmgr扩展自动创建,包含以下对象:

    • repmgr.events:记录感兴趣的事件。
    • repmgr.nodes:存储复制群集中每个服务器的连接和状态信息。
    • repmgr.monitoring_history:repmgrd编写的历史备用监视信息视图。
  1. 视图
    • repmgr.show_nodes:基于表repmgr.nodes,另外显示服务器上游节点的名称。
    • repmgr.replication_status:启用repmgrd的监视时,显示每个备用数据库的当前监视状态。

repmgr元数据可存储在现有的数据库或自己的专用数据库,但不能存储在不属于repmgr管理的复制集群的数据库服务器上。数据库用户必须可供repmgr访问此数据库并执行必要的更改,此用户不需要是超级用户,但某些操作(如repmgr扩展的初始安装)将需要超级用户连接(可使用命令行在需要时指定superuser)。

二、准备工作

(一)基本环境

主机名IP地址软件版本
HA110.10.10.21Repmgr5.2.0 + PG12.4
HA210.10.10.23Repmgr5.2.0 + PG12.4

(二)PostgreSQL用户创建、目录规划

# 创建系统用户和组
groupadd postgres -g 1001
useradd postgres -g 1001 -u 1001# 安装文件目录
mkdir -p /opt/pg12
chown -R postgres:postgres /opt/pg12
chmod 0700 /opt/pg12
ln -s /opt/pg12 /opt/pgsql# 数据目录
mkdir -p /opt/data6000
chown -R postgres:postgres /opt/data6000
chmod 0700 /opt/data6000# 归档目录
mkdir -p /opt/archive6000
chown -R postgres:postgres /opt/archive6000
chmod 0700 /opt/archive6000

(三)互信配置

# HA1
cat .ssh/id_rsa.pub > .ssh/authorized_keys
scp .ssh/authorized_keys postgres@10.10.10.21:/home/postgres/.ssh# HA2
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
scp .ssh/authorized_keys postgres@10.10.10.23:/home/postgres/.ssh/authorized_keys

(四)pg12编译安装

# 解压到/opt目录下
tar -zxvf postgresql-12.4.tar.gz
cd postgresql-12.4/# 编译
./configure --prefix=/opt/pg12 --with-pgport=6000# 安装
gmake world && gmake install-world# 配置开机自启动
su root
cp contrib/start-scripts/linux /etc/init.d/postgres
chmod +x /etc/init.d/postgres
chkconfig postgres on
vi /etc/init.d/postgres# 删除源文件
cd /opt
rm -rf postgresql-12.4# 初始化数据目录
su postgres /opt/pgsql/bin/initdb -D /opt/data6000 -E UTF8 -U postgres -W# 服务启停
service postgres start | stop
/opt/pgsql/bin/pg_ctl -D /opt/data6000 start | stop

三、搭建PG主备(异步流复制)

(一)修改HA1的配置

vi postgresql.conf
listen_addresses = '*'
port = 6000
wal_level = replica
archive_mode = on
archive_command = 'cp %p /opt/archive6000/%f'
max_wal_senders = 10
wal_keep_segments = 512
hot_standby = on
primary_conninfo = 'host=10.10.10.23 port=6000 user=repuser'
logging_collector = on
log_destination = csvlog
log_directory = '/opt/data6000/pg_log'
log_filename = 'pg_log_%Y-%m-%d_%H%M%S.log'
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
log_min_messages = warning
log_min_duration_statement = 30s
log_checkpoints = on
log_connections = on
log_disconnections = on
log_duration = on
log_lock_waits = on
log_statement = DDLvi pg_hba.conf
host all all 0.0.0.0/0 md5
host replication all 0.0.0.0/0 trust/opt/pgsql/bin/psql -p6000 -h127.0.0.1 -U postgres
create user repuser replication login connection limit 5 encrypted password '123456';
create table t(id int, info text);
insert into t values(1, now()),(2, now()),(3, now());# 重启HA1
service postgres restart

(二)机器HA2使用pg_basebackup做基础备份

/opt/pgsql/bin/pg_basebackup -D /opt/data6000/ -Fp -Xs -v -P -h10.10.10.21 -p6000 -Urepuser

(三)机器HA2修改postgresql.conf

vi postgresql.conf
listen_addresses = '*'
port = 6000
wal_level = replica
archive_mode = on
archive_command = 'cp %p /opt/archive6000/%f'
max_wal_senders = 10
wal_keep_segments = 512
hot_standby = on
primary_conninfo = 'host=10.10.10.21 port=6000 user=repuser'
logging_collector = on
log_destination = csvlog
log_directory = '/opt/data6000/pg_log'
log_filename = 'pg_log_%Y-%m-%d_%H%M%S.log'
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
log_min_messages = warning
log_min_duration_statement = 30s
log_checkpoints = on
log_connections = on
log_disconnections = on
log_duration = on
log_lock_waits = on
log_statement = DDL

(四)机器HA2配置standby.signal

touch /opt/data6000/standby.signal

(五)启动HA2

/opt/pgsql/bin/pg_ctl -D /opt/data6000 start &

至此,异步流复制搭建完成,主库为HA1(10.10.10.21),备库为HA2(10.10.10.23)。

四、repmgr安装配置

(一)主库创建repmgr库存储元数据

/opt/pgsql/bin/psql -p6000 -U postgres postgres
create user repmgr superuser connection limit 10 password '123456';
create database repmgr owner repmgr;

(二)主库pg_hba配置repmgr策略

local repmgr repmgr trust
host repmgr repmgr 127.0.0.1/32 trust
host repmgr repmgr 0.0.0.0/0 trust
local replication repmgr trust
host replication repmgr 127.0.0.1/32 trust
host replication repmgr 0.0.0.0/0 trust

(三)所有服务器安装repmgr

chmod 755 repmgr-5.2.tar.gz
chown postgres:postgres repmgr-5.2.tar.gz
tar -zxvf repmgr-5.2.tar.gz
./configure PG_CONFIG=/opt/pgsql/bin/pg_config
make && make install

(四)停备库并删除数据文件

service postgres stop
rm -rf archive6000/*
rm -rf data6000/*

(五)免密配置

cd /home/postgres
chown -R postgres:postgres /home/postgres/
chmod -R 0700 /home/postgres/
usermod -d /home/postgres postgres
su - postgres
touch .pgpass
chmod 0600 .pgpass
vi .pgpass
# 添加以下内容
10.10.10.21:6000:repmgr:repmgr:123456
10.10.10.23:6000:repmgr:repmgr:123456

(六)主库创建配置文件repmgr.conf

# HA1(10.10.10.21)
vi /opt/repmgr.conf
node_id = 1
node_name = 'node1'
conninfo = 'host=10.10.10.21 port=6000 user=repmgr dbname=repmgr connect_timeout=2'
data_directory = '/opt/data6000'
replication_user = 'repmgr'
repmgr_bindir = '/opt/pgsql/bin'
pg_bindir = '/opt/pgsql/bin'
monitoring_history = yes
monitor_interval_secs = 5
log_level = 'debug'
log_file = '/opt/data6000/repmgr.log'
chown -R postgres:postgres repmgr.conf
chmod 0600 repmgr.conf# HA2(10.10.10.23)测试repmgr是否能免密访问主库(postgres)
psql -p 6000 -h10.10.10.21 -U repmgr

(七)使用repmgr命令注册主库

# HA1(10.10.10.21) root下执行
repmgr -f /opt/repmgr.conf primary register --force

(八)使用repmgr命令克隆备库

1. 配置备库参数
# HA2(10.10.10.23)
vi /opt/repmgr.conf
node_id = 2
node_name = 'node2'
conninfo = 'host=10.10.10.23 port=6000 user=repmgr dbname=repmgr connect_timeout=2'
data_directory = '/opt/data6000'
replication_user = 'repmgr'
replication_type = 'physical'
repmgr_bindir = '/opt/pgsql/bin'
pg_bindir = '/opt/pgsql/bin'
monitoring_history = yes
monitor_interval_secs = 5
log_level = 'debug'
log_file = '/opt/data6000/repmgr.log'
chown -R postgres:postgres repmgr.conf
chmod 0600 repmgr.conf
2. 检查是否可以完成repmgr搭建备库
repmgr -h 10.10.10.21 -p6000 -U repmgr -d repmgr -f /opt/repmgr.conf standby clone --dry-run
3. 正式克隆
repmgr -h 10.10.10.21 -p6000 -U repmgr -d repmgr -f /opt/repmgr.conf standby clone
4. 修改备库host指向
# HA2(10.10.10.23)修改配置文件,primary_conninfo里host修改指向HA1
vi /opt/data6000/postgresql.conf
primary_conninfo = 'host=10.10.10.21 port=6000 user=repuser'# 启动备库
service postgres start

(九)查看日志确认

# 主库查看postgres进程
ps -ef | grep postgres# 备库查看postgres进程
ps -ef | grep postgres# 主库查看复制状态
/opt/pgsql/bin/psql -p6000 -U postgres -c "SELECT * FROM pg_stat_replication;"

(十)使用repmgr命令注册备库

# HA2(10.10.10.23)
repmgr -f /opt/repmgr.conf standby register --force

(十一)查看集群状态

# HA1和HA2查看状态一致
repmgr -f /opt/repmgr.conf cluster show

五、切换测试

(一)HA2执行有计划的switchover

repmgr -f /opt/repmgr.conf standby switchover -U repmgr --verbose

从日志可以看到切换过程:检查主库为node1,ssh到主库node1,检查归档文件和wal,触发checkpoint,快速关闭主库node1,检查主库node1是否关闭,主库node1关闭clean后开始提升备库node2,节点node2调用pg_promote()函数提升备库为主库,等待60秒(promote_check_timeout)以便promotion完成,节点node2完成promotion,node1满足rejoin到node2,node1执行pg_ctl启动服务,rejoin,attached node2,switchover完成。

# 查看集群状态
repmgr -f /opt/repmgr.conf cluster show

(二)HA1执行有计划的switchover

repmgr -f /opt/repmgr.conf standby switchover -U repmgr --verbose

从日志可以看到切换过程:检查主库为node2,ssh到主库node2,检查归档文件和wal,触发checkpoint,快速关闭主库node2,检查主库node2是否关闭,主库node2关闭clean后开始提升备库node1,节点node1调用pg_promote()函数提升备库为主库,等待60秒(promote_check_timeout)以便promotion完成,节点node1完成promotion,node2满足rejoin到node1,node2执行pg_ctl启动服务,rejoin,attached node1,switchover完成。

# 查看集群状态
/opt/pgsql/bin/repmgr -f /opt/repmgr.conf cluster show

经过两次switchover已经恢复为HA1为主库,HA2为备库。

相关文章:

Repmgr管理PostgreSQL服务器集群笔记

目录 Repmgr管理PostgreSQL服务器集群笔记一、概述(一)主要工具(二)用户和元数据 二、准备工作(一)基本环境(二)PostgreSQL用户创建、目录规划(三)互信配置&a…...

deepseek本地部署-linux

1、官网推荐安装方法(使用脚本,我绕不过github,未采用) 登录ollama下载网站https://ollama.com/download/linux,linux下有下载脚本。 正常来说,在OS系统下直接执行脚本即可。 2、手动安装方法 2.1获取ol…...

vite + axios 代理不起作用 404 无效

vite axios 代理不起作用 先看官方示例 export default defineConfig({server: {proxy: {// 字符串简写写法/foo: http://localhost:4567,// 选项写法/api: {target: http://jsonplaceholder.typicode.com,changeOrigin: true,rewrite: (path) > path.replace(/^\/api/, )…...

【Linux】从零开始:编写你的第一个Linux进度条小程序

Linux相关知识点可以通过点击以下链接进行学习一起加油!初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具 🌈个人主页:是店小二呀 🌈C语言专栏:C语言 &am…...

【办公类-53-04】20250209Python模仿制作2024学年第二学期校历

背景需求: 马上开学了,又要制作校历(删划节假日)。之前我都是用网络的图片,然后在PPT里修改。 存在问题: 网络校历是从周日开始的,但日常我们老师做教案,都是默认从周一到周五&…...

11vue3实战-----封装缓存工具

11vue3实战-----封装缓存工具 1.背景2.pinia的持久化思路3.以localStorage为例解决问题4.封装缓存工具 1.背景 在上一章节,实现登录功能时候,当账号密码正确,身份验证成功之后,把用户信息保存起来,是用的pinia。然而p…...

Unity 基础编程

在这个练习中将新建unity脚本,控制player的运动与转动,实现用代码检测碰撞与删除物体。 该练习将应用附件中的项目文件,该文件与Unity快速练习的文件是同一个项目文件。 一、构建Player运动脚本 该部分将构建一个在场景中由玩家控制游戏物…...

Spring Boot接入Deep Seek的API

1,首先进入deepseek的官网:DeepSeek | 深度求索,单击右上角的API开放平台。 2,单击API keys,创建一个API,创建完成务必复制!!不然关掉之后会看不看api key!!&…...

介绍下SpringBoot常用的依赖项

Spring Boot 是一个用于快速开发 Spring 应用程序的框架,它通过自动配置和依赖管理简化了开发过程。以下是一些 Spring Boot 项目中常用的依赖项: 1. Spring Boot Starter Web 作用: 用于构建 Web 应用程序,包括 RESTful 服务。依赖项: spr…...

解决 keep-alive 缓存组件中定时器干扰问题

当使用 keep-alive 缓存组件时,组件中的定时器可能会在组件被缓存后继续运行,从而干扰其他组件的逻辑。为了避免这种情况,可以通过以下方法解决: 1. 在组件的 deactivated 钩子中清理定时器 keep-alive 为缓存的组件提供了 acti…...

PostgreSQL插件-pg_stat_statements-安装和使用

文章目录 插件介绍插件安装1.修改配置文件postgresql.conf2.插件相关参数参数默认值参数说明特别注意pg_stat_statements.max参数设置太小日志会有警告 插件使用1.创建插件2.使用插件3.重置数据4.删除插件 可能会出现的问题1.没有编译安装插件2.没有配置shared_preload_librari…...

flutter安卓打包签名

flutter安卓打包签名 1.创建签名文件 keytool -genkeypair -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-aliaskeytool 是一个用于管理密钥和证书的命令行工具,通常与 Java 开发工具包 (JDK) 一起使用。my-release-…...

从Word里面用VBA调用NVIDIA的免费DeepSeekR1

看上去能用而已。 选中的文字作为输入,运行对应的宏即可;会先MSGBOX提示一下,然后相关内容追加到word文档中。 需要自己注册生成好用的apikey Option ExplicitSub DeepSeek()Dim selectedText As StringDim apiKey As StringDim response A…...

JavaScript 中的防抖和节流,它们的区别是什么,以及如何实现?

在前端开发中,防抖(Debounce)和节流(Throttle)是两种常用的优化高频率事件处理的技术。 它们能够有效减少事件处理函数的执行次数,从而提升页面性能和用户体验。 下面将详细解释这两种技术的概念、区别、…...

【Kubernetes的SpringCloud最佳实践】Spring Cloud netflix 能否被K8s资源完全替代?

在部署Spring Cloud微服务到Kubernetes(K8s)时, Spring Cloud netflix 是否需要完全替代?或者可以部分替代,结合使用? 例如,服务发现和负载均衡可以交给K8s处理, 但某些功能如API网关…...

MATLAB中extract 函数用法

目录 语法 说明 示例 从地址中提取邮政编码 提取在数值位置处的字符 extract函数的功能是从字符串中提取子字符串。 语法 newStr extract(str,pat) newStr extract(str,pos) 说明 newStr extract(str,pat) 返回 str 中与 pat 指定的模式匹配的任何子字符串。 如果 s…...

DeepSeek-V3:开源多模态大模型的突破与未来

目录 引言 一、DeepSeek-V3 的概述 1.1 什么是 DeepSeek-V3? 1.2 DeepSeek-V3 的定位 二、DeepSeek-V3 的核心特性 2.1 多模态能力 2.2 开源与可扩展性 2.3 高性能与高效训练 2.4 多语言支持 2.5 安全与伦理 三、DeepSeek-V3 的技术架构 3.1 模型架构 3…...

C语言学习笔记:子函数的调用实现各个位的累加和

在C语言程序学习之初,我们都会学习如何打印 hello world,在学习时我们知道了int main()是主函数,程序从main函数开始执行,这是流程控制的一部分内容。在主函数中我们想要实现一些功能,比如求各个…...

docker安装ollama显示超时或失败

正常安装 1、拉取ollma镜像 docker pull ollama/ollama or docker pull docker.1panel.live/ollama/ollama2、运行ollma镜像 docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama3、运行指定大模型:模型仓库参考网站: library (ollama.com…...

grafana面板配置opentsdb

新增面板: 这里add-panel: 如果不是想新增面板而是想新增一行条目,则点击convert to row: 在新增的面板这里可以看到选择数据源 Aggregator:聚合条件,区分下第一行和第二行的aggregator,第一个是对指标值的聚合&…...

iOS AES/CBC/CTR加解密以及AES-CMAC

感觉iOS自带的CryptoKit不好用,有个第三方库CryptoSwift还不错,好巧不巧,清理过Xcode缓存后死活下载不下来,当然也可以自己编译个Framework,但是偏偏不想用第三方库了,于是研究了一下,自带的Com…...

使用Jenkins实现鸿蒙HAR应用的自动化构建打包

使用Jenkins实现鸿蒙HAR应用的自动化构建打包 在软件开发领域,自动化构建是提高开发效率和确保代码质量的重要手段。特别是在鸿蒙(OpenHarmony)应用开发中,自动化构建更是不可或缺。本文将详细介绍如何使用Jenkins命令行工具实现…...

2025年02月10日Github流行趋势

项目名称:dify 项目地址url:https://github.com/langgenius/dify项目语言:TypeScript历史star数:64707今日star数:376项目维护者:takatost, crazywoola, laipz8200, iamjoel, JohnJyong项目简介&#xff1a…...

Ansible简单介绍及用法

一、简介 Ansible是一个简单的自动化运维管理工具,基于Python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等)。主版本大概每2个月发布一次。 Ansible与Saltstack最大的区别是…...

渗透利器工具:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)

Burp Suite 联动 XRAY 图形化工具.(主动扫描被动扫描) Burp Suite 和 Xray 联合使用,能够将 Burp 的强大流量拦截与修改功能,与 Xray 的高效漏洞检测能力相结合,实现更全面、高效的网络安全测试,同时提升漏…...

HTML-day1(学习自用)

目录 一、HTML介绍 二、常用的标签 1、各级标题(h1-h6) 2、段落标签(p) 3、文本容器(span) 4、图片标签(img) 5、超链接标签(a) 6、表格(t…...

Vue07

一、Vuex 概述 目标:明确Vuex是什么,应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具,状态就是数据。 大白话:Vuex 是一个插件,可以管理 Vue 通用的数据 (多组件共享的数据)。例如:购物车数…...

Godot开发框架探索#2

前言 距离上次发文又又又隔了很长一段时间。主要原因还是因为思绪在徘徊,最近纠结的点有以下几个:1.渴求一个稳定的Godot开发框架;2.要不要使用更轻量的开发框架,或者直接写引擎; 3.对自己想做的游戏品类拿不定主意。…...

deepseek实现私有知识库

前言 之前写了如何本地部署deepseek,已经可以私有化问答了,本地搭建deepseek实操(ollama搭建,docker管理,open-webui使用) 其中我觉得最厉害的还是这个模型蒸馏,使我们可以用很低的代价使用大模…...

2.10学习总结

Dijkstra算法求取最短路径 注:迪杰斯特拉算法并不能直接生成最短路径,但是算法将最短路径信息保存在dist数组和path数组中。 dist数组中保存的是起始点到数组下标对应顶点的路径长度(累加的结果)path数组中保存的是对应path数组…...