前言
前文介绍了如何搭建 YashanDB 的主备高可用,本文进一步强化,基于 HAProxy 中间件,配置 YashanDB 的读写分离。
搭建完成后,架构如下图所示。
搭建 YashanDB 的一主两备高可用架构
前文已经实现了 YashanDB 的一主一备高可用架构,本文将再增加一个 Standby 节点,两个备节点实现读的负载均衡。
实现步骤基本相同,把 yas2
换成 yas3
即可。
三个节点启动后,查看运行情况。
[root@rocky9 ~]# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ad4d90c05055 shawnyan.cn/myyashan:latest /usr/sbin/init 3 days ago Up 3 days yas1 232ec61af1f4 shawnyan.cn/myyashan:latest /usr/sbin/init 3 days ago Up 3 days yas2 33a85a1144a4 shawnyan.cn/myyashan:latest /usr/sbin/init 6 seconds ago Up 5 seconds yas3 [root@rocky9 ~]#
- 主节点配置日志归档
ALTER SYSTEM SET ARCHIVE_DEST_2='SERVICE=10.188.0.13:1689' scope=both;
- 配置主备复制
配置步骤和语句同前文,这里不再赘述,来看配置后的情况。
- 创建测试用户,并赋予连接权限
-- 创建测试用户 username
CREATE USER username IDENTIFIED BY 123;
-- CREATE SESSION 为用户的最基本权限,拥有此权限后才可以连接数据库
GRANT CREATE SESSION TO username;
-- 授予角色或其他系统权限(如果有需要的话)
GRANT DBA TO username;
GRANT CREATE TABLE TO username;
-- 授予测试用户查询表的权限
GRANT SELECT ANY TABLE TO username;
- 验证主备复制
在主节点 yas1 创建测试表,并写入测试数据。分别在 yas2 和 yas3 两个备节点查询。
此时,在 yas2 和 yas2 两个备节点,是无法写入数据的,因为已经开启了只读模式 READ_ONLY
。
编译安装 HAProxy 中间件
本文使用 HAProxy 2.8.4 版本,为当前最新 LTS 版本。
HAProxy 是常用的负载、代理中间件,其优点主要包括:
- 很轻量,配置简单,提供优雅关闭服务和高可用功能。
- 支持虚拟主机,可以工作在4(tcp)~7(http)层。
- 可以对数据库进行负载均衡,对后端的 DB 节点进行检测和负载均衡。
- 负载均衡策略多样。
HAProxy 的缺点包括:
- 本身不具备高可用性,但可以和 Keepalived 搭配使用。
- 不支持 HTTP cache 功能,即不能做 Web 服务器。
- 多进程模式支持不够好。
- 不支持按语句区分请求类别,无法做到 SQL 级的读写分离。
编译过程相对简单,下载源码, make 编译即可,主要步骤如下。
wget https://www.haproxy.org/download/2.8/src/haproxy-2.8.4.tar.gz tar zxf haproxy-2.8.4.tar.gz cd haproxy-2.8.4/ make CPU=generic TARGET=linux-glibc USE_PCRE2=1 sudo make install
编译完成后,会生成名为 haproxy 的可执行二进制文件。查看安装后的文件路径。
[root@rocky9 haproxy-2.8.4]# ls addons CONTRIBUTING include README tests admin dev INSTALL reg-tests VERDATE BRANCHES doc LICENSE scripts VERSION BSDmakefile examples MAINTAINERS src CHANGELOG haproxy Makefile SUBVERS [root@rocky9 haproxy-2.8.4]# sudo make install [root@rocky9 haproxy-2.8.4]# which haproxy /usr/local/sbin/haproxy
安装完成后,查看版本信息:
[shawnyan@rocky9 haproxy-2.8.4]$ haproxy -v HAProxy version 2.8.4-ShawnYan-a4ebf9d 2023/11/17 - https://haproxy.org/ Status: long-term supported branch - will stop receiving fixes around Q2 2028. Known bugs: http://www.haproxy.org/bugs/bugs-2.8.4.html Running on: Linux 5.14.0-362.8.1.el9_3.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Nov 8 17:36:32 UTC 2023 x86_64
配置 HAProxy
接下来进行 HAProxy 的配置,创建一个写监听和一个读监听。
写监听用于将将流量转发到主节点 (yas1),并绑定端口到 11688
。
listen yashandb_rw
bind :11688
server db_primary 10.188.0.11:1688 check
读监听用于将流量转发到备节点 (yas2,yas3),并绑定端口到 21688
。
listen yashandb_ro
bind :21688
balance leastconn
server db_standby_1 10.188.0.12:1688 check
server db_standby_2 10.188.0.13:1688 check
这里负载均衡算法选择 leastconn
, HAProxy 可自动选将新连接分发到最小连接的节点。
此外,创建一个监控监听,用于访问 HAProxy 自带的监控面板。
listen stats
bind *:8080
stats uri /admin
stats auth admin:admin
监控面板可通过 URL ip:8080/admin
进行访问,增加了授权验证功能,用户名密码为: admin/admin
。
完整版 haproxy.cfg
配置文件为:
global
log 127.0.0.1 local0
daemon
defaults
log global
mode http
retries 3
option redispatch
timeout client 35s
timeout server 60s
timeout connect 5s
maxconn 4096
listen yashandb_rw
bind :11688
mode tcp
balance roundrobin
option clitcpka
server db_primary 10.188.0.11:1688 check
listen yashandb_ro
bind :21688
mode tcp
balance leastconn
server db_standby_1 10.188.0.12:1688 check
server db_standby_2 10.188.0.13:1688 check
listen stats
bind *:8080
mode http
stats enable
stats scope .
stats uri /admin
stats auth admin:admin
stats refresh 5s
option httplog
到此,HAProxy 配置完成,接下来启动 HAProxy 服务。
启动 HAProxy
在启动 HAProxy 前,先进行配置文件有效性验证:
haproxy -c -f ./haproxy.cfg
输出:
$ haproxy -c -f ./haproxy.cfg
Configuration file is valid
验证有效,启动 HAProxy 服务:
haproxy -f ./haproxy.cfg
输出:
[shawnyan@rocky9 haproxy]$ haproxy -f ./haproxy.cfg [shawnyan@rocky9 haproxy]$ [shawnyan@rocky9 haproxy]# pstree -apg `pidof haproxy` haproxy,21742,21742 -f ./haproxy.cfg ├─{haproxy},21743,21742 ├─{haproxy},21744,21742 ├─{haproxy},21745,21742 ├─{haproxy},21746,21742 ├─{haproxy},21747,21742 ├─{haproxy},21748,21742 └─{haproxy},21749,21742 [shawnyan@rocky9 haproxy]#
查看监听端口:
[shawnyan@rocky9 haproxy]$ ss -antpl|grep haproxy LISTEN 0 4096 0.0.0.0:21688 0.0.0.0:* users:(("haproxy",pid=21742,fd=6)) LISTEN 0 4096 0.0.0.0:11688 0.0.0.0:* users:(("haproxy",pid=21742,fd=5)) LISTEN 0 4096 0.0.0.0:8080 0.0.0.0:* users:(("haproxy",pid=21742,fd=7))
验证测试
分别连接 HAProxy 监听的两个端口,查看 YashanDB 数据库实例状态和主机名。可以看到,每次连接写端口 11688时,都能正确地连接到主机 yashan1,也可以正常读写。每次连接读端口 21688 时,主机名有时为 yashan2,有时为 yashan3,说明轮询机制生效。
扩展
本文到此告一段落,有些内容可以进一步扩展。
比如 HAProxy + Keepalived 实现 HAProxy 的故障转移。
再如,YashanDB 的 JDBC 测试,是否可以在 JDBC 实现读写分离的 IP 设定,或是否支持 Load Balance 配置等。
Ps. 这部分内容暂不展开,具体可以参考官方文档,JDBC透明应用故障转移
透明应用故障转移,即TAF全称Transparent Application Failover,驱动的透明应用故障转移功能,使你能够在连接的数据库实例发生故障时自动重新连接到数据库。
主备
jdbc:yasdb:primary://192.168.1.1:1688,192.168.1.2:1688,192.168.1.3:1688/yashan?failover=on&failoverType=session&failoverMethod=basic&failoverRetries=5&failoverDelay=1
负载均衡
jdbc:yasdb:loadBalance://192.168.1.1:1688,192.168.1.2:1688,192.168.1.3:1688/yashan?failover=on&failoverType=session&failoverMethod=basic&failoverRetries=5&failoverDelay=1
总结
YashanDB 个人版的高可用只能做到这种程度了,如需更高级别的高可用,则要引入 YashanDB 标准版或企业版,可以支持 YashanDB 共享集群 和 YashanDB 分布式集群。
为啥要用 podman ?
隔离性好、更加轻便、更加安全。
为啥要用 HAProxy ?
流量控制、负载均衡、适当冗余。
为啥要用 YashanDB ?
兼容O、少做梦、踏实干。
End.