Postgresql的集群搭建与监控方案

news2025/1/9 6:01:43

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


 相关文章:

PostgreSQL学习之部署与简单使用

PostgreSQL的常见错误和解决方法

如果PostgreSQL有两层nginx代理,会发生什么事?

前言

之前在《PostgreSQL学习之部署与简单使用》记录了PostgreSQL的搭建和简单使用,本文记录PostgreSQL集群的搭建,接入Prometheus监控(Prometheus监控部署在k8s集群内)。

1. PostgreSQL集群搭建

1.1 服务器规划

IP hostname角色
10.99.88.64test64master
10.99.88.65test65slave
10.99.88.66test65slave

1.2 在3个节点安装pgsql

## 1. 编译安装
# adduser postgres  #创建pgsql管理员账号postgres
# su postgres  #切换到postgres用户下操作后边步骤
$ mkdir /home/postgres/app -p
$ mkdir /home/postgres/data -p
$ tar xf postgresql-14.4.tar.gz  #上传安装包到服务器并解压
$ cd postgresql-14.4/ $$ ./configure --prefix=/home/postgres/app
$ make && make install   
$ /home/postgres/app/bin/initdb -D /home/postgres/data/  -E UTF8 --locale=zh_CN.UTF8   #初始化数据



## 2. 修改配置:
#1). change the bind IP:
#编辑 /home/postgres/data/postgresql.conf  ,约61行添加这行,增加5432端口绑定IP:
listen_addresses = '*'  #or listen_addresses = '${local IP}'

#2. add IPv4 local connections:
#编辑 /home/postgres/data/pg_hba.conf,约92行“IPv4 local connections”模块添加这行,授权远程连接:
host    all             all             0.0.0.0/0               md5



## 3. 修改环境变量
#在/etc/profile文件添加环境变量:
export PGSQL=/home/postgres/app/
export PATH=$PATH:$PGSQL/bin
source /etc/profile  #环境变量生效



## 4. 创建启停脚本:
[postgres@test64 data]$ cat pgsql.sh 
#!/bin/bash
case $1 in
start)
  /home/postgres/app/bin/pg_ctl -D /home/postgres/data/ -l /home/postgres/data/logfile start;;
stop)
  /home/postgres/app/bin/pg_ctl -D /home/postgres/data/ stop;;
restart)
  /home/postgres/app/bin/pg_ctl restart -D /home/postgres/data/  -m fast;;
*)
  echo "useage:$0 [start, stop, restart]";;  
esac
[postgres@test64 data]$ 



## 5. 启动服务:
[postgres@test64 data]$ ./pgsql.sh start



## 6. 登录pgsql并给管理员postgres设置密码:
[postgres@test64 data]$ psql 
psql (14.4)
Type "help" for help.

postgres=# \password postgres
Enter new password for user "postgres": 
Enter it again: 
postgres=#

1.3 主从配置

1.3.1 master节点配置

1)master创建主从账号:

CREATE ROLE rep login replication encrypted password 'rep';

2)修改master节点pg_hba.conf,在# IPv4 local connections部分加入以下几行:

host replication rep 10.99.88.65 trust
host replication rep 10.99.88.66 trust

3)修改master节点postgresql.conf如下参数:

max_connections = 2000 #100
wal_level = replica
full_page_writes = on
wal_log_hints = on          # also do full page writes of non-critical updates
max_wal_size = 1GB
min_wal_size = 80MB
archive_mode = on           # enables archiving; off, on, or always
archive_command = 'cd ./'   # command to use to archive a logfile segment
max_wal_senders = 10        # max number of walsender processes
hot_standby = on            # "off" disallows queries during recovery

4)重启master

[postgres@test64 data]$ ./pgsql.sh restart

1.3.2 重建slave节点的数据

#删除数据目录pgsql
rm -rf /home/postgres/data/   

#重新从master节点同步数据到slave节点
pg_basebackup -h 10.99.88.64 -p 5432 -U rep -Fp -Xs -Pv -R -D /home/postgres/data/

注意:删除数据目录后,不要手动mkdir创建pgsql,会引起权限问题。手动mkdir pgsql,pgsql的权限是drwxrwxr-x ,而执行上面第二条数据同步命令生成的pgsql目录是drwx------

1.3.3 登录master节点,查看集群状态

[postgres@test64 data]$ psql
psql (14.4)
Type "help" for help.
postgres=# select client_addr,sync_state from pg_stat_replication;
 client_addr | sync_state
-------------+------------
 10.99.88.65 | async
 10.99.88.66 | async
(2 rows)
postgres=#

1.3.4 测试集群同步

在master节点创建一个名为sre的database,然后在slave节点查看,sre库已经存在。

master节点:

slave节点:

至此集群搭建完毕。

1.4 遇到的问题

1.4.1 slave数据目录权限异常,启动失败

创建主从时,从库从主库同步数据后启动失败,报错:

2023-11-15 22:06:00.096 CST [118982] FATAL: data directory "/home/postgres/data" has invalid permissions
2023-11-15 22:06:00.096 CST [118982] DETAIL: Permissions should be u=rwx (0700) or u=rwx,g=rx (0750).

因为在同步数据前,slave删除了数据目录/home/postgres/data后。又手动mkdir pgsql创建了一个数据目录pgsql,pgsql的权限是drwxrwxr-x ,而执行下面复制命令生成的pgsql目录是drwx------,导致无法启动

1.4.2 删除database失败

postgres=# drop database sre;
ERROR: cannot execute DROP DATABASE in a read-only transaction
postgres=#

因为从库不能执行删库操作,误在从库执行了删库操作

2. PostgreSQL接入Prometheus

2.1 方案

Prometheus是之前部署在k8s集群内部的监控系统,因此将PostgreSQL接入Prometheus监控,采用在PostgreSQL服务器部署postgres_exporter,将PostgreSQL节点通过endpoint方式挂载到Prometheus系统内部做监控。

2.2 操作

2.2.1 下载postgres_exporter并解压

$ wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.11.1/postgres_exporter-0.11.1.linux-amd64.tar.gz
$ tar xf postgres_exporter-0.11.1.linux-amd64.tar.gz 
$ mv postgres_exporter-0.11.1.linux-amd64 postgres_exporter

2.2.2 创建启动文件

[postgres@test64 postgres_exporter]$ cat start.sh 
#!/bin/bash
#配置 数据库数据源信息
export  DATA_SOURCE_NAME=postgresql://postgres:postgres@10.99.88.64:5432/postgres?sslmode=disable
#启动监控命令
./postgres_exporter &

[postgres@test64 postgres_exporter]$

2.2.3 启动服务

[postgres@test64 postgres_exporter]$ ./start.sh 
ts=2023-12-29T08:54:56.694Z caller=main.go:135 level=info msg="Listening on address" address=:9187
ts=2023-12-29T08:54:56.694Z caller=tls_config.go:195 level=info msg="TLS is disabled." http2=false
[postgres@test64 postgres_exporter]$

2.2.4 创建service、servicemonitor和endpoint

[root@rancher-0001 pgsql]# cat service.yaml 
apiVersion: v1
kind: Service
metadata:
  labels:   #此处label要和上一步创建的servicemonitor对象的seletor匹配
    app: pgsql-exporter-service-test
  name: pgsql-exporter-service-test
  namespace: monitoring
spec:
  type: ClusterIP
  ports:
  - name: pgsql-exporter-port
    port: 9187
    protocol: TCP
    targetPort: 9187
[root@rancher-0001 pgsql]# 

[root@rancher-0001 pgsql]# cat servicemonitor.yaml 
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    app: pgsql-exporter-test
  name: pgsql-exporter-test
  namespace: monitoring
spec:
  endpoints:
  - interval: 15s
    port: pgsql-exporter-port
    path: /metrics
  namespaceSelector:
    matchNames:
    - monitoring
  selector:
    matchLabels:
      app: pgsql-exporter-service-test
[root@rancher-0001 pgsql]# 



[root@rancher-0001 pgsql]# cat endpoint.yaml 
apiVersion: v1
kind: Endpoints
metadata:
  name: pgsql-exporter-service-test
  namespace: monitoring
  labels:
    app: pgsql-exporter-endpoints
subsets:
- addresses:
  - ip: 10.99.88.64
  - ip: 10.99.88.65
  - ip: 10.99.88.66
  ports:
    - name: pgsql-exporter-port
      port: 9187
      protocol: TCP
[root@rancher-0001 pgsql]#

2.2 5. 在Grafana导入Dashboard

DashboardID:9628

Gashboard链接:https://grafana.com/grafana/dashboards/9628-postgresql-database/

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

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

相关文章

vue+elementui实现12个日历平铺,初始化工作日,并且可点击

<template><div class"app-container"><el-form :model"queryParams" ref"queryForm" size"small" :inline"true"><el-form-item label"年份" prop"holidayYear"><el-date-…

SQL 注入总结(详细)

一、前言 这篇文章是最近学习 SQL 注入后的笔记&#xff0c;里面整理了 SQL 常见的注入方式&#xff0c;供大家学习了解 SQL 注入的原理及方法&#xff0c;也方便后续自己回顾&#xff0c;如有什么错误的地方欢迎指出&#xff01; 二、判断注入类型 按照注入点类型分类 数字型…

精品基于Uniapp+springboot疫情资讯信息管理系统App-新闻

《[含文档PPT源码等]精品基于Uniappspringboot疫情信息管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm …

峰华卓立:iPaaS集成平台,全面加速推进企业数智化建设

01 企业介绍 峰华卓立&#xff08;证券代码&#xff1a;834914&#xff09;是一家聚焦于3DP&#xff08;粘结剂喷射技术&#xff09;打印装备的研发、制造、销售及应用服务为一体的综合性服务供应商&#xff0c;国家高新技术企业&#xff0c;行业专精特新企业&#xff0c;工业级…

JAVA RPC Thrift基操实现与微服务间调用

一、Thrift 基操实现 1.1 thrift文件 namespace java com.zn.opit.thrift.helloworldservice HelloWorldService {string sayHello(1:string username) }1.2 执行命令生成Java文件 thrift -r --gen java helloworld.thrift生成代码HelloWorldService接口如下 /*** Autogene…

进程内协同:原子操作、互斥、同步和通信的原理

进程内协同&#xff0c;简单来说&#xff0c;就是在一个进程内部&#xff0c;多个执行体&#xff08;如线程、协程&#xff09;如何共享资源&#xff0c;如何协同工作以完成一项任务。这涉及到一系列的机制和技术&#xff0c;包括原子操作、互斥、同步和通信等。 那么&#xf…

Opencv轮廓检测运用与理解

目录 引入 基本理解 加深理解 ①比如我们可以获取我们的第一个轮廓,只展示第一个轮廓 ②我们还可以用一个矩形把我们的轮廓给框出来 ③计算轮廓的周长和面积 引入 顾名思义,就是把我们图片的轮廓全部都描边出来 也就是我们在日常生活中面部识别的时候会有一个框,那玩意就…

C语言实战系列一:经典贪食蛇

C语言学习必须实战&#xff0c;并且学完语法后就必须立即用实战来巩固。一般需要10来个比较复杂的程序才能掌握C语言。今天就教大家第一个小程序&#xff0c;贪食蛇。 首先上代码 一、代码 #include <stdio.h> #include <stdlib.h> #include <curses.h> #…

windows用mingw(g++)编译opencv,并install安装

windows下用mingw编译opencv貌似不支持cuda&#xff0c;选cuda会报错&#xff0c;我无法解决&#xff0c;所以没选cuda&#xff0c;下面两种编译方式支持。 如要用msvc编译opencv&#xff0c;参考我另外一篇文章。 如要用Ubuntu编译opencv&#xff0c;参考我另外一篇文章http…

UE5 Windows打包时报错“SDK Not Found”解决方案

在Unreal Engine 5.0.3 Windows平台下打包时报错&#xff1a;“Windows的SDK未正常安装&#xff0c;而其是生成数据的必需项。请检查主工具栏中“启动“菜单SDK部分来更新SDK。” 解决方案&#xff1a; 1、打开 Visual Studio Installer&#xff0c;点击“修改”按钮&#xf…

时空预测网络ST-Resnet 代码复现

ST-ResNet&#xff08;Spatio-Temporal Residual Network&#xff09;是一种用于处理时空数据的深度学习模型&#xff0c;特别适用于视频、时间序列等具有时空结构的数据。下面是一个简单的使用PyTorch搭建ST-ResNet的示例代码。请注意&#xff0c;这只是一个基本的示例&#x…

Hadoop基本概论

目录 一、大数据概论 1.大数据的概念 2.大数据的特点 3.大数据应用场景 二、Hadoop概述 1.Hadoop定义 2.Hadoop发展历史 3.Hadoop发行版本 4.Hadoop优势 5.Hadoop1.x/2.x/3.x 6.HDFS架构 7.Yarn架构 8.MapReduce架构 9.大数据技术生态体系 一、大数据概论 1.大数…

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 广度优先搜索 状态压缩 LeetCode847 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图&#xff0c;图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中&#xff0c;graph[i] 是一个列…

Java开发分析工具 JProfiler的详细使用方法解析(附 JProfiler for Mac许可证秘钥)

JProfiler 是一款功能强大的Java代码分析工具&#xff0c;JProfiler的直观UI可帮助您解决性能瓶颈&#xff0c;确定内存泄漏并了解线程问题且JProfiler Mac破解版配置会话非常简单&#xff0c;第三方集成使得入门变得轻而易举&#xff0c;并且以自然的方式呈现数据分析。 解…

AlmaLinux 8.9 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

C++ 知识列表【图】

举例C的设计模式和智能指针 当谈到 C 的设计模式时&#xff0c;以下是一些常见的设计模式&#xff1a; 工厂模式&#xff08;Factory Pattern&#xff09;&#xff1a;用于创建对象的模式&#xff0c;隐藏了对象的具体实现细节&#xff0c;只暴露一个公共接口来创建对象。 单例…

scanpy预处理总结

欢迎关注我们组的微信公众号&#xff0c;更多好文章在等你呦&#xff01; 微信公众号名&#xff1a;碳硅数据 公众号二维码&#xff1a; 记录一下关于scanpy preprocessing的结果 import scanpy as sc adata sc.read("/Users/yxk/Desktop/test_dataset/pbmc/pbmc.h5ad&…

【Proteus仿真】【Arduino单片机】甲醛浓度检测报警器

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用蜂鸣器LED模块、LCD1602显示模块、按键、MS1100甲醛传感器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示甲醛气体浓度检…

SystemC学习笔记(三) - 查看模块的波形

简述 波形在Simulation/Emulation中地位十分重要&#xff0c;尤其是在研发初期&#xff0c;只能通过波形来查看软件hang住的位置。 对于TLM来说&#xff0c;查看波形一般是指查看pvbus上的transaction&#xff0c;而对于SystemC本身来说&#xff0c;查看波形就是使用Gtkwave或…