Repmgr管理PostgreSQL服务器集群笔记

news2025/2/12 2:34:51

目录

  • 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 = DDL

vi 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为备库。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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!!&…

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

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

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

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

grafana面板配置opentsdb

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

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使用) 其中我觉得最厉害的还是这个模型蒸馏,使我们可以用很低的代价使用大模…

【探索未来科技】2025年国际学术会议前瞻

【探索未来科技】2025年国际学术会议前瞻 【探索未来科技】2025年国际学术会议前瞻 文章目录 【探索未来科技】2025年国际学术会议前瞻前言1. 第四届电子信息工程、大数据与计算机技术国际学术会议( EIBDCT 2025)代码示例:机器学习中的线性回…

大模型基本原理(四)——如何武装ChatGPT

传统的LLM存在几个短板:编造事实、计算不准确、数据过时等,为了应对这几个问题,可以借助一些外部工具或数据把AI武装起来。 实现这一思路的框架包括RAG、PAL、ReAct。 1、RAG(检索增强生成) LLM生成的内容会受到训练…

开发完的小程序如何分包

好几次了,终于想起来写个笔记记一下 我最开始并不会给小程序分包,然后我就各种搜,发现讲的基本上都是开发之前的小程序分包,可是我都开发完要发布了,提示我说主包太大需要分包,所以我就不会了。。。 好了…