当前位置:   article > 正文

postgresql集群(repmgr)_pg 集群部署

pg 集群部署

1、准备

1.1、IP分配

IPname节点
192.168.98.150mastermaster
192.168.98.151node1node1
192.168.98.152node2node2
192.168.98.153node3node3

1.2、前期配置

# 修改150~153的hosts配置文件
  1. vim /etc/hosts
  2. 192.168.98.150 master
  3. 192.168.98.151 node1
  4. 192.168.98.152 node2
  5. 192.168.98.153 node3

1.3、配置ssh免登录

  1. # 150~153都需要配置
  2. # 基于root
  3. ssh-keygen
  4. ssh-copy-id 192.168.98.150
  5. ssh-copy-id 192.168.98.151
  6. ssh-copy-id 192.168.98.152
  7. ssh-copy-id 192.168.98.153
  8. # 基于postgres
  9. passwd postgres
  10. su - postgres
  11. ssh-copy-id 192.168.98.150
  12. ssh-copy-id 192.168.98.151
  13. ssh-copy-id 192.168.98.152
  14. ssh-copy-id 192.168.98.153

2、安装(统一)

  1. #自定义安装配置
  2. #自定义目录
  3. #创建数据存放目录
  4. mkdir -p /data/pg/14/data
  5. #指定postgres用户的权限
  6. chown -R postgres:postgres /data/pgsql/14/data
  7. # 配置环境变量
  8. vim /etc/profile
  9. # 软件安装目录
  10. export PGHOME=/usr/pgsql-14/
  11. # PG数据目录
  12. export PGDATA=/app/pgsql/14/data/
  13. export PATH=$PGHOME/bin:$PATH
  14. # 更新环境配置
  15. source /etc/profile
  16. #修改启动文件的启动目录
  17. sudo vim /usr/lib/systemd/system/postgresql-14.service
  18. #Enviroment=PGDATA=/var/lib/pgsql/14/data/
  19. Enviroment=PGDATA=/data/pgsql/14/data/
  20. #重新加载配置文件
  21. systemctl daemon-reload
  22. systemctl start postgresql-14.service
  23. #修改密码
  24. sudo -u postgres psql
  25. \passwd postgres

3、master配置

3.1、初始化数据库配置

  1. #登录postgres用户
  2. su - postgres
  3. #初始化数据库,并指定存放数据目录
  4. /usr/pgsql-14/bin/initdb -D /app/pgsql/14/data
  5. exit

3.2、repmgr安装部署

  1. 此处针对master进行安装,所有的node1、node2、node3配置一致
  2. yum install flex
  3. yum list | grep repmgr
  4. yum install -y repmgr_14

3.3、修改postgresql的配置

  1. vim /app/pgsql/14/data/postgresql.conf
  2. listen_addresses = '*'
  3. port = 5432
  4. max_wal_senders = 10
  5. max_replication_slots = 10
  6. wal_level = 'hot_standby'
  7. hot_standby = on
  8. archive_mode = on
  9. archive_command = '/bin/true'
  10. vim /app/pgsql/14/data/pg_hba.conf
  11. local   replication   repmgr                             trust
  12. host   replication   repmgr      127.0.0.1/32           trust
  13. host   replication   repmgr     node1                   trust
  14. host   replication   repmgr     node2                   trust
  15. host   replication   repmgr     master                 trust
  16. local   repmgr       repmgr                             trust
  17. host   repmgr       repmgr      127.0.0.1/32           trust
  18. host   repmgr       repmgr     node1                   trust
  19. host   repmgr       repmgr     node2                   trust
  20. host   repmgr       repmgr     master                 trust

3.4、创建repmgr用户和库

  1. # 第一种方式
  2. su - postgres
  3. createuser -s repmgr
  4. createdb repmgr -O repmgr
  5. psql -U repmgr -d repmgr
  6. repmgr=# alter user repmgr with password '123456';
  7. repmgr=# exit
  8. ALTER USER repmgr PASSWORD NULL;
  9. # 第二种方式
  10. psql | sudo -u postgres psql
  11. create user repmgr with password '123456' superuser replication;
  12. create database repmgr owner repmgr;
  13. \q

3.5、配置用户登录数据库免密

  1. su - postgres
  2. vim .pgpass
  3. # ip:port:repmgr:repmgr:repmgr
  4. *:*:repmgr:repmgr:123456
  5. chmod 600 .pgpass
  6. #注意该配置必须有,否则在执行 switchover 的时候,standby 可以正常提升为 primary,但旧 primary 无法自动
  7. #跟随新主,每台主机上都要进行配置,node2 和 node3 也要进行配置。
  8. # 重启生效
  9. systemctl restart postgresql-14.service

3.6、配置repmgr.conf

  1. mkdir -p /etc/repmgr/log
  2. chown -R postgres:postgres /etc/repmgr
  3. vim /etc/repmgr/14/repmgr.conf
  4. # 基本信息
  5. # node_id、node_name、conninfo需要与从库不同
  6. # 节点ID,高可用集群各节点标识
  7. node_id=1
  8. # 节点名称,高可用集群各节点名称
  9. # 对应集群中select * from pg_stat_replication;中查到的application_name
  10. node_name='master'
  11. # 本节点数据库连接信息
  12. # 集群中的所有服务器都必须能够使用此字符串连接到本地节点
  13. conninfo='host=master user=repmgr dbname=repmgr password=123456 connect_timeout=2'
  14. # pg数据目录
  15. data_directory='/app/pgsql/14/data'
  16. # 流复制数据库用户,默认使用repmgr
  17. replication_user='repmgr'
  18. # repmgr软件目录
  19. repmgr_bindir='/usr/pgsql-14/bin'
  20. # pg软件目录
  21. pg_bindir='/usr/pgsql-14/bin'
  22. # 日志管理
  23. log_level=INFO
  24. # log文件需要提前创建
  25. log_file='/etc/repmgr/log/repmgrd.log'
  26. # 此设置导致repmgrd以指定的时间间隔(以秒为单位,默认为300)发出状态日志行,描述repmgrd的当前状态
  27. log_status_interval=10
  28. # pg、repmgr服务管理命令
  29. service_start_command='pg_ctl -D /app/pgsql/14/data/ start -o \'-c config_file=/app/pgsql/14/data/postgresql.conf\' -l /app/pgsql/14/data/logs/start.log'
  30. service_stop_command='pg_ctl -D /app/pgsql/14/data/ stop -o \'-c config_file=/app/pgsql/14/data/postgresql.conf\' -l /app/pgsql/14/data/logs/start.log'
  31. service_restart_command='pg_ctl -D /app/pgsql/14/data/ restart -o \'-c config_file=/app/pgsql/14/data/postgresql.conf\' -l /app/pgsql/14/data/logs/start.log'
  32. service_reload_command='pg_ctl reload'
  33. # repmgrd运行时的pid文件
  34. repmgrd_pid_file='/etc/repmgr/log/repmgrd.pid'
  35. repmgrd_service_start_command='repmgrd start'
  36. repmgrd_service_stop_command='kill -9 `cat /etc/repmgr/log/repmgrd.pid`'
  37. # failover设置
  38. failover='automatic'
  39. # 当repmgrd确定当前节点将成为新的主节点时,将在故障转移情况下执行promote_command中定义的程序或脚本
  40. promote_command='repmgr standby promote   --log-to-file'
  41. # %n将被替换repmgrd与新的主节点的ID,如果没有提供,repmgr standby follow将尝试自行确定新的主repmgr standby follow节点,但如果在新主节点提升后原主节点重新上线,则存在导致节点继续跟随原主节点的风险
  42. follow_command='repmgr standby follow   --log-to-file --upstream-node-id=%n'
  43. # 高可用参数设置
  44. # 定义节点位置的任意字符串,在故障转移期间用于检查当前主节点的可见性
  45. location='location1'
  46. # 节点优先级,选主时可能使用到(lsn > priority > node_id),0代表该节点不会被提升为主节点
  47. priority=100
  48. # 是否将监控数据写入monitoring_history表
  49. monitoring_history=yes
  50. # 故障转移之前,尝试重新连接的间隔(以秒为单位)
  51. reconnect_interval=5
  52. # 故障转移之前,尝试重新连接的次数
  53. reconnect_attempts=3
  54. # ping: repmg使用PQPing()方法测试连接
  55. # connection: 尝试与节点建立新的连接
  56. # query:通过现有连接在节点上执行SQL语句
  57. connection_check_type=ping
  58. # 写入监控数据的间隔
  59. monitor_interval_secs=5
  60. use_replication_slots=true

3.7、注册master节点

  1. su - postgres
  2. repmgr primary register

3.8、查看集群信息

  1. # 第一种方式
  2. repmgr cluster show
  3. # 第二种方式
  4. psql -U repmgr -d repmgr
  5. repmgr=# \x 1
  6. Expanded display is on.
  7. repmgr=# select * from repmgr.nodes;

3.9、附

  1. # 配置文件发生改变,需要在每个节点执行
  2. $ repmgr primary register --force
  3. $ repmgr standby register --force
  4. $ repmgr witness register --force -h primary_host

3.10、配置postgresql配置

  1. cd /app/pgsql/14/data
  2. vim postgresql.conf
  3. shared_preload_libraries = 'repmgr'
  4. systemctl restart postgresql-14

3.11、启动repmgrd服务

  1. # 创建日志文件,repmgrd的日志文件需要手动创建
  2. # /etc/repmgr/log/repmgrd.log和/app/repmgr/conf/repmgr.conf配置文件中的log_file匹配
  3. touch /etc/repmgr/log/repmgrd.log
  4. # 启动repmgrd服务
  5. su - postgres
  6. repmgrd  start

3.12、配置日志轮替

为确保当前的 repmgrd 日志文件( repmgr.conf 配置文件中用参数 log_file 指定的文件)不会无限增长

  1. /etc/repmgr/log/repmgrd.log {
  2.       missingok
  3.       compress
  4.       rotate 52
  5.       maxsize 100M
  6.       weekly
  7.       create 0600 postgres postgres
  8.       postrotate
  9.       /usr/bin/killall -HUP repmgrd
  10.       endscript
  11. }

3.13、repmgrd重载配置

  1. # 1、kill 旧进程
  2. kill -9 `cat /etc/repmgr/log/repmgrd.pid`
  3. # 2、start
  4. repmgrd  start

4、node1、2配置

4.1、配置repmgr免密登录

  1. su - postgres
  2. vim .pgpass
  3. # ip:port:repmgr:repmgr:repmgr
  4. *:*:repmgr:repmgr:123456

4.2、安装repmgr

yum install -y repmgr_14

4.3、创建repmgr.conf配置文件

  1. mkdir -p /etc/repmgr/log
  2. chown -R postgres:postgres /etc/repmgr/
  3. vim /etc/repmgr/14/repmgr.conf
  4. # 基本信息
  5. # node_id、node_name、conninfo需要与从库不同
  6. # 节点ID,高可用集群各节点标识
  7. node_id=2
  8. # 节点名称,高可用集群各节点名称
  9. # 对应集群中select * from pg_stat_replication;中查到的application_name
  10. node_name='node1'
  11. # 本节点数据库连接信息
  12. # 集群中的所有服务器都必须能够使用此字符串连接到本地节点
  13. conninfo='host=node1 user=repmgr dbname=repmgr password=123456 connect_timeout=2'
  14. # pg数据目录
  15. data_directory='/app/pgsql/14/data'
  16. # 流复制数据库用户,默认使用repmgr
  17. replication_user='repmgr'
  18. # repmgr软件目录
  19. repmgr_bindir='/usr/pgsql-14/bin'
  20. # pg软件目录
  21. pg_bindir='/usr/pgsql-14/bin'
  22. # 日志管理
  23. log_level=INFO
  24. # log文件需要提前创建
  25. log_file='/etc/repmgr/log/repmgrd.log'
  26. # 此设置导致repmgrd以指定的时间间隔(以秒为单位,默认为300)发出状态日志行,描述repmgrd的当前状态
  27. log_status_interval=10
  28. # pg、repmgr服务管理命令
  29. service_start_command='pg_ctl -D /app/pgsql/14/data/ start -o \'-c config_file=/app/pgsql/14/data/postgresql.conf\' -l /app/pgsql/14/data/logs/start.log'
  30. service_stop_command='pg_ctl -D /app/pgsql/14/data/ stop -o \'-c config_file=/app/pgsql/14/data/postgresql.conf\' -l /app/pgsql/14/data/logs/start.log'
  31. service_restart_command='pg_ctl -D /app/pgsql/14/data/ restart -o \'-c config_file=/app/pgsql/14/data/postgresql.conf\' -l /app/pgsql/14/data/logs/start.log'
  32. service_reload_command='pg_ctl reload'
  33. # repmgrd运行时的pid文件
  34. repmgrd_pid_file='/etc/repmgr/log/repmgrd.pid'
  35. repmgrd_service_start_command='repmgrd start'
  36. repmgrd_service_stop_command='kill -9 `cat /etc/repmgr/log/repmgrd.pid`'
  37. # failover设置
  38. failover='automatic'
  39. # 当repmgrd确定当前节点将成为新的主节点时,将在故障转移情况下执行promote_command中定义的程序或脚本
  40. promote_command='repmgr standby promote   --log-to-file'
  41. # %n将被替换repmgrd与新的主节点的ID,如果没有提供,repmgr standby follow将尝试自行确定新的主repmgr standby follow节点,但如果在新主节点提升后原主节点重新上线,则存在导致节点继续跟随原主节点的风险
  42. follow_command='repmgr standby follow   --log-to-file --upstream-node-id=%n'
  43. # 高可用参数设置
  44. # 定义节点位置的任意字符串,在故障转移期间用于检查当前主节点的可见性
  45. location='location1'
  46. # 节点优先级,选主时可能使用到(lsn > priority > node_id),0代表该节点不会被提升为主节点
  47. priority=100
  48. # 是否将监控数据写入monitoring_history表
  49. monitoring_history=yes
  50. # 故障转移之前,尝试重新连接的间隔(以秒为单位)
  51. reconnect_interval=5
  52. # 故障转移之前,尝试重新连接的次数
  53. reconnect_attempts=3
  54. # ping: repmg使用PQPing()方法测试连接
  55. # connection: 尝试与节点建立新的连接
  56. # query:通过现有连接在节点上执行SQL语句
  57. connection_check_type=ping
  58. # 写入监控数据的间隔
  59. monitor_interval_secs=5
  60. use_replication_slots=true

4.4、检测备节点是否可克隆

  1. # --dry-run表示命令测试,并不会实际执行,可用于验证是否会出现一些基本错误
  2. su - postgres
  3. repmgr -h ${主服务器ip} -U repmgr -d repmgr standby clone --dry-run
  4. # 实际执行pg的克隆操作
  5. repmgr -h ${主服务器ip} -U repmgr -d repmgr standby clone

4.5、启动postgresql

systemctl restart postgresql

4.6、注册从库为备份服务器

  1. su - postgres
  2. repmgr --upstream-node-id=1 standby register

4.7、查看集群信息

repmgr cluster show

4.8、启动repmgrd

repmgrd  start

4.9、配置日志轮替

  1. vim /etc/logrotate.d/repmgr
  2. /etc/repmgr/log/repmgrd.log {
  3.       missingok
  4.       compress
  5.       rotate 52
  6.       maxsize 100M
  7.       weekly
  8.       create 0600 postgres postgres
  9.       postrotate
  10.       /usr/bin/killall -HUP repmgrd
  11.       endscript
  12. }

4.10、repmgrd重载配置

  1. su - postgres
  2. # 1、kill 旧进程
  3. kill -9 `cat /etc/repmgr/log/repmgrd.pid`
  4. # 2、start
  5. repmgrd  start

5、见证服务器配置

5.1、配置repmgr免密登录

  1. su - postgres
  2. vim .pgpass
  3. # ip:port:repmgr:repmgr:repmgr
  4. *:*:repmgr:repmgr:123456

5.2、初始化postgresql

  1. su - postgres
  2. initdb -D /app/pgsql/14/data/
  3. systemctl restart postgresql-14
  4. systemctl enable postgresql-14

5.3、配置repmgr

  1. mkdir -p /etc/repmgr/log
  2. chown -R postgres:postgres /etc/repmgr/
  3. # 基本信息
  4. # node_id、node_name、conninfo需要与从库不同
  5. # 节点ID,高可用集群各节点标识
  6. node_id=4
  7. # 节点名称,高可用集群各节点名称
  8. # 对应集群中select * from pg_stat_replication;中查到的application_name
  9. node_name='node3'
  10. # 本节点数据库连接信息
  11. # 集群中的所有服务器都必须能够使用此字符串连接到本地节点
  12. conninfo='host=node3 user=repmgr dbname=repmgr password=123456 connect_timeout=2'
  13. # pg数据目录
  14. data_directory='/app/pgsql/14/data'
  15. # 流复制数据库用户,默认使用repmgr
  16. replication_user='repmgr'
  17. # repmgr软件目录
  18. repmgr_bindir='/usr/pgsql-14/bin'
  19. # pg软件目录
  20. pg_bindir='/usr/pgsql-14/bin'
  21. # 日志管理
  22. log_level=INFO
  23. # log文件需要提前创建
  24. log_file='/etc/repmgr/log/repmgrd.log'
  25. # 此设置导致repmgrd以指定的时间间隔(以秒为单位,默认为300)发出状态日志行,描述repmgrd的当前状态
  26. log_status_interval=10
  27. # pg、repmgr服务管理命令
  28. service_start_command='pg_ctl -D /app/pgsql/14/data/ start -o \'-c config_file=/app/pgsql/14/data/postgresql.conf\' -l /app/pgsql/14/data/logs/start.log'
  29. service_stop_command='pg_ctl -D /app/pgsql/14/data/ stop -o \'-c config_file=/app/pgsql/14/data/postgresql.conf\' -l /app/pgsql/14/data/logs/start.log'
  30. service_restart_command='pg_ctl -D /app/pgsql/14/data/ restart -o \'-c config_file=/app/pgsql/14/data/postgresql.conf\' -l /app/pgsql/14/data/logs/start.log'
  31. service_reload_command='pg_ctl reload'
  32. # repmgrd运行时的pid文件
  33. repmgrd_pid_file='/etc/repmgr/log/repmgrd.pid'
  34. repmgrd_service_start_command='repmgrd start'
  35. repmgrd_service_stop_command='kill -9 `cat /etc/repmgr/log/repmgrd.pid`'
  36. # failover设置
  37. failover='automatic'
  38. # 当repmgrd确定当前节点将成为新的主节点时,将在故障转移情况下执行promote_command中定义的程序或脚本
  39. promote_command='repmgr standby promote   --log-to-file'
  40. # %n将被替换repmgrd与新的主节点的ID,如果没有提供,repmgr standby follow将尝试自行确定新的主repmgr standby follow节点,但如果在新主节点提升后原主节点重新上线,则存在导致节点继续跟随原主节点的风险
  41. follow_command='repmgr standby follow   --log-to-file --upstream-node-id=%n'
  42. # 高可用参数设置
  43. # 定义节点位置的任意字符串,在故障转移期间用于检查当前主节点的可见性
  44. location='location1'
  45. # 节点优先级,选主时可能使用到(lsn > priority > node_id),0代表该节点不会被提升为主节点
  46. priority=100
  47. # 是否将监控数据写入monitoring_history表
  48. monitoring_history=yes
  49. # 故障转移之前,尝试重新连接的间隔(以秒为单位)
  50. reconnect_interval=5
  51. # 故障转移之前,尝试重新连接的次数
  52. reconnect_attempts=3
  53. # ping: repmg使用PQPing()方法测试连接
  54. # connection: 尝试与节点建立新的连接
  55. # query:通过现有连接在节点上执行SQL语句
  56. connection_check_type=ping
  57. # 写入监控数据的间隔
  58. monitor_interval_secs=5
  59. use_replication_slots=true

5.4、启动repmgrd

  1. # 1、配置postgresql配置文件
  2. vim /app/pgsql/14/data/postgresql.conf
  3. # 添加如下内容
  4. listen_addresses = '*'
  5. port = 5432
  6. shared_preload_libraries = 'repmgr'
  7. # 2、修改pg_hba.conf
  8. host   repmgr       repmgr      0.0.0.0/0               trust
  9. # 3、重启postgresql
  10. systemctl restart postgresql-14
  11. systemctl enable postgresql-14
  12. # 4、创建repmgr数据库和用户
  13. su - postgres
  14. psql
  15. postgres=# create user repmgr with password '123456' superuser
  16. postgres=# create user repmgr with password '123456' superuser replication;
  17. CREATE ROLE
  18. postgres=#
  19. postgres=#
  20. postgres=# create database repmgr owner repmgr;
  21. CREATE DATABASE
  22. # 5、启动repmgrd
  23. repmgrd  start

5.5、配置repmgr日志轮替

  1. vim /etc/logrotate.d/repmgr
  2. /etc/repmgr/log/repmgrd.log {
  3.       missingok
  4.       compress
  5.       rotate 52
  6.       maxsize 100M
  7.       weekly
  8.       create 0600 postgres postgres
  9.       postrotate
  10.           /usr/bin/killall -HUP repmgrd
  11.       endscript
  12. }

5.6、repmgrd重载配置

  1. # 1、kill 旧进程
  2. kill -9 `cat /etc/repmgr/log/repmgrd.pid`
  3. # 2、start
  4. repmgrd  start

5.7、注册见证服务器

  1. su - postgres
  2. repmgr witness register -h 192.168.98.150 -U repmgr -d repmgr

5.8、查看集群

repmgr cluster show

6、附 关于脑裂问题

  1. # 6.1、关于脑裂问题
  2. systemctl stop postgresql-14.service
  3. repmgr node rejoin  -d 'host=node1 dbname=repmgr user=repmgr' --force-rewind --config-files=postgresql.conf --verbose  --dry-run
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/449829
推荐阅读
相关标签
  

闽ICP备14008679号