暂无图片
暂无图片
7
暂无图片
暂无图片
暂无图片

「YashanDB个人版体验」基于 HAProxy 配置 YashanDB 的读写分离

原创 严少安 2023-11-28
695

img-1-yashan-haproxy.png

前言

前文介绍了如何搭建 YashanDB 的主备高可用,本文进一步强化,基于 HAProxy 中间件,配置 YashanDB 的读写分离。

搭建完成后,架构如下图所示。

img1dataflow.png

搭建 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;
  • 配置主备复制

配置步骤和语句同前文,这里不再赘述,来看配置后的情况。

imgreplica.png

  • 创建测试用户,并赋予连接权限
-- 创建测试用户 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

img1pss.png

编译安装 HAProxy 中间件

本文使用 HAProxy 2.8.4 版本,为当前最新 LTS 版本。

HAProxy 是常用的负载、代理中间件,其优点主要包括:

  1. 很轻量,配置简单,提供优雅关闭服务和高可用功能。
  2. 支持虚拟主机,可以工作在4(tcp)~7(http)层。
  3. 可以对数据库进行负载均衡,对后端的 DB 节点进行检测和负载均衡。
  4. 负载均衡策略多样。

HAProxy 的缺点包括:

  1. 本身不具备高可用性,但可以和 Keepalived 搭配使用。
  2. 不支持 HTTP cache 功能,即不能做 Web 服务器。
  3. 多进程模式支持不够好。
  4. 不支持按语句区分请求类别,无法做到 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,说明轮询机制生效。

img2proxy.png

扩展

本文到此告一段落,有些内容可以进一步扩展。
比如 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.

最后修改时间:2023-11-29 13:54:18
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论