PostgreSQL高可用(三)解决pgpool的单点问题

文章目录

  • 主机分配
  • PGPOOL高可用,解决单点问题
    • 1 图例
    • 2 看门狗简介
    • 3 启动/停止看门狗
    • 4 配置看门狗 (pgpool.conf)
      • 4.1 基本配置
        • 4.1.1 启用
        • 4.1.2到前端服务器的链路
        • 4.1.2pgpool-II 的生命检查
        • 4.1.3 虚拟 IP 地址
        • 4.1.4看门狗服务器自监控
        • 4.1.5 监控服务器
      • 4.2 配置文件
    • 5 pgpool的启动和关闭
    • 6 启动后的虚拟ip
    • 7 PG连接

PostgreSQL高可用(一)主从流复制
PostgreSQL高可用(二)使用pgpool实现主从切换+读写分离,付:宕机后的恢复脚本
参考文档:
https://www.jianshu.com/p/ef183d0a9213
https://www.pgpool.net/docs/pgpool-II-3.2.1/pgpool-zh_cn.html

主机分配

  • OS:CentOS 7
  • 节点1:master(192.168.36.130)
  • 节点2:slave(192.168.36.131)
  • 节点3:pool-master(192.168.36.133)
  • 节点4:pool-slave(192.168.36.130)
    以下文章用到节点1,2,3,4

PGPOOL高可用,解决单点问题

pgpool自身就可以实现高可用,无需依赖其他插件。

1 图例

PostgreSQL高可用(三)解决pgpool的单点问题_第1张图片

2 看门狗简介

“看门狗”是一个 pgpool-II 的子进程,用于添加高可用性功能。 看门狗添加的功能包括:

  • pgpool 服务的生命检测
    看门狗监控 pgpool 服务的响应而不是进程。 它通过被它监控的 pgpool 发送查询到 PostgreSQL,并检查响应情况。
    看门狗还监控到从 pgpool 到前端服务器的连接(例如应用服务器)。 从 pgpool 到前端服务器的连接作为 pgpool 的服务来监控。

  • 看门狗进程相互监控
    看门狗进程交换被监控服务器的信息用来保证信息是最新的,并允许看门狗进程相互监控。

  • 在某些故障检测中交换活跃/备用状态
    当一个 pgpool 的故障被检测到,看门狗通知其他的看门狗这个消息。 看门狗在旧的活跃 pgpool 发生故障后通过投票确定新的活跃 pgpool 并更新活跃/备用状态。

  • 在服务器切换的时候实现自动虚拟 IP 地址分配
    当一个备用 pgpool 服务器提升为活跃的,新的活跃服务器启动虚拟 IP 接口。 也就是,之前的活跃服务器停用虚拟 IP 接口。 这确保活动的 pgpool 使用相同的 IP 地址,即使在发生服务器切换的时候。

  • 在恢复的时候自动注册服务器为备用服务器
    当失效的服务器恢复或者新的服务器连接上来,看门狗进程通知其他的看门狗进程关于新服务器的信息, 看门狗进程在活跃服务器和其他服务器上接收这些信息。 然后,新连接上的服务器注册为备用节点。

3 启动/停止看门狗

看门狗进程由 pgpool-II 自动启动/停止,也就是说,没有单独的命令来启动/停止它。 但是,pgpool-II 启动时必须拥有管理员权限(root), 因为看门狗进程需要控制虚拟 IP 接口。

在等待到所有的 pgpool 启动后,生命监测将启动。
所以在启动pgpool时使用root用户启动

4 配置看门狗 (pgpool.conf)

看门狗的配置参数在 pgpool.conf 中配置。 在 pgpool.conf.sample 文件中的 WATCHDOG 小节是配置看门狗的示例。 以下所有的选项都是使用看门狗进程必须指定的。

4.1 基本配置

4.1.1 启用

use_watchdog
如果为 on,则激活看门狗,默认为 off。

4.1.2到前端服务器的链路

trusted_servers
用于检测前端链路状态的信任服务器的列表。每个服务器需要能响应 ping。 用逗号分隔服务器的列表,例如“hostA,hostB,hostC”。

ping_path
本参数指定用于监控到前端服务器连接的 ping 命令的路径。只需要设置路径,例如“/bin”。

4.1.2pgpool-II 的生命检查

wd_interval
本参数指定用于 pgpool-II 生命检查的间隔,单位为秒(一个大于或等于 1 的数字)。

wd_life_point
pgpool-II 生命检测失败后重试次数(一个大于或等于 1 的数字)。

wd_lifecheck_query
用于检查 pgpool-II 的查询语句。默认为“SELECT 1”。

4.1.3 虚拟 IP 地址

delegate_IP
指定客户端服务器(应用服务器等)连接到的 pgpool-II 的虚拟 IP 地址(VIP)。 当一个 pgpool 从备用切换到活跃状态,pgpool 将使用这个 VIP。

ifconfig_path
本参数指定切换 IP 地址的命令所在的路径。只需要设置路径例如“/sbin”。

if_up_cmd
本参数指定用于启用虚拟 IP 的命令。设置命令和参数例如:‘ifconfig eth0:0 inet KaTeX parse error: Expected group after '_' at position 4: _IP_̲ netmask 255.255.255.0’。 KaTeX parse error: Expected group after '_' at position 4: _IP_̲ 将被 delegate_IP 指定的 IP 地址替换。

if_down_cmd
本参数指定用于停用虚拟 IP 的命令。设置命令和参数例如:‘ifconfig eth0:0 down’。

arping_path
本参数指定用于在虚拟 IP 切换后用于发送 ARP 请求的命令的所在路径。 只需要设置路径例如“/usr/sbin”。

arping_cmd
本参数指定在进行虚拟 IP 切换后用于发送 ARP 请求的命令。设置命令和参数例如:‘arping -U KaTeX parse error: Expected group after '_' at position 4: _IP_̲ -w 1’。 KaTeX parse error: Expected group after '_' at position 4: _IP_̲ 将被 delegate_IP 指定的 IP 地址替换。

4.1.4看门狗服务器自监控

wd_hostname
指定用于相互监控的看门狗进程的主机名或 IP 地址。

wd_port
指定用于相互监控的看门狗进程的端口。

4.1.5 监控服务器

other_pgpool_hostname0
指定被监控的 pgpool-II 服务器的主机名。参数末尾的数字表示“服务器id”,必须从 0 开始。

other_pgpool_port0
指定被监控的 pgpool-II 服务器上的 pgpool 的端口号。参数末尾的数字表示“服务器id”,必须从 0 开始。

other_wd_port0
指定 pgpool-II 服务器上的需要被监控的看门狗的端口号。参数末尾的数字表示“服务器id”,必须从 0 开始。

4.2 配置文件

此配置基于文章前半部分进行,我将pgpool-slave放在了192.168.36.130上。
pgpool-master配置文件:

listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/opt/pgpool'

backend_hostname0 = '192.168.36.130'
backend_port0 = 54321
backend_weight0 = 1
backend_data_directory0 = '/opt/psql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = '192.168.36.131'
backend_port1 = 54321
backend_weight1 = 1
backend_data_directory1 = '/opt/psql/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'

enable_pool_hba = on
pool_passwd = 'pool_passwd'

pid_file_name = '/opt/pgpool/pgpool.pid'
logdir = '/data1/pg_logs'

replication_mode = off
load_balance_mode = on
master_slave_mode = on
master_slave_sub_mode = 'stream'

sr_check_period = 5
sr_check_user = 'pgpool'
sr_check_password = '123'
sr_check_database = 'postgres'

health_check_period = 10 
                                   
health_check_timeout = 20
                                   
health_check_user = 'pgpool'
                                   
health_check_password = '123' 
                                   
health_check_database = 'postgres'

failover_command = '/data1/pg_bin/failover_stream.sh %d %H /tmp/trigger_file0'
#之前是单节点的配置文件,解释在前面
#开启看门狗
use_watchdog = on
#本机的hosts或ip
wd_hostname = '192.168.36.133'
#看门狗的端口,默认9000                                   
wd_port = 9000
#设置的vip                                    
delegate_IP = '192.168.36.254'
                                   
if_cmd_path = '/sbin'
#对网卡操作的命令,网卡名根据自己的修改                                   
if_up_cmd = 'ifconfig ens33:0 inet $_IP_$ netmask 255.255.255.0'
#对网卡操作的命令                                   
if_down_cmd = 'ifconfig ens33:0 down'
#心跳检测端口                                  
wd_heartbeat_port = 9694
#心跳检测间隔时间                                   
wd_heartbeat_keepalive = 2
# 心跳信号的死区时间间隔                                  
wd_heartbeat_deadtime = 30
#检测对方的hosts或ip                                   
heartbeat_destination0 = '192.168.36.130'
#对方心跳检测端口                                    
heartbeat_destination_port0 = 9694
#网卡名                                    
heartbeat_device0 = 'ens33'
#其他pgpool的hosts或ip                                
other_pgpool_hostname0 = '192.168.36.130' 
#其他pgpool的端口
other_pgpool_port0 = 9999  
#其他端口
other_wd_port0 = 9000                

方便对比和复制,下面是pgpool-slave的配置文件

listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/opt/pgpool'

backend_hostname0 = '192.168.36.130'
backend_port0 = 54321
backend_weight0 = 1
backend_data_directory0 = '/opt/psql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = '192.168.36.131'
backend_port1 = 54321
backend_weight1 = 1
backend_data_directory1 = '/opt/psql/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'

enable_pool_hba = on
pool_passwd = 'pool_passwd'

pid_file_name = '/opt/pgpool/pgpool.pid'
logdir = '/data1/pg_logs'

replication_mode = off
load_balance_mode = on
master_slave_mode = on
master_slave_sub_mode = 'stream'

sr_check_period = 5
sr_check_user = 'pgpool'
sr_check_password = '123'
sr_check_database = 'postgres'

health_check_period = 10 
                                   
health_check_timeout = 20
                                   
health_check_user = 'pgpool'
                                   
health_check_password = '123' 
                                  
health_check_database = 'postgres'

failover_command = '/data1/pg_bin/failover_stream.sh %d %H /tmp/trigger_file0'

use_watchdog = on

wd_hostname = '192.168.36.130' 
                                    
wd_port = 9000

delegate_IP = '192.168.36.254'
                                   
if_cmd_path = '/sbin'

if_up_cmd = 'ifconfig ens33:0 inet $_IP_$ netmask 255.255.255.0'
                                   
if_down_cmd = 'ifconfig ens33:0 down'

wd_heartbeat_port = 9694
                                  
wd_heartbeat_keepalive = 2
                                   
wd_heartbeat_deadtime = 30

heartbeat_destination0 = '192.168.36.133' 
                                   
heartbeat_destination_port0 = 9694
                                    
heartbeat_device0 = 'ens33'
                                   
other_pgpool_hostname0 = '192.168.36.133' 
                                    
other_pgpool_port0 = 9999
                                   
other_wd_port0 = 9000

5 pgpool的启动和关闭

启动 pgpool -n -d -D > /data1/pg_logs/pgpool.log 2>&1 &
关闭 pgpool -m fast stop

6 启动后的虚拟ip

PostgreSQL高可用(三)解决pgpool的单点问题_第2张图片

7 PG连接

使用vip进行连接就可以了
PostgreSQL高可用(三)解决pgpool的单点问题_第3张图片

你可能感兴趣的:(PostgreSQL)