数据库是现代应用架构中的核心组件,然而,单点故障可能导致应用中断和数据丢失。为了确保高可用性和数据冗余,我们选择了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恢复正常后,它将以备库的身份跟随新主库进行同步。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。