pgpool-ii4.1.2 高可用集群[主备切换]配置部分

接上篇postgresql + pgpool 构建容灾高可用集群(数据同步流复制/主备自动切换)
本篇主要内容:

  1. pgpool-ii 安装
  2. pgpool-ii 配置
  3. pgpool-ii 验证

概述:

在postgresql12 安装完成之后, 我们需要安装pool-ii中间件, 来完成 HA 自动切换, ip 自动切换的工作

  1. 当某一个数据库挂掉之后, 检测其生命状态, 执行相应策略(主库挂掉, 切换某个备库为主库等)
  2. 当某一个pgpool节点不可用, 其他节点收到信息进行IP转移(访问入口接管)

服务器SSH免密设置

为后续使用 hostname 和脚本中 SSH 免登录:
host 文件添加(2台机器均修改)

10.242.111.204   master    
10.242.111.207   slave 
10.242.111.203    vip
# 主机/备机操作
su – postgres
-bash-4.2$ ssh-keygen
# 一直enter
-bash-4.2$ ssh-copy-id -i .ssh/id_rsa.pub master
-bash-4.2$ ssh-copy-id -i .ssh/id_rsa.pub slave

pgpool-ii 4.1 安装(2台机器均安装)

ftp 文件服务器地址中: https://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/
中间的版本号可以可以更改, 但后续pg版本也需要对应上

yum 在线安装

#设置rpm源
curl -O  https://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/pgpool-II-release-4.1-2.noarch.rpm  
rpm -ivh pgpool-II-release-4.1-2.noarch.rpm

#安装(关于对应的 postgresql 版本,体现在文件名中的 pgXX 这里)
yum -y install pgpool-II-pg12
yum -y install pgpool-II-pg12-debuginfo
yum -y install pgpool-II-pg12-devel
yum -y install pgpool-II-pg12-extensions

rpm离线安装

# ftp下载rpm离线包
curl -O https://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/pgpool-II-pg12-4.1.2-1pgdg.rhel7.x86_64.rpm
curl -O https://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/pgpool-II-pg12-debuginfo-4.1.2-1pgdg.rhel7.x86_64.rpm
curl -O https://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/pgpool-II-pg12-devel-4.1.2-1pgdg.rhel7.x86_64.rpm
curl -O https://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/pgpool-II-pg12-extensions-4.1.2-1pgdg.rhel7.x86_64.rpm
# 上传文件到服务器之后, 执行安装命令
rpm -ivh pgpool*.rpm

补充: 源码编译安装参照官方指定文档:https://www.pgpool.net/docs/pgpool-II-4.1.2/en/html/installation.html
补充: 旧版中文文档

目录/相关命令授权

因为pgpool-ii 配置中会以 postgres 用户执行一些系统权限命令, 需要使用设置普通用户授权:

chmod u+x /usr/sbin/ip
chmod u+s /usr/sbin/arping
chmod u+s /sbin/ip
chmod u+s /sbin/ifconfig

配置中相关的日志目录,pid 目录权限:

chown postgres.postgres /var/run/pgpool
mkdir -p /var/log/pgpool/
touch /var/log/pgpool/pgpool_status
chown -R postgres.postgres /var/log/pgpool/

pgpool-ii 相关配置(/etc/pgpool-II/)

1. pool_hba.conf (主备相同)

pool_hba.conf 是配置用户链接时的验证策略, 和postgresqlpg_hba.conf保持一致,要么都是trust,要么都是md5验证方式,这里采用了md5验证方式如下设置:

[root@localhost ~] su - postgres
-bash-4.2$ cd /etc/pgpool-II/
-bash-4.2$ vim pool_hba.conf
#编辑内容如下(这里和postgressql设置一样, trust/md5保持一致)
# IPv4 local connections:
host    all         all         0.0.0.0/0          md5
host    all         all         0/0                 md5

2. pcp.conf / pool_passwd (主备相同)

这个文件是pgpool管理器自己的用户名和密码,用于管理集群的.

-bash-4.2$ pg_md5 postgres
e8a48653851e28c69d0506508fb27fc5
-bash-4.2$ vim pcp.conf
#编辑内容如下:
# USERID:MD5PASSWD
postgres: e8a48653851e28c69d0506508fb27fc5
#在pgpool中添加pg数据库的用户名和密码
[postgres@etc~]$ pg_md5 -p -m -u postgres pool_passwd
#数据库登录用户是postgres,这里输入登录密码,不能出错
#输入密码后,在/etc/pgpoll-II目录下会生成一个pool_passwd文件

3. pgpool.conf (重点)

这个文件中会配置我们pgpool-ii 节点的关键参数, pgpool-ii 自带提供几种不同模式的配置文件:

# 执行完前面步骤 /etc/pgpool-II/目录下的文件, 我们需要用到的
failover.sh                (数据库故障切换脚本)
pcp.conf                   (用户访问验证策略trust/md5)
pgpool.conf                (pgpool-ii 主配置文件)
pool_hba.conf              (集群节点密码管理)
pool_passwd                (数据库密码管理文件)
recovery_1st_stage.sample  (在线故障恢复的脚本示例, 放到postgresql数据目录/var/lib/pgsql/12/data 下)

主库pgpool-ii 节点(10.242.111.204-master)

  1. 常用基础配置

pid_file_name = '/var/run/pgpool/pgpool.pid'# pid 文件位置, 如果不配置有默认的
logdir = '/var/run/pgpool'                  # status 文件存储位置
# 通用
listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
pcp_port = 9898

# 后台数据库链接信息配置
backend_hostname0 = 'master'                # 第一台数据库信息
backend_port0 = 5432
backend_weight0 = 1                         # 这个权重和后面负载比例相关
backend_data_directory0 = '/var/lib/pgsql/12/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = 'slave'                 # 第一台数据库信息
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/12/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'

# 流复制相关配置
replication_mode = off                      # pgpool-ii 中复制制模式关闭
load_balance_mode = on                      # 负载均衡打开
master_slave_mode = on                      # 主从打开
master_slave_sub_mode = 'stream'            # 主从之间模式为流传输stream

sr_check_period = 5                         # 流复制检查相关配置
sr_check_user = 'repuser'
sr_check_password = 'repuser'
sr_check_database = 'postgres'
  1. 数据库故障转移(故障后处理)
# 数据库运行状况检查,以便Pgpool-II执行故障转移: 数据库的主备切换
health_check_period = 10                    # Health check period, Disabled (0) by default
health_check_timeout = 20                   # 健康检查的超时时间,0 永不超时
health_check_user = 'postgres'              # 健康检查的用户
health_check_password = 'postgres'          # 健康检查的用户密码
health_check_database = 'postgres'          # 健康检查的数据库

# 故障后处理, 为了当postgresql数据库挂掉之后执行相应的策略
# 这个脚本时放在pgpool的目录下, 确切的说是由pgpool执行脚本来维护集群中数据库的状态
failover_command = '/etc/pgpool-II/failover.sh %H %R '
# follow_master_command = ''                # 2台服务器不配置
# 如果使用3台PostgreSQL服务器,则需要指定follow_master_command在主节点故障转移上的故障转移后运行。如果有两个PostgreSQL服务器,则无需follow_master_command设置。
# 具体脚本文件内容见文末

配置文件中传入的相应参数请参照: config-failover-params

  1. watchdog(看门狗)配置(用于检测pgpool-ii 节点状态, 为后续pgpool故障处理提供依据)
use_watchdog = on                           # 激活看门狗配置
wd_hostname = 'master'                      # 当前主机(也可使用IP)
wd_port = 9000                              # 工作端口

# 虚拟IP指定
delegate_IP = '10.242.111.203'
if_cmd_path = '/sbin'                       # 如果if_up_cmd, if_down_cmd 以/开头, 忽略此配置
# 命令中的`ens160` 请根据自己机器上ip addr 实际的网卡名称进行修改
# 当前节点启动指定虚拟IP的命令
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens160 label ens160:0'
# 当前节点指定关闭虚拟IP的命令
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens160'

# watchdog 健康检查
wd_heartbeat_port = 9694                    # 健康检查端口
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
# 其他机器地址配置(多台请增加配置)
heartbeat_destination0 = 'slave'
heartbeat_destination_port0 = 9694
heartbeat_device0 = 'ens160'

# 其他pgpgool节点链接信息(多台请增加配置)
other_pgpool_hostname0 = 'slave'            # 其他节点地址
other_pgpool_port0 = 9999
other_wd_port0 = 9000                       # 其他节点watchdof 端口

# watchdog 发生故障后, 处理的相关配置(宕机, pgpool进程终止)
# 当某个节点故障后, 
failover_when_quorum_exists = on
failover_require_consensus = on
allow_multiple_failover_requests_from_node = on
enable_consensus_with_half_votes = on
  • 关于watchdog本身(pgpool-ii)发生故障后相关的处理策略, 请务必阅读官方文档: CONFIG-WATCHDOG-FAILOVER-BEHAVIOR
  • watchdog本身(pgpool-ii节点)本身故障后, 如果配置打开, 其他节点会执行仲裁, 如仲裁从节点中那一个成为主节点, 那一台阶段虚拟IP等, 这个仲裁本身有投票机制, 和无视仲裁结果等配置;
  • 如果不配置, 主pgpool-i 节点关闭后, 可能不会转移虚拟IP, 出现集群暂时不可访问;
  1. 关于在线恢复(master 恢复后自动变为备库)
# 此配置将在多个pgpool-ii 节点时无效
recovery_user = 'postgres'
recovery_password = 'postgres'
recovery_1st_stage_command = 'recovery_1st_stage'   # 这个脚本时放在postgresql数据目录下的
  • 如果有多个pgpool-ii 节点共同维护集群状态, 此配置将不可用, 需要手动恢复同步数据>加入集群

备库pgpool-ii 节点(10.242.111.207-slave)

# 将主库的配置文件拷贝过来
scp master:/etc/pgpool-II/pool.conf /etc/pgpool-II/pool.conf
# 修改以下几项即可
wd_hostname = 'slave'               # 当前机器
heartbeat_destination0 = 'master'   # 其他pg库机器
other_pgpool_hostname0 = 'master'   # 其他pgpool节点机器

启动验证

启动/终止命令

su  - postgres
# 启动命令(日志位置可在命令中指定)
pgpool -n -d -D > /var/log/pgpool/pgpool.log 2>&1 &     # 有debug日志
pgpool -n -D > /var/log/pgpool/pgpool.log 2>&1 &        # 无debug日志

# 终止命令
pgpool -m fast stop

启动完成之后, 可登陆虚拟IP, 进行集群状态查询

psql -h vip -p9999 -Upostgres -d postgres
#或
psql -h 10.242.111.203 -p9999 -Upostgres -d postgres

查询结果可见:

[root@slave ~]# psql -h 10.242.111.203 -p9999 -Upostgres -d postgres
Password for user postgres:
psql (12.3)
Type "help" for help.

postgres=# show pool_nodes;
 node_id | hostname | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change
---------+----------+------+--------+-----------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
 0       | master   | 5432 | up     | 0.500000  | primary | 0          | true              | 0                 |                   |                        | 2020-06-22 17:48:51
 1       | slave    | 5432 | up     | 0.500000  | standby | 0          | false             | 0                 |                   |                        | 2020-06-22 17:48:51
(2 rows)
  • lb_weight和前面pool.conf配置中backend_weight0 = 1的比例有关;
  • role 为postgresql 数据库的主备状态;
  • up为数据库已加入集群管理;
  • 此时可以通过虚拟IP链接, 执行新增/修改/删除等操作来测试集群正常工作状态的数据同步;

宕机验证

1. pgpool-ii 节点宕机(pgpool-ii 进程被终止)

处理关键步骤:

  • 如果时正常关闭: 释放虚拟IP > 节点正常关闭 > 其他节点检测到时区链接 > 仲裁选出新的"主节点" > 接管虚拟IP > 正常提供服务
  • 如果异常关闭: 其他节点检测到时区链接且IP不可用> 仲裁选出新的"主节点" > 接管虚拟IP > 正常提供服务
```bash
# 在master节点上停止pgpool服务
-bash-4.2$ pgpool -m fast stop
# 原从节点切换完之后,访问集群
# 可查看/var/log/pgpool/pgpool.log 日志, 可看到被关闭的释放虚拟IP, 其他节点接管虚拟IP
-bash-4.2$ psql -h vip -p 9999
# 提示输入密码:
Type "help" for help.

postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay 
---------+----------+------+--------+-----------+---------+------------+-------------------+-------------------
0       | master   | 5432 | up     | 0.500000  | primary | 0             | false  | 0
1       | slave    | 5432 | up     | 0.500000  | standby | 0             |  true  | 0
(2 rows)
#访问成功,在master节点上的pgpool宕机后,由slave节点的pgpool接管vip和集群服务,并未中断应用访问。
```
主机日志(/var/log/pgpool/pgpool.log):  
![](https://img2020.cnblogs.com/blog/1039023/202006/1039023-20200622111329338-833776717.png)  
备机日志(/var/log/pgpool/pgpool.log):  
![](https://img2020.cnblogs.com/blog/1039023/202006/1039023-20200622111444310-860554689.png)

2. postgresql 数据库宕机

 # 模拟数据库宕机
 systemctl stop postgresql-12

 postgres=# show pool_nodes;
 node_id | hostname | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay 
 ---------+----------+------+--------+-----------+---------+------------+-------------------+-------------------
 0       | master   | 5432 | down   | 0.500000  | standby | 0          | false             | 0
 1       | slave    | 5432 | up     | 0.500000  | primary | 0          | true              | 0
 (2 rows)
 #slave已经被切换成primary,且master节点状态是down
  • master的数据库挂(primary)掉了,同时变成了standby,pgpool执行数据库故障切换脚本failover.sh,slave正在作为新的主数据库(primary)提供服务
  • 这里当master 重启之后, 需要恢复同步数据, 重新加入集群
# 1. 恢复同步数据
# 2. 清除当前"备库"上的data目录
mkdir /var/lib/pgsql/12/data
chmod 0700 data
chown postgres.postgres data
# 3. 执行复制命令
su – postgres
pg_basebackup -h 目标机器IP -p 5432 -U repuser -Fp -Xs -Pv -R -D /var/lib/pgsql/12/data
# 4. 启动服务(切换到root用户)
systemctl restart postgresql-12
# 5. 重新将postgresql数据库加入集群管理(su - postgres)
# -n 节点序号, postgresql 数据库在集群中的节点序号
pcp_attach_node -d -U postgres -h vip -p 9898 -n 0
# 6. 此时
node_id | hostname | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay 
 ---------+----------+------+--------+-----------+---------+------------+-------------------+-------------------
 0       | master   | 5432 | up    | 0.500000  | standby | 0          | false             | 0
 1       | slave    | 5432 | up    | 0.500000  | primary | 0          | true              | 0
 (2 rows)
  • 如果只有一个pgpool-ii 节点, 可以使用pgpool.conf中配置的recovery_1st_stage_command在线恢复来操作. 多个pgpool节点此配置不支持.

3. 主机直接宕机

  • 主机直接宕机, 意味着当前机器时区所有链接, 其他pgpool-ii 节点检测不到原"主pgpool-ii"节点存活
  • 首先, 选举出一个pgpool-ii 节点承担责任
  • 接管维护虚拟IP的责任, 启动指定的虚拟ip
  • 此时检测到原主数据库primary不可链接, 执行故障转移脚本, 将当前备库转换为主库为集群提供存储服务;

总结

  1. 数据库postgresql 层面的故障转移执行切换脚本, 本质上执行的还是 pg_ctl promote命令;
  2. pgpool-ii 层面故障, 后续的检测/切换虚拟IP, 是不影响下层postgresql数据库运行状态的;
  3. 在主机直接挂掉的情况下, 上面两个步骤是都要执行的;
  4. 数据库宕机恢复的本质依然是同步流复制pg_basebackup命令;
  5. 即使是pgpool-ii 提供的在线恢复,本质上也是几个步骤的脚本:
    清空备机节点数据目录 > 使用pg_basebackup命令同步数据 > 启动数据库服务 > 将数据库重新加入集群
posted @ 2020-06-22 11:42  世间草木  阅读(4172)  评论(17编辑  收藏  举报