写点什么

规避单点故障,MySQL 8.0 MGR 软负载怎么选?

用户头像
dbaplus社群
关注
发布于: 2021 年 01 月 05 日
规避单点故障,MySQL 8.0 MGR软负载怎么选?

毛思平,12 年 IT 工作经验,7 年数据库管理维护经验,现就职于中国农业银行软开中心,从事数据库应用研究。


一、背景简介


近期笔者所在部门计划批量上线一批基于 MySQL 8.0 社区版的系统,数据库部署架构为 MySQL MGR 一主两从并由 MySQL Router 组件实现读写分离,为了规避 MySQL Router 单点故障,提高系统稳定性架构设计过程中增加了软负载和以及 Keepalived,并将软负载及 Keepalived 部署在管理节点,管理节点主备部署达到高可用目的,整体架构如下图。


另外目前市场上负载软件比较多但大部分面向 web 应用,笔者梳理发现 Haproxy 和 Nginx 在数据库方面有一定应用案例,尤其 Haproxy 在 MySQL 主从复制方面应用较广。那么这两款软负载是否可以应用在 MySQL8.0 MGR 上,谁的性能更好呢,该如何选择呢?带着疑问笔者做了一系列性能比较。



二、环境配置

硬件配置


测试硬件环境均采用虚拟机,具体配置如下表:


软件配置


参与测试软件版本配置如下表:



三、软件配置


关于 MySQL MGR 配置网上有很多相关教程此处不赘述,以下是关于软负载及高可用插件关键配置。


Keepalived 配置


完成 keepalived 软件安装后,只需要在/etc/keepalived 目录下修改 keepalived.conf 文件,修改完成后执行 systemctl start keepalived 即可,需要修改地方如下:


vrrp_instance VI_1 {    state MASTER     #不用修改,本方案采用争抢模式管理节点主备一致    interface ens192   #在用网卡名称    virtual_router_id 51 #虚拟路由ID取值0-255    priority 100       #优先级 本方案采用争抢模式管理节点主备一致    advert_int 1       #探活频率 单位秒    authentication {    #认证机制及密码        auth_type PASS        auth_pass 11111111    }    virtual_ipaddress {  #虚拟地址配置        10.*.*.218   } track_script {     #自定义探活方法  chk_alived     }vrrp_script chk_haproxy {  script  "/etc/keepalived/checkalived.sh"  #探活脚本位置  interval  3    #重新探活时间间隔  weight  -5    #失败后权重设置}
复制代码


探活脚本 Checkalived.sh 配置如下以 Nginx 为例:


#!/bin/bash   if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then     systemctl stop keepalived  #当发现Nginx不存在时停止该节点Keepalived由备节点接管  fi 
复制代码


以上配置主备管理节点一致即可。

Haproxy 配置


完成 Haproxy 安装后,只需在/etc/haproxy 修改 haproxy.cfg 文件后执行 systemctl start haproxy 即可。配置文件主要修改以下内容:


listen mysqlrw      bind :3366 #虚拟IP读写访问端口      mode tcp  #访问协议      balance roundrobin  #负载均衡算法     #数据库ip 地址及访问断开,300为软负载最大连接数      server mysql1 10.*.*.210:6446 check port 6446 maxconn 300       server mysql2 10.*.*.211:6446 check port 6446 maxconn 300      server mysql3 10.*.*.212:6446 check port 6446 maxconn 300listen mysqlro      bind :3367 #虚拟IP读访问端口      mode tcp   #访问协议      balance roundrobin  #负载均衡算法      server mysql1 10.*.*.210:6447 check port 6447 maxconn 300      server mysql2 10.*.*.211:6447 check port 6447 maxconn 300      server mysql3 10.*.*.212:6447 check port 6447 maxconn 300listen stats  #图形展示界面地址及端口      bind 10.230.137.218:1080      mode http      option httplog      maxconn 10      stats refresh 30s      stats uri /dbs      stats realm XingCloud\ Haproxy      stats auth admin:admin      stats hide-version      stats admin if TRUE
复制代码


Nginx 配置


完成 Haproxy 安装后,只需在/etc/nginx/conf 下修改 nginx.conf,在 stream 方法下添加以下内容即可,添加完成后执行 systemctl start nginx 即可启动服务,添加如下:


stream {-
upstream db{ server 10.*.*.210:6446; server 10.*.*.211:6446; server 10.*.*.212:6446; }
server{ listen 3366; proxy_pass db; proxy_connect_timeout 2s; access_log /usr/local/nginx/logs/access3366_log mysql; --读写日志输出路径 } upstream dbro{ server 10.*.*.210:6447; server 10.*.*.211:6447; server 10.*.*.212:6447; }
server{ listen 3367; proxy_pass dbro; proxy_connect_timeout 2s; access_log /usr/local/nginx/logs/access3367_log mysql; --读日志输出路径 }}
复制代码


四、测试方法


五、测试结果

负载软件负载分发是否均衡


通过编写批量执行 SQL 的形式,访问数据库,并统计两款负载软件各节点分发情况。Haproxy 通过软件自带图行界面统计,Nginx 由于采用的是免费版通过后台日志统计负载分发情况。


批量 SQL 核心算法如下:


echo -e  while true    do     mysql -u$USER -p$PASSWORD -h$ROUTE_HOST -P$RW_PORT --protocol=TCP -e"${SQL_TEXT1}"                          let COUNT+=1     if [ $COUNT -ge $SESS_NUM ]       then              break       fi    done
复制代码


Haproxy 发起 64 次查询后各个节点会话分发情况,如下图。



Nginx 发起 64 次查询后各个节点会话分发情况,如下图。



测试结果如下:





负载软件是否能识别 MySQL Router 单点故障





负载软件负载分发性能比较


通过批量执行空查询 SQL:select @@hostname,统计相同并发下不同负载软件分发耗时测算负载软件负载分发效率,测试结果如下:



负载软件高可用验证


当在主节点杀死负载程序后,虚拟 IP 切换到了备节点,通过虚拟 IP 能正常登陆数据库,以 Nginx 为例。


1)在主管理节点杀死 Nginx 进程:



2)在主节点查看虚拟 IP 是否存在:



3)在备节点查看虚拟 IP 是否切换过来,判断 Keepalived 是否主备切换。



4)在以虚拟 IP 登陆数据库验证备节点负载分发是否正常。



由上测试可以看出该架构满足软负载高可用需求,即管理节点软负载故障,备节点通过 keepalived 探测异常后接管升级成主。同样方法测试 Haproxy 也满足,在此不赘述。


六、结论


功能方面,Haproxy 和 Nginx 两款软负载软件均能实现多并发读写均衡分发,在 MySQL Router 出现故障时 Haproxy 和 Nginx 均能识别故障并转移连接到正常运行节点。Haproxy 和 Nginx 均能在 keepalived 下实现高可用。


性能方面,在并发能力发面,同等软硬件条件 Haproxy 与 Nginx 相差不大,相同并发量两个负载软件分发耗时相近。


易用性方面,Haproxy 提供图形界面能直观查看各个服务端口负载分配情况,连接时长,失败连接次数,并能直观显示故障节点等。Nginx 无图形管理界面,需要单独加载日志监控模块,需要手动配置日志输出,从后台日志查找个节点连接情况比较麻烦。


高可用性方面,两款软负载+Keepalived 均能规避 MySQL Router 单点故障,同时主备模式的设计使负载软件自身也具备高可用,避免单点故障对整个集群架构造成影响。


原文链接:规避单点故障,MySQL 8.0 MGR软负载怎么选?


用户头像

dbaplus社群

关注

数据连接未来 2019.04.12 加入

围绕Database、Bigdata、AiOps的企业级专业社群。行业大咖、技术干货,每天精品原创文章推送,每周线上技术分享,每月线下技术沙龙,受众20W+。

评论

发布
暂无评论
规避单点故障,MySQL 8.0 MGR软负载怎么选?