vlambda博客
学习文章列表

MYSQL 中间件 为什么选择 PROXYSQL VS MHA

MYSQL 的中间件其实也不少,但实际上用的比较广的(非分库分表)的选择点基本上会落到 PROXYSQL 和 MyRouter 两个中间件中,1使用的人数多,2 丰富的文档和相当多的案例


实际上proxysql 可以算是一个支持广泛的中间件,下面是其支持的产品线

MYSQL 中间件 为什么选择 PROXYSQL VS MHA


本着没有使用就没有发言权的原则,以下内容仅仅是针对proxysql 中间件的使用的一些特点和优点来阐述

MYSQL 中间件 为什么选择 PROXYSQL VS MHA

从官方网址 https://proxysql.com/  下载最新的 proxysql rpm包后,直接yum -y install 包 安装后。同时也要保证你的proxysql 主机安装了MYSQL的客户端。

启动proxysql  service proxysql start    , 对于proxysql 的配置基本上分为以下几个部分


1 MHA 方式


1  登陆到PROXYSQL 的管理端 mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> ' 

2  进入后,实际上看到的databases 和我们常规理解的是有区别的,PROXYSQL是架设在业界使用最广泛的sqllite 数据库基础上的产品,虽然支持MYSQL的客户端,语法,但实际上后台数据的存储都是基于sqllite数据库的。

MYSQL 中间件 为什么选择 PROXYSQL VS MHA

3  配置简单,针对一个需求简单的MHA,如何不再使用VIP而是通过PROXYSQL来进行对应用透明的切换。

   3.1  输入MySQL的主从节点   mysql_servers

   3.2  配置用户               mysql_users

   3.3  配置检测切换方式  mysql_replication_hostgroups


MYSQL 中间件 为什么选择 PROXYSQL VS MHA

MYSQL 中间件 为什么选择 PROXYSQL VS MHA

做完这几部,一个基于MHA 最简单的PROXYSQL 方式的集群就完成了。


优点:去掉了VIP 的迁移的脚本,相关的稳定性大幅度提高,整体的架构的复杂性也降低了。


原理:

PROXYSQL 通过判断默认 write组的连通性,我们可以做一下相关的实验来证实在MHA的状态下


1  到底proxysql 是怎么来判断数据库到底在线还是不在线

2  到底怎么来判断哪个是读库,或者当库变为可以写的库时,进行相关的访问


答案就在下图, proxysql  在 1- 2秒会通过查看当前服务器的read_only 来判断当前的服务器是否应该在写的组,并且在1 分钟内会对所在的宿主服务器进行一个连接性的判断。


MYSQL 中间件 为什么选择 PROXYSQL VS MHA


MYSQL 中间件 为什么选择 PROXYSQL VS MHA


我们以下图作为一个例证,目前101的read_only 设置为ON,而102 的 read_only 设置OFF ,也就是目前有两台MYSQL  主 102 从 101


MYSQL 中间件 为什么选择 PROXYSQL VS MHA


我们可以将101 的 read_only 设置为OFF 看看会出现什么效果,可以看到写组中的 600组,多了101 这台机器。

MYSQL 中间件 为什么选择 PROXYSQL VS MHA

如果出现这样的情况就可能会引起数据不一致的情况,所以要保证在同一个时间只能有一个写库,只能有一个机器的 read_only = off 其他的集群的机器的read_only必须是on.


MYSQL 中间件 为什么选择 PROXYSQL VS MHA

上方是官方文档,描述了

1 connect  连接的后端的成功和失败的,信息将存储在 mysql_server_connect_log 中

select * from mysql_server_connect_log;

MYSQL 中间件 为什么选择 PROXYSQL VS MHA


2 查看proxysql 与 mysql之间的连接的情况,通过 connect_success_time_us来看当前的网络连通的情况(可以反映一部分)

MYSQL 中间件 为什么选择 PROXYSQL VS MHA

下面是一些相关的关键的与监控有关的基本参数

MYSQL 中间件 为什么选择 PROXYSQL VS MHA

1  mysql-monitor_enabled 是否打开监控

2  mysql-monitor_connect_timeout   连接超时的时间 600毫秒

3  mysql-monitor_ping_max_failures   尝试连接失败最大容忍数

4  mysql-monitor_ping_timeout 连接超时时间



MYSQL 中间件 为什么选择 PROXYSQL VS MHA

判断一个节点是否存活,以上面两个方式来决定,所以如果你的网络延迟,或者某方面不稳定,可以调整某些参数已更适应与当前的设定。

5  mysql-monitor_read_only_max_timeout_count 设定当前read_only最大的超时的次数

6  mysql-monitor_replication_lag_interval 监控主从之间的数据传输差异,如果在设置了读写分离,这会让读写分离中如果主从差异太大的情况下,禁止将查询发送到延时较大的物理库中。


说到这里,一定会有同学问一个问题,我不怕主机宕机,或者MYSQL服务无法提供服务,我怕的是

1  由于网络原因,造成主库从库网络无法进行通信,造成切库,然后网络又恢复了,此时就会出现一个问题,会有两个机器目前存在 read_only = off 的状态。那我的数据是否在继续写入的时候回不安全。


2  由于主库的原因,OOM 切库,然后主库又起来了,此时也是 read_only = off  > 1


MYSQL 中间件 为什么选择 PROXYSQL VS MHA


我们来看一下结果如何。


操作步骤

1  断开primary 的网络  102

2  等待切库  

3  切库完毕  主库 101

4  恢复primary 网络  101  102  read_only = off

5  ??????  写入数据 到底会怎样


图1 的情况是 5  连接到PROXYSQL 然后删除了一个数据库


MYSQL 中间件 为什么选择 PROXYSQL VS MHA


结果如果是 101 和上图情况一致,则说明proxysql 解决了同时出现两个read_only = off 的情况


出现其他情况,则说明出现问题。


MYSQL 中间件 为什么选择 PROXYSQL VS MHA

MYSQL 中间件 为什么选择 PROXYSQL VS MHA

从上图可以看到,结果是正常的也是我们想要的。


题目中的新想法是来自于proxysql 本身的一些监控和信息,如果将proxysql的一些监控信息利用好,则对于整体监控MHA 集群有部分帮助,如果配合ZABBIX 则可以绘制出一些有关的连接性能或其他的一些图形。