• repmgr管理pg高可用


    repmgr用于管理 PostgreSQL 服务器集群内的复制和故障转移,类似dg-broker,可以实现swichover和failover。

    整体架构

    repmgr架构图如下:

    每个节点都可通过 repmgrd 守护进程来监控节点数据库状态;每个节点元数据表可独立维护,这些元数据表将记录集群所有节点的信息。

    在发生failover时,备节点尝试多次连接主节点失败后(尝试次数和间隔可通过repmgr.conf配置),repmgrd会在所有备节点中选举一个作为新主节点(repmgr 选举新主节点按照以下顺序选举:LSN > Priority > Node_ID),其他备节点会follow新主节点,形成新的集群。

    两个工具

    repmgr主要提供了repmgr和repmgrd两个工具:

    repmgr 是一个执行管理任务的命令行工具,方便进行 PostgreSQL 服务器集群的管理,主要功能有:

    • 主备节点加入集群;
    • 查询集群所有节点状态;
    • 主从switchover;
    • failover的旧主节点rejoin集群

    repmgrd作为守护进程,监视集群中节点的状态,主要功能如下:

    • 监控和记录集群信息;
    • 自动故障检测
    • 自动failover(选主原则:LSN > Priority > Node_ID)

    元数据信息

    为了有效地管理复制集群,repmgr 需要将集群中节点的相关信息存储在 repmgr 专用数据库表中。包含以下对象:

    表:

    repmgr.events: records events of interest
    repmgr.nodes: 复制集群中每个节点的连接和状态信息
    repmgr.monitoring_history: repmgrd 写入的历史备用监控信息

    视图:

    repmgr.show_nodes: 基于 repmgr.nodes 表,另外显示服务器上游节点的名称
    repmgr.replication_status: 当启用 repmgrd 的监控时,显示每个 standby 的监控状态

    注:

    repmgr 元数据信息只能存储在被此repmgr管理的集群中,且需要可以访问数据库和执行更改的管理用户,由于repmgr的初始安装需要超级用户权限,所以此管理用户需要被赋予superuser权限。

    安装repmgr

    1、主机规划

    主机名IPnode_idnode_namepriority备注
    pr-obsrv0110.10.237.111obsrv01默认100pg、repmgr、repmgrd
    pr-obsrv0210.10.237.122obsrv02默认100pg、repmgr、repmgrd
    pr-obsrv0310.10.237.133obsrv03默认100pg、repmgr、repmgrd

    2、安装repmgr

    2.1 下载repmgr

    repmgr - Replication Manager for PostgreSQL clusters

    Release notes: repmgr - Replication Manager for PostgreSQL clusters

    可选择最新版本(最新版本5.4.1支持pg9.4~pg15)

    2.2 操作系统配置(三个节点都执行)
    2.2.1 关闭防火墙和selinux
    1. systemctl stop firewalld
    2. systemctl disable firewalld
    3. vi /etc/selinux/config
    4. SELINUX=disabled
    5. reboot
    2.2.2 创建pg目录和用户
    1. mkdir /pg
    2. useradd -d /pg pg
    3. passwd pg
    4. cp /etc/skel/* /pg
    5. chown -R pg.pg /pg
    6. su - pg
    7. vi .bash_profile
    8. export PGHOME=/pg
    9. export PGDATA=$PGHOME/data
    10. export PATH=$PATH:$PGHOME/bin
    11. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGHOME/lib
    2.2.3 配置/etc/hosts

    cat /etc/hosts

    10.10.237.11 pr-obsrv01
    10.10.237.12 pr-obsrv02
    10.10.237.13 pr-obsrv03

    2.2.4 配置pg用户ssh免密
    1. su - pg
    2. ssh-keygen -t rsa
    3. ssh-copy-id -i /pg/.ssh/id_rsa pr-obsrv01
    4. ssh-copy-id -i /pg/.ssh/id_rsa pr-obsrv02
    5. ssh-copy-id -i /pg/.ssh/id_rsa pr-obsrv03
    6. 节点1执行:
    7. ssh pr-obsrv02
    8. ssh pr-obsrv03
    9. 节点2执行:
    10. ssh pr-obsrv01
    11. ssh pr-obsrv03
    12. 节点3执行:
    13. ssh pr-obsrv01
    14. ssh pr-obsrv02
    2.2.5 创建目录
    1. su - pg
    2. mkdir data
    3. mkdir log
    4. mkdir archive_wals
    2.2.6 安装依赖包
    1. yum -y install libselinux-devel
    2. yum -y install libxml2-devel
    3. yum -y install libxslt-devel
    4. yum -y install openssl-devel
    5. yum -y install pam-devel
    6. yum -y install readline-devel
    2.3 安装repmgr(三个节点都安装)
    1. su - pg
    2. tar -xvf repmgr-5.4.1.tar.gz
    3. mv repmgr-5.4.1 repmgr
    4. cd repmgr
    5. ./configure
    6. make install
    7. repmgr -V

    安装后会在/pg/bin下生成repmgr和repmgrd两个可执行文件;在/pg/share/postgresql/extension/下生成repmgr文件;在/pg/lib/postgresql下生成repmgr.so

    2.4 配置repmgr.conf

    注意:不要将repmgr.conf放在PGDATA目录下
     

    1. cat repmgr.conf
    2. node_id=1
    3. node_name=obsrv01
    4. conninfo='host=10.10.237.11 port=5434 user=repmgr password=repmgr dbname=repmgr connect_timeout=5'
    5. data_directory='/pg/data'
    6. pg_bindir='/pg/bin'
    7. location='default'
    8. failover='automatic'
    9. promote_command='/pg/bin/repmgr standby promote -f /pg/repmgr.conf --log-to-file'
    10. follow_command='/pg/bin/repmgr standby follow -f /pg/repmgr.conf --log-to-file --upstream-node-id=%n'
    11. log_file='/pg/log/repmgrd.log'
    12. monitoring_history=true
    13. monitor_interval_secs=5
    14. reconnect_attempts=6
    15. reconnect_interval=5

    注:其他两个节点除了 node_id、node_name和conninfo不同,其他配置均相同

     2.5 安装PG13(三个节点都安装)
    1. su - pg
    2. tar -xvf postgresql-13.11.tar.gz
    3. cd postgresql-13.11
    4. ./configure --prefix=/pg
    5. make -j 8
    6. make install
     2.6 初始化pg(节点1)
    initdb -D /pg/data
    2.7 配置postgres.conf(节点1)
    1. listen_addresses = '*' # what IP address(es) to listen on;
    2. port = 5434 # (change requires restart)
    3. max_connections = 100 # (change requires restart)
    4. shared_buffers = 128MB # min 128kB
    5. wal_level = replica # minimal, replica, or logical
    6. max_wal_size = 1GB
    7. min_wal_size = 80MB
    8. archive_mode = on # enables archiving; off, on, or always
    9. archive_command = 'test ! -f /pg/archive_wals/%f && cp %p /pg/archive_wals/%f' # command to use to archive a logfile segment
    10. max_wal_senders = 10 # max number of walsender processes
    11. hot_standby = on # "off" disallows queries during recovery
    12. logging_collector = on # Enable capturing of stderr and csvlog
    13. log_directory = '/pg/log' # directory where log files are written,
    14. log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
    15. log_file_mode = 0600 # creation mode for log files,
    16. log_rotation_age = 1d # Automatic rotation of logfiles will
    17. log_rotation_size = 10MB # Automatic rotation of logfiles will
    18. log_timezone = 'Asia/Shanghai'
    19. shared_preload_libraries = 'repmgr' # (change requires restart)
    20. wal_log_hints = 'on' # pg_rewind需要开启wal_log_hints,否则无法修复failover的旧主节点只能重建
    2.8 追加以下到pg_hba.conf
    1. local replication repmgr trust
    2. host replication repmgr 127.0.0.1/32 trust
    3. host replication repmgr 10.10.237.11/25 trust
    4. host replication repmgr 10.10.237.12/25 trust
    5. host replication repmgr 10.10.237.13/25 trust
    6. local repmgr repmgr trust
    7. host repmgr repmgr 127.0.0.1/32 trust
    8. host repmgr repmgr 10.10.237.11/25 trust
    9. host repmgr repmgr 10.10.237.12/25 trust
    10. host repmgr repmgr 10.10.237.13/25 trust
    2.9 启动节点1并创建repmgr相关用户和数据库
    1. su - pg
    2. pg_ctl start
    3. psql -Upostgres -p5434
    4. create user repmgr superuser password 'repmgr';
    5. ALTER USER repmgr SET search_path TO repmgr, "$user", public;
    6. create database repmgr owner repmgr;
    2.10 注册主节点到repmgr
    1. repmgr -f /pg/repmgr.conf primary register
    2. repmgr -f /pg/repmgr.conf cluster show

    或者在元数据库中查询

    1. psql -Urepmgr -drepmgr -p5434
    2. select * from nodes;
    2.11 clone两个从节点并注册(节点2和3依次运行)

    首先--dry-run检查extension和必要参数

    repmgr -h 10.10.237.11 -U repmgr -p 5434   -d repmgr -f /pg/repmgr.conf standby clone --dry-run

    没问题再进行clone

    repmgr -h 10.10.237.11 -U repmgr -p 5434   -d repmgr -f /pg/repmgr.conf standby clone

    最后HINT提示需要起postgres服务个register从节点

    1. pg_ctl start
    2. repmgr -f /pg/repmgr.conf standby register
    3. repmgr -f /pg/repmgr.conf cluster show
    2.12 启动repmgrd守护进程(三个节点都执行,可以实现自动failover)
    1. su - pg
    2. touch /pg/log/repmgrd.log
    3. repmgrd -f /pg/repmgr.conf start

    测试switchover

    某从节点执行

    repmgr -f /pg/repmgr.conf  standby switchover --siblings-follow

    测试failover

    将主节点的postgres进程kill掉看能否实现自动故障转移

    恢复原主节点可以使用以下命令

    repmgr -f /pg/repmgr.conf  node rejoin -d 'host=10.10.237.11 dbname=repmgr user=repmgr password=repmgr port=5434' --force-rewind

    思考

    • repmgr 本身不提供虚拟 ip 服务,如果需要虚拟 ip 服务,可使用 keepalived 或其它工具
    • 可以设置优先级高的节点为 sync 模式, sync 模式保证了数据的强一致性,将sync模式的从库的priority设高

    参考文档:

    PG 复制管理工具之 REPMGR - 墨天轮

    高可用 | repmgr 构建 PostgreSQL 高可用集群部署文档【建议收藏】 - 知乎

  • 相关阅读:
    A-level生物知识点:真核细胞
    深度学习入门(四十七)计算机视觉——SSD和YOLO简介
    MongoDB 安装报错:无法启动此程序,缺少dll文件
    使用set_handler过滤掉特定的SystemC Wraning &Error Message
    2022-2028全球有机硅醇酸面漆行业调研及趋势分析报告
    32.JavaScript类数组(Array-like)和可迭代对象(Iterable-object)的实现原理
    3款堪称神器的电脑软件,简单又实用
    Android 学习之追踪应用的安装情况
    给大家免费发布几款苹果CMSv10模板影视主题,附带教程和演示截图
    如何使用 python 爬取酷我在线音乐
  • 原文地址:https://blog.csdn.net/du18020126395/article/details/132875501