当前位置:   article > 正文

Postgresql的集群搭建与监控方案_postgresql查看集群状态

postgresql查看集群状态

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


 相关文章:

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. ## 1. 编译安装
  2. # adduser postgres #创建pgsql管理员账号postgres
  3. # su postgres #切换到postgres用户下操作后边步骤
  4. $ mkdir /home/postgres/app -p
  5. $ mkdir /home/postgres/data -p
  6. $ tar xf postgresql-14.4.tar.gz #上传安装包到服务器并解压
  7. $ cd postgresql-14.4/ $$ ./configure --prefix=/home/postgres/app
  8. $ make && make install
  9. $ /home/postgres/app/bin/initdb -D /home/postgres/data/ -E UTF8 --locale=zh_CN.UTF8 #初始化数据
  10. ## 2. 修改配置:
  11. #1). change the bind IP:
  12. #编辑 /home/postgres/data/postgresql.conf ,约61行添加这行,增加5432端口绑定IP:
  13. listen_addresses = '*' #or listen_addresses = '${local IP}'
  14. #2. add IPv4 local connections:
  15. #编辑 /home/postgres/data/pg_hba.conf,约92行“IPv4 local connections”模块添加这行,授权远程连接:
  16. host all all 0.0.0.0/0 md5
  17. ## 3. 修改环境变量
  18. #在/etc/profile文件添加环境变量:
  19. export PGSQL=/home/postgres/app/
  20. export PATH=$PATH:$PGSQL/bin
  21. source /etc/profile #环境变量生效
  22. ## 4. 创建启停脚本:
  23. [postgres@test64 data]$ cat pgsql.sh
  24. #!/bin/bash
  25. case $1 in
  26. start)
  27. /home/postgres/app/bin/pg_ctl -D /home/postgres/data/ -l /home/postgres/data/logfile start;;
  28. stop)
  29. /home/postgres/app/bin/pg_ctl -D /home/postgres/data/ stop;;
  30. restart)
  31. /home/postgres/app/bin/pg_ctl restart -D /home/postgres/data/ -m fast;;
  32. *)
  33. echo "useage:$0 [start, stop, restart]";;
  34. esac
  35. [postgres@test64 data]$
  36. ## 5. 启动服务:
  37. [postgres@test64 data]$ ./pgsql.sh start
  38. ## 6. 登录pgsql并给管理员postgres设置密码:
  39. [postgres@test64 data]$ psql
  40. psql (14.4)
  41. Type "help" for help.
  42. postgres=# \password postgres
  43. Enter new password for user "postgres":
  44. Enter it again:
  45. 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部分加入以下几行:

  1. host replication rep 10.99.88.65 trust
  2. host replication rep 10.99.88.66 trust

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

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

4)重启master

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

1.3.2 重建slave节点的数据

  1. #删除数据目录pgsql
  2. rm -rf /home/postgres/data/
  3. #重新从master节点同步数据到slave节点
  4. 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节点,查看集群状态

  1. [postgres@test64 data]$ psql
  2. psql (14.4)
  3. Type "help" for help.
  4. postgres=# select client_addr,sync_state from pg_stat_replication;
  5. client_addr | sync_state
  6. -------------+------------
  7. 10.99.88.65 | async
  8. 10.99.88.66 | async
  9. (2 rows)
  10. postgres=#

1.3.4 测试集群同步

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

master节点:

slave节点:

至此集群搭建完毕。

1.4 遇到的问题

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

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

  1. 2023-11-15 22:06:00.096 CST [118982] FATAL: data directory "/home/postgres/data" has invalid permissions
  2. 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失败

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

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

2. PostgreSQL接入Prometheus

2.1 方案

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

2.2 操作

2.2.1 下载postgres_exporter并解压

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

2.2.2 创建启动文件

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

2.2.3 启动服务

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

2.2.4 创建service、servicemonitor和endpoint

  1. [root@rancher-0001 pgsql]# cat service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. labels: #此处label要和上一步创建的servicemonitor对象的seletor匹配
  6. app: pgsql-exporter-service-test
  7. name: pgsql-exporter-service-test
  8. namespace: monitoring
  9. spec:
  10. type: ClusterIP
  11. ports:
  12. - name: pgsql-exporter-port
  13. port: 9187
  14. protocol: TCP
  15. targetPort: 9187
  16. [root@rancher-0001 pgsql]#
  17. [root@rancher-0001 pgsql]# cat servicemonitor.yaml
  18. apiVersion: monitoring.coreos.com/v1
  19. kind: ServiceMonitor
  20. metadata:
  21. labels:
  22. app: pgsql-exporter-test
  23. name: pgsql-exporter-test
  24. namespace: monitoring
  25. spec:
  26. endpoints:
  27. - interval: 15s
  28. port: pgsql-exporter-port
  29. path: /metrics
  30. namespaceSelector:
  31. matchNames:
  32. - monitoring
  33. selector:
  34. matchLabels:
  35. app: pgsql-exporter-service-test
  36. [root@rancher-0001 pgsql]#
  37. [root@rancher-0001 pgsql]# cat endpoint.yaml
  38. apiVersion: v1
  39. kind: Endpoints
  40. metadata:
  41. name: pgsql-exporter-service-test
  42. namespace: monitoring
  43. labels:
  44. app: pgsql-exporter-endpoints
  45. subsets:
  46. - addresses:
  47. - ip: 10.99.88.64
  48. - ip: 10.99.88.65
  49. - ip: 10.99.88.66
  50. ports:
  51. - name: pgsql-exporter-port
  52. port: 9187
  53. protocol: TCP
  54. [root@rancher-0001 pgsql]#

2.2 5. 在Grafana导入Dashboard

DashboardID:9628

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/173426
推荐阅读
相关标签
  

闽ICP备14008679号