基于IvorySQL+Patroni+vip-manager构建高可用集群

数据库是现代应用架构中的核心组件,然而,单点故障可能导致应用中断和数据丢失。为了确保高可用性和数据冗余,我们选择了IvorySQL和Patroni来构建一个强大而稳健的数据库高可用集群,从而确保业务的连续性和数据的安全性。

Patroni作为一款简单易用的高可用性工具,能够轻松地管理PostgreSQL集群,从而确保数据安全性和连续性。最新发布的Patroni 3.2版本提供了与PostgreSQL 16的兼容性,与IvorySQL 3.1版本可以完美适配,共同构建出强大而稳定的数据库高可用集群同时,结合vip-manager的灵活虚拟IP的漂移功能,能够在故障转移时实现客户端的无感知访问,确保业务的平滑运行

下面,我们就详细介绍一下IvorySQL 3.1+Patroni 3.2+vip-manager 2.0的高可用集群部署流程。我们以 x86_64 架构的 CentOS7 操作系统为例,并准备三台 CentOS7 服务器作为环境搭建的基础。每台服务器上都需要执行数据库及高可用组件的安装与配置工作,以确保整个集群的顺利运行和高度可用性。

01 安装配置IvorySQL数据库

1.1 下载IvorySQL安装包

wget https://github.com/IvorySQL/IvorySQL/releases/download/IvorySQL_3.1/ivorysql3-libs-3.1-1.rhel7.x86_64.rpm
wget 
https://github.com/IvorySQL/IvorySQL/releases/download/IvorySQL_3.1/ivorysql3-3.1-1.rhel7.x86_64.rpm
wget https://github.com/IvorySQL/IvorySQL/releases/download/IvorySQL_3.1/ivorysql3-contrib-3.1-1.rhel7.x86_64.rpm
wget
https://github.com/IvorySQL/IvorySQL/releases/download/IvorySQL_3.1/ivorysql3-server-3.1-1.rhel7.x86_64.rpm

1.2 安装rpm包

安装依赖:

yum install -y libicu libxslt python3

在安装rpm包的过程中,各rpm包之间有依赖关系,因此需要按照以下顺序安装rpm包:

rpm -ivh ivorysql3-libs-3.1-1.rhel7.x86_64.rpm
rpm -ivh ivorysql3-3.1-1.rhel7.x86_64.rpm
rpm -ivh ivorysql3-contrib-3.1-1.rhel7.x86_64.rpm --nodeps
rpm -ivh ivorysql3-server-3.1-1.rhel7.x86_64.rpm

数据库将被安装在/usr/local/ivorysql路径下。

1.3 创建用户及环境变量

(1)创建操作系统用户

在root会话中,我们需要新建用户ivorysql:

/usr/sbin/groupadd ivorysql    
/usr/sbin/useradd -m -g ivorysql ivorysql -c "IvorySQL3.1 Server" 
/usr/bin/passwd ivorysql

(2)修改文件夹权限

在root会话中,执行以下命令:

chown -R ivorysql.ivorysql /usr/local/ivorysql/

(3)配置环境变量

切换到用户ivorysql后,接下来需要修改文件/home/ivorysql/.bash_profile,以便配置相应的环境变量:

export LD_LIBRARY_PATH=/usr/local/ivorysql/ivorysql-3/lib:$LD_LIBRARY_PATH 
export PATH=/usr/local/ivorysql/ivorysql-3/bin:$PATH 
export PGDATA=/usr/local/ivorysql/ivorysql-3/data

为了使环境变量在当前ivorysql用户会话中立即生效,我们需要执行以下命令:

source .bash_profile

1.4 关闭防火墙

执行以下命令关闭防火墙:

systemctl stop firewalld
systemctl disable firewalld

在使用防火墙的情况下,为了确保ivorysql、patroni和etcd的正常运行,我们需要开放相应的端口,如下:

Ivorysql:1521、5432

patroni:8008

etcd:2379、2380

开放端口的命令:

firewall-cmd --zone=public --add-port=1521/tcp --permanent 
firewall-cmd --zone=public --add-port=5432/tcp --permanent 
firewall-cmd --zone=public --add-port=8008/tcp --permanent 
firewall-cmd --zone=public --add-port=2379/tcp --permanent 
firewall-cmd --zone=public --add-port=2380/tcp --permanent 
firewall-cmd --reload 

02 安装配置启动etcd

Patroni采用DCS(Distributed Configuration Store)机制来管理集群状态并确保分布式一致性存储的实现。在此场景中,我们选用etcd作为patroni的DCS。

2.1安装etcd

yum install etcd

查看etcd版本

[root@sophia-pghost5 ~]# etcd --version
etcd Version: 3.3.11
Git SHA: 2cf9e51
Go Version: go1.10.3
Go OS/Arch: linux/amd64

2.2配置etcd.yml

作为ivorysql用户,我们需要在/usr/local/ivorysql目录下创建名为etcd的文件夹,并在etcd文件夹内创建etcd.yml配置文件,配置内容如下:

name: 'etcd_01'
data-dir: /usr/local/hghac/etcd/etcd01
listen-peer-urls: http://192.168.31.105:2380
listen-client-urls: http://192.168.31.105:2379,http://127.0.0.1:2379
initial-advertise-peer-urls: http://192.168.31.105:2380
advertise-client-urls: http://192.168.31.105:2379
initial-cluster: etcd_01=http://192.168.31.105:2380,etcd_02=http://192.168.31.106:2380,etcd_03=http://192.168.31.107:2380
initial-cluster-token: 'etcd-cluster'
initial-cluster-state: 'new'

2.3启动etcd

etcd --config-file etcd.yml

在成功启动三个节点的etcd集群之后,我们需要查看etcd集群的状态:

[ivorysql@sophia-pghost5 etcd]$ etcdctl member list
57eb343a6baf05a: name=etcd_03 peerURLs=http://192.168.31.107:2380 clientURLs=http://192.168.31.107:2379 isLeader=false
11020de439841796: name=etcd_02 peerURLs=http://192.168.31.106:2380 clientURLs=http://192.168.31.106:2379 isLeader=false
a26f27e0d5c5a30d: name=etcd_01 peerURLs=http://192.168.31.105:2380 clientURLs=http://192.168.31.105:2379 isLeader=true

03 安装配置启动Patroni

3.1安装依赖库及patroni

yum install gcc python3-devel
pip install psycopg2
pip install patroni

pip install patroni过程中会自动安装其他依赖库,安装完成之后查看patroni版本:

[root@sophia-pghost5 ~]# patroni --version
patroni 3.2.2

3.2配置patroni.yml

以ivorysql用户的身份,在/usr/local/ivorysql目录下创建文件夹patroni。然后,在该patroni文件夹下创建patroni.yml配置文件夹,配置内容如下:

scope: ivorysql-cluster
namespace: /service/
name: ivorysql_01

restapi:
  listen: 192.168.31.105:8008
  connect_address: 192.168.31.105:8008

etcd:
  hosts: 192.168.31.105:2379,192.168.31.106:2379,192.168.31.107:2379

log:
  level: INFO
  traceback_level: INFO
  dir: /usr/local/ivorysql/patroni

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    master_start_timeout: 300
    synchronous_mode: false
    postgresql:
      use_pg_rewind: true
      parameters:
        wal_level: replica
        hot_standby: "on"
        wal_keep_size: 100
        max_wal_senders: 10
        max_replication_slots: 10
        wal_log_hints: "on"
        archive_mode: "off"
        archive_timeout: 1800s
        logging_collector: on

postgresql:
  database: postgres
  listen: 0.0.0.0:5432
  connect_address: 192.168.31.105:5432
  bin_dir: /usr/local/ivorysql/ivorysql-3/bin
  data_dir: /usr/local/ivorysql/ivorysql-3/data
  config_dir: /usr/local/ivorysql/ivorysql-3/data

  authentication:
    replication:
      username: ivorysql
      password: ivory123
    superuser:
      username: ivorysql
      password: ivory123
    rewind:
      username: ivorysql
      password: ivory123

  pg_hba:
  - local   all             all                                     trust
  - host    all             all             0.0.0.0/0               trust
  - host    all             all             ::1/128                 trust
  - local   replication     all                                     trust
  - host    replication     all             0.0.0.0/0               trust
  - host    replication     all             ::1/128                 trust

tags:
    noloadbalance: false
    clonefrom: false
    nosync: false

3.3启动patroni

首先,在第一个节点上启动patroni,patroni将自动初始化并启动数据库:

patroni patroni.yml

在第一个节点启动之后,确认是否已成功作为leader节点运行:

[ivorysql@sophia-pghost5 patroni]$ patronictl -c patroni.yml list
+ Cluster: ivorysql-cluster (7346459572541124634) +----+-----------+
| Member      | Host           | Role   | State   | TL | Lag in MB |
+-------------+----------------+--------+---------+----+-----------+
| ivorysql_01 | 192.168.31.105 | Leader | running |  1 |           |
+-------------+----------------+--------+---------+----+-----------+

接下来,我们需要在另外两个节点上分别启动patroni,patroni会自动执行pg_basebackup命令以拷贝数据,并启动备库建立流复制,查看集群状态:

[ivorysql@sophia-pghost5 patroni]$ patronictl -c patroni.yml list
+ Cluster: ivorysql-cluster (7346459572541124634) ---+----+-----------+
| Member      | Host           | Role    | State     | TL | Lag in MB |
+-------------+----------------+---------+-----------+----+-----------+
| ivorysql_01 | 192.168.31.105 | Leader  | running   |  1 |           |
| ivorysql_02 | 192.168.31.106 | Replica | streaming |  1 |         0 |
| ivorysql_03 | 192.168.31.107 | Replica | streaming |  1 |         0 |
+-------------+----------------+---------+-----------+----+-----------+

04 安装配置启动vip-manager

4.1下载安装包

wget https://github.com/cybertec-postgresql/vip-manager/releases/download/v2.3.0/vip-manager_2.3.0_Linux_x86_64.tar.gz

4.2解压安装包

将vip-manager的tar压缩包复制到/usr/local下,并进行解压:

[root@sophia-pghost5 local]# tar -zxvf vip-manager_2.3.0_Linux_x86_64.tar.gz
vip-manager_2.3.0_Linux_x86_64/LICENSE
vip-manager_2.3.0_Linux_x86_64/README.md
vip-manager_2.3.0_Linux_x86_64/vip-manager.yml
vip-manager_2.3.0_Linux_x86_64/vip-manager

4.3配置vip-manager.yml

interval: 1000
trigger-key: "/service/ivorysql-cluster/leader"
trigger-value: "ivorysql_01"
ip: 192.168.0.108 
netmask: 24 
interface: enp0s3 
hosting-type: basic 
dcs-type: etcd 
dcs-endpoints:
    http://127.0.0.1:2379,http://192.168.31.101:2379,http://192.168.31.102:2379,http://192.168.31.103:2379
retry-num: 2
retry-after: 250 
verbose: false

4.4启动vip-manager

以root用户权限启动vip-manager:

./vip-manager --config vip-manager.yml

查看主节点上VIP的绑定情况:

[root@sophia-pghost5 vip-manager_2.3.0_Linux_x86_64]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:75:18:bd brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.105/24 brd 192.168.31.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet 192.168.31.108/24 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe75:18bd/64 scope link
       valid_lft forever preferred_lft forever

验证从其他服务器通过VIP能成功连接数据库:

[root@sophia-pghost6 ~]# psql -h 192.168.31.108 -U ivorysql -d postgres
psql (16.1)
Type "help" for help.

postgres=# select * from pg_is_in_recovery();
 pg_is_in_recovery
-------------------
 f
(1 row)

05 高可用故障场景模拟

将ivorysql_01所在服务器关机来模拟主节点故障,随后,在其他节点上查看集群状态:

[ivorysql@sophia-pghost7 patroni]$ patronictl -c patroni.yml list
+ Cluster: ivorysql-cluster (7346459572541124634) ---+----+-----------+
| Member      | Host           | Role    | State     | TL | Lag in MB |
+-------------+----------------+---------+-----------+----+-----------+
| ivorysql_02 | 192.168.31.106 | Leader  | running   |  2 |           |
| ivorysql_03 | 192.168.31.107 | Replica | streaming |  2 |         0 |
+-------------+----------------+---------+-----------+----+-----------+

由此可见,ivorysql_02已成功提升为新主库,并且VIP(虚拟IP地址)已经自动漂移到了这个新主库。

将ivorysql_01启动以后,再次启动patroni以查看当前集群状态:

[ivorysql@sophia-pghost7 patroni]$ patronictl -c patroni.yml list
+ Cluster: ivorysql-cluster (7346459572541124634) ---+----+-----------+
| Member      | Host           | Role    | State     | TL | Lag in MB |
+-------------+----------------+---------+-----------+----+-----------+
| ivorysql_02 | 192.168.31.106 | Leader  | running   |  2 |           |
| ivor[ivorysql@sophia-pghost7 patroni]$ patronictl -c patroni.yml list
+ Cluster: ivorysql-cluster (7346459572541124634) ---+----+-----------+
| Member      | Host           | Role    | State     | TL | Lag in MB |
+-------------+----------------+---------+-----------+----+-----------+
| ivorysql_01 | 192.168.31.105 | Replica | streaming |  2 |         0 |
| ivorysql_02 | 192.168.31.106 | Leader  | running   |  2 |           |
| ivorysql_03 | 192.168.31.107 | Replica | streaming |  2 |         0 |
+-------------+----------------+---------+-----------+----+-----------+

当原主库ivorysql_01恢复正常后,它将以备库的身份跟随新主库进行同-;。-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值