pgpool-ii4.1.2 高可用集群[主备切换]配置部分
接上篇postgresql + pgpool 构建容灾高可用集群(数据同步流复制/主备自动切换)
本篇主要内容:
- pgpool-ii 安装
- pgpool-ii 配置
- pgpool-ii 验证
概述:
在postgresql12 安装完成之后, 我们需要安装pool-ii中间件, 来完成 HA 自动切换, ip 自动切换的工作
- 当某一个数据库挂掉之后, 检测其生命状态, 执行相应策略(主库挂掉, 切换某个备库为主库等)
- 当某一个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
是配置用户链接时的验证策略, 和postgresql
的pg_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)
- 常用基础配置
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'
- 数据库故障转移(故障后处理)
# 数据库运行状况检查,以便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
- 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, 出现集群暂时不可访问;
- 关于在线恢复(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不可链接, 执行故障转移脚本, 将当前备库转换为主库为集群提供存储服务;
总结
- 数据库postgresql 层面的故障转移执行切换脚本, 本质上执行的还是
pg_ctl promote
命令; - pgpool-ii 层面故障, 后续的检测/切换虚拟IP, 是不影响下层postgresql数据库运行状态的;
- 在主机直接挂掉的情况下, 上面两个步骤是都要执行的;
- 数据库宕机恢复的本质依然是同步流复制
pg_basebackup
命令; - 即使是pgpool-ii 提供的在线恢复,本质上也是几个步骤的脚本:
清空备机节点数据目录 > 使用pg_basebackup命令同步数据 > 启动数据库服务 > 将数据库重新加入集群
一介书生,敲敲键盘而已。