PostgreSQL high availability 高可用集群--架构&搭建
近期研究关系型数据库postgreSQL 的高可用集群,经调研决定使用下面技术栈:
- VIP
- keepalived
- haproxy
- patroni
- etcd
- postgreSQL 15
整体架构图如下:
主机配置情况如下:
关于patroni+etcd+postgreSQL 15的安装,可以借鉴网络上的安装步骤,相差不多。这里推荐GitHub上一个使用ansible封装的安装脚本,选择type A就行。
下面介绍keepalive的安装和配置:
apt install keepalived.
进入/etc/keepalived/创建keepalived.conf
master的配置如下:
global_defs {
script_user root
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port {
script "killall -0 haproxy" # 检测当前机器的服务是否故障,如果故障则关闭 keepalived
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER # 主备配置不一致
interface ens160
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass postgres # 主备该配置必须一样
}
virtual_ipaddress {
129.184.13.161/24 dev ens160
}
track_script {
chk_http_port # 在 vrrp_script 定义的名字
}
notify_master "" # 当这台机器成为 Master 时发送通知
notify_backup ""
notify_fault ""
}
virtual_server 129.184.13.161 5000 {
lb_algo rr
#lb_kind DR
lb_kind NAT
protocol TCP
persistence_timeout 50
delay_loop 10
real_server 129.184.13.158 5000 {
weight 100
TCP_CHECK {
connect_timeout 5
connect_port 5000
}
}
real_server 129.184.13.159 5000 {
weight 90
TCP_CHECK {
connect_timeout 5
connect_port 5000
}
}
real_server 129.184.13.160 5000 {
weight 80
TCP_CHECK {
connect_timeout 5
connect_port 5000
}
}
}
virtual_server 129.184.13.161 5001 {
#lvs_sched rr
#lvs_method DR
lb_algo rr
lb_kind NAT
protocol TCP
persistence_timeout 50
delay_loop 10
real_server 129.184.13.158 5001 {
weight 80
TCP_CHECK {
connect_timeout 5
connect_port 5001
}
}
real_server 129.184.13.159 5001 {
weight 90
TCP_CHECK {
connect_timeout 5
connect_port 5001
}
}
real_server 129.184.13.160 5001 {
weight 100
TCP_CHECK {
connect_timeout 5
connect_port 5001
}
}
}
replicate节点配置:
global_defs {
script_user root
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port {
script "/usr/bin/killall -0 haproxy" # 检测当前机器的服务是否故障,如果故障则关闭 keepalived
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP # 主备配置不一致
interface ens160
virtual_router_id 51
priority 95 #low then master
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass postgres # 主备该配置必须一样
}
virtual_ipaddress {
129.184.13.161/24 dev ens160
}
track_script {
chk_http_port # 在 vrrp_script 定义的名字
}
notify_master "" # 当这台机器成为 Master 时发送通知
notify_backup ""
notify_fault ""
}
virtual_server 129.184.13.161 5000 {
#lvs_sched rr
#lvs_method DR
#lb_algo rr
#lb_kind NAT
protocol TCP
persistence_timeout 50
delay_loop 10
real_server 129.184.13.158 5000 {
weight 100
TCP_CHECK {
connect_timeout 5
connect_port 5000
}
}
real_server 129.184.13.159 5000 {
weight 90
TCP_CHECK {
connect_timeout 5
connect_port 5000
}
}
real_server 129.184.13.160 5000 {
weight 80
TCP_CHECK {
connect_timeout 5
connect_port 5000
}
}
}
virtual_server 129.184.13.161 5001 {
#lvs_sched rr
#lvs_method DR
#lb_algo rr
#lb_kind NAT
protocol TCP
persistence_timeout 50
delay_loop 10
real_server 129.184.13.158 5001 {
weight 80
TCP_CHECK {
connect_timeout 5
connect_port 5001
}
}
real_server 129.184.13.159 5001 {
weight 90
TCP_CHECK {
connect_timeout 5
connect_port 5001
}
}
real_server 129.184.13.160 5001 {
weight 100
TCP_CHECK {
connect_timeout 5
connect_port 5001
}
}
}
接下来可以使用虚拟IP访问,
5000端口用于写/读
5001主要用于读取数据(读写分离)
----------------高可用性验证----------------------
1.查看node状况
2.手动触发主从切换
3.手动停止主节点服务,自动选择主节点
4.postgres服务故障,自动启动
5.从master节点写入数据,数据自动同步到从节点
6.设置虚拟IP,从虚拟IP访问数据库
7.keepalived 确保haproxy负载的可用性(停止主节点haproxy,haproxy5000,5001仍然可用)
以上验证了postgresSQL的高可用性,记录以供有需要的朋友使用。