PostgreSQL+repmgr集群部署(一主一备一仲裁)

前言:

repmgr是一套开源工具,用于管理 PostgreSQL 服务器集群内的复制和故障转移。repmgr 支持并增强了 PostgreSQL 的内置流复制,它提供了一个单一的读/写主服务器和一个或多个只读备用服务器。

repmgr 流复制管理工具对 PostgreSQL 集群节点的管理是基于分布式的管理方式。集群每个节点都具备一个 repmgr.conf 配置文件,用来记录本节点的 ID、节点名称、连接信息、数据库的 PGDATA 目录等配置参数。在完成参数配置后,就可以通过 repmgr 命令实现对集群节点的 “一键式” 部署。

Repmgr整体架构图:

PostgreSQL+repmgr集群部署(一主一备一仲裁)-每日运维

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

选举原理

在发生 Auto Failover 时,备节点在尝试多次连接主节点失败后(尝试次数及尝试间隔可以通过 repmgr.conf 配置文件修改),repmgrd 会在所有备节点中选举一个候选备节点(选举机制参考下文)提升为新主节点,其他备节点去 Follow 到该新主上,形成一个新的集群。

repmgr 选举候选备节点按照以下顺序选举:LSN > Priority > Node_ID

  • 系统将优先选举一个 LSN 较大的节点,作为候选备节点;
  • 若 LSN 一样,会根据 Priority 优先级进行比较(该优先级是在配置文件中进行参数配置,如果 Priority 为 0,则代表该节点被禁止提升为主节点);
  • 若优先级也一样,会比较节点的 Node ID,小者会优先选举。

两个工具

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

repmgr 是一个执行管理任务的命令行工具,方便进行 PostgreSQL 服务器集群的管理。具备以下功能特点:

  • 设置备用服务器
  • promote 备
  • 主从切换
  • 显示复制集群中服务器的状态

repmgrd 是一个守护进程,它主动监视复制集群中的服务器并支持以下任务:

  • 监控和记录复制集群信息
  • 故障检测、故障转移
  • 集群中事件的通知(需要自定义脚本接受通知)

接下来开始部署:

  1. 环境设置
    1. 环境规划
主机名称主机IP用途操作系统PostgreSQL版本Repmgr版本
Node1192.168.1.71PrimaryCentOS Linux 7.916.25.4.1
Node2192.168.1.72StandbyCentOS Linux 7.916.25.4.1
Node3192.168.1.73witnessCentOS Linux 7.916.25.4.1
    1. 统一主机名称

vi /etc/hostname

或 hostnamectl set-hostname Node1

    1. 关闭SELINUX

sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config

    1. 关闭防火墙

systemctl stop firewalld.service

systemctl disable firewalld.service

或设置开放端口:

查看开放的端口:

firewall-cmd --list-ports
开启防火墙端口:

firewall-cmd --zone=public --add-port=5432/tcp --permanent
命令含义:
–zone #作用域
–add-port=9200/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效

重新加载一遍才会生效:

firewall-cmd --reload

    1. 安装插件

yum -y install readline readline-devel zlib zlib-devel gettext gettext-devel openssl openssl-devel pam pam-devel libxml2 libxml2-devel libxslt libxslt-devel perl perl-devel tcl-devel uuid-devel gcc gcc-c++ make flex bison perl-ExtUtils* libicu libicu-devel ntp libcurl-devel

    1. 编辑hosts

将主机名和 ip 解析写到/etc/hosts 文件。

cat>>/etc/hosts/etc/security/limits.conf/etc/sysctl.conf