接上篇postgresql + pgpool 构建容灾高可用集群(数据同步流复制/主备自动切换)
本篇主要内容:
在postgresql12 安装完成之后, 我们需要安装pool-ii中间件, 来完成 HA 自动切换, ip 自动切换的工作
为后续使用 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
ftp 文件服务器地址中: https://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/
中间的版本号可以可以更改, 但后续pg版本也需要对应上
#设置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
# 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/
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
这个文件是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文件
这个文件中会配置我们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
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
# 此配置将在多个pgpool-ii 节点时无效 recovery_user = 'postgres' recovery_password = 'postgres' recovery_1st_stage_command = 'recovery_1st_stage' # 这个脚本时放在postgresql数据目录下的
备库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
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)
处理关键步骤:
```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):  备机日志(/var/log/pgpool/pgpool.log): 
# 模拟数据库宕机 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
# 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)
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!