MaxScale:实现MySQL读写分离与负载均衡的中间件利器

1、MaxScale 是干什么的?

配置好了MySQL的主从复制结构后,我们希望实现读写分离,把读操作分散到从服务器中,并且对多个从服务器能实现负载均衡。

读写分离和负载均衡是MySQL集群的基础需求,MaxScale 就可以帮着我们方便的实现这些功能。

2、MaxScale 的基础构成

MaxScale 是MySQL的兄弟公司 MariaDB 开发的,现在已经发展得非常成熟。MaxScale 是插件式结构,允许用户开发适合自己的插件。

MaxScale 目前提供的插件功能分为5类:

  • 认证插件

    提供了登录认证功能,MaxScale 会读取并缓存数据库中 user 表中的信息,当有连接进来时,先从缓存信息中进行验证,如果没有此用户,会从后端数据库中更新信息,再次进行验证

  • 协议插件

    包括客户端连接协议,和连接数据库的协议

  • 路由插件

    决定如何把客户端的请求转发给后端数据库服务器,读写分离和负载均衡的功能就是由这个模块实现的

  • 监控插件

    对各个数据库服务器进行监控,例如发现某个数据库服务器响应很慢,那么就不向其转发请求了

  • 日志和过滤插件

    提供简单的数据库防火墙功能,可以对SQL进行过滤和容错

3、MaxScale 的安装使用

例如有 3 台数据库服务器,是一主二从的结构。

过程概述

(1)配置好集群环境

(2)下载安装 MaxScale

(3)配置 MaxScale,添加各数据库信息

(4)启动 MaxScale,查看是否正确连接数据库

(5)客户端连接 MaxScale,进行测试

详细过程

(1)配置一主二从的集群环境

准备3台服务器,安装MySQL,配置一主二从的复制结构。

(2)安装 MaxScale

最好在另一台服务器上安装,如果资源不足,可以和某个MySQL放在一起。

MaxScale 的下载地址:https://downloads.mariadb.com/files/MaxScale

根据自己的服务器选择合适的安装包。

以 centos 7 为例 安装步骤如下:

yum install libaio.x86_64 libaio-devel.x86_64 novacom-server.x86_64 libedit -yrpm -ivh maxscale-1.4.3-1.centos.7.x86_64.rpm

(3)配置 MaxScale

在开始配置之前,需要在 master 中为 MaxScale 创建两个用户,用于监控模块和路由模块。

创建监控用户

mysql> create user [email protected]’%’ identified by “111111”;mysql> grant replication slave, replication client on *.* to [email protected]’%’;

创建路由用户

mysql> create user [email protected]’%’ identified by “111111”;mysql> grant select on mysql.* to [email protected]’%’;

用户创建完成后,开始配置

vi /etc/maxscale.cnf

找到 [server1] 部分,修改其中的 address 和 port,指向 master 的 IP 和端口。

复制2次 [server1] 的整块儿内容,改为 [server2] 与 [server3],同样修改其中的 address 和 port,分别指向 slave1 和 slave2:

找到 [MySQL Monitor] 部分,修改 servers 为 server1,server2,server3,修改 user 和 passwd 为之前创建的监控用户的信息(scalemon,111111)。

找到 [Read-Write Service] 部分,修改 servers 为 server1,server2,server3,修改 user 和 passwd 为之前创建的路由用户的信息(maxscale,111111)。

由于我们使用了 [Read-Write Service],需要删除另一个服务 [Read-Only Service],删除其整块儿内容即可。

配置完成,保存并退出编辑器。

(4)启动 MaxScale

执行启动命令

maxscale –config=/etc/maxscale.cnf

查看 MaxScale 的响应端口是否已经就绪

netstat -ntelp

  • 4006 是连接 MaxScale 时使用的端口
  • 6603 是 MaxScale 管理器的端口

登录 MaxScale 管理器,查看一下数据库连接状态,默认的用户名和密码是 admin/mariadb。

maxadmin –user=admin –password=mariadb

MaxScale> list servers

可以看到,MaxScale 已经连接到了 master 和 slave。

(5)测试

先在 master 上创建一个测试用户

mysql> grant ALL PRIVILEGES on *.* to [email protected]”%” Identified by “111111”;

使用 Mysql 客户端到连接 MaxScale

mysql -h MaxScale所在的IP -P 4006 -u rtest -p111111

执行查看数据库服务器名的操作来知道当前实际所在的数据库:

开启事务后,就自动路由到了 master,普通的查询操作,是在 slave上

MaxScale 的配置完成了。

4、MaxScale 在 slave 有故障后的处理

前面已经介绍了 MaxScale可以实现MySQL的读写分离和读负载均衡,那么当 slave 出现故障后,MaxScale 会如何处理呢?

例如有 3 台数据库服务器,一主二从的结构,数据库名称分别为 master, slave1, slave2。

现在我们实验以下两种情况:

(1)当一台从服务器( slave1 或者 slave2 )出现故障后,查看 MaxScale 如何应对,及故障服务器重新上线后的情况

(2)当两台从服务器( slave1 和 slave2 )都出现故障后,查看 MaxScale 如何应对,及故障服务器重新上线后的情况

准备

为了更深入的查看 MaxScale 的状态,需要把 MaxScale 的日志打开:

修改配置文件

vi /etc/maxscale.cnf

找到 [maxscale] 部分,这里用来进行全局设置,在其中添加日志。

配置

log_info=1logdir=/tmp/

通过开启 log_info 级别,可以看到 MaxScale 的路由日志。

修改配置后,重启 MaxScale 。

实验过程

1、单个 slave 故障的情况

初始状态是一切正常。

停掉 slave2 的复制,登录 slave2 的 mysql 执行。

mysql> stop slave;

查看 MaxScale 服务器状态

slave2 已经失效了。

查看日志信息

cat /tmp/maxscale1.log

尾部显示:

2016-08-15 12:26:02   notice : Server changed state: slave2[172.17.0.4:3306]: lost_slave

提示 slave2 已经丢失。

查看客户端查询结果:

查询操作全都转到了 slave1。

可以看到, 在有 slave 故障后,MaxScale 会自动进行排除,不再向其转发请求。

下面看下 slave2 再次上线后的情况。

登录 slave2 的 MySQL 执行

mysql> start slave;

查看 MaxScale 服务器状态

slave2 已经失效了。

查看日志信息

cat /tmp/maxscale1.log

尾部显示:

2016-08-15 12:26:02   notice : Server changed state: slave2[172.17.0.4:3306]: lost_slave

提示 slave2 已经丢失。

查看客户端查询结果:

查询操作全都转到了 slave1。

可以看到, 在有 slave 故障后,MaxScale 会自动进行排除,不再向其转发请求。

下面看下 slave2 再次上线后的情况。

登录 slave2 的 MySQL 执行

mysql> start slave;

查看 MaxScale 服务器状态

恢复了正常状态,重新识别到了 slave2。

查看日志信息,显示:

2016-08-15 12:32:36   notice : Server changed state: slave2[172.17.0.4:3306]: new_slave

查看客户端查询结果:

slave2 又可以正常接受查询请求。

通过实验可以看到,在部分 slave 发生故障时,MaxScale 可以自动识别出来,并移除路由列表,当故障恢复重新上线后,MaxScale 也能自动将其加入路由,过程透明。

2、全部 slave 故障的情况

分别登陆 slave1 和 slave2 的MySQL,执行停止复制的命令

mysql> stop slave;

查看 MaxScale 服务器状态

发现各个服务器的角色都识别不出来了。

查看日志:

从日志中看到,MaxScale 发现2个slave 和 master 都丢了,然后报错:没有 master 了。

客户端连接 MaxScale 时也失败了。

说明从服务器全部失效后,会导致 master 也无法识别,使整个数据库服务都失效了。

对于 slave 全部失效的情况,能否让 master 还可用?这样至少可以正常提供数据库服务。

这需要修改 MaxScale 的配置,告诉 MaxScale 我们需要一个稳定的 master。

处理过程

先恢复两个 slave,让集群回到正常状态,登陆两个 slave 的MySQL。

mysql> start slave;

修改 MaxScale 配置文件,添加新的配置。

vi /etc/maxscale.cnf

找到 [MySQL Monitor] 部分,添加:

detect_stale_master=true

保存退出,然后重启 MaxScale。

验证

停掉两台 slave ,查看 MaxScale 服务器状态。

可以看到,虽然 slave 都无法识别了,但 master 还在,并提示处于稳定状态

客户端执行请求:

客户端可以连接 MaxScale,而且请求都转到了 master 上,说明 slave 全部失效时,由 master 支撑了全部请求。

当恢复两个 slave 后,整体状态自动恢复正常,从客户端执行请求时,又可以转到 slave 上。

小结

通过测试发现,在部分 slave 故障情况下,对于客户端是完全透明的,当全部 slave 故障时,经过简单的配置,MaxScale 也可以很好地处理。

来源:性能与架构 订阅号(ID:yogoup)作者:杜亦舒

时间: 2024-10-27 08:55:15

MaxScale:实现MySQL读写分离与负载均衡的中间件利器的相关文章

Mysql-Proxy实现mysql读写分离、负载均衡 (转)

在mysql中实现读写分离.负载均衡,用Mysql-Proxy是很容易的事,不过大型处理对于性能方面还有待提高,主要配置步骤如下: 1.1. mysql-proxy安装 MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负 载平衡.对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可.当

Ameoba实现MySQL读写分离及负载均衡

Amoeba简介:       amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求.与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单).              amoeba相当于一个SQL请求的

Amoeba搭建高可用Mysql集群(实现Mysql主从复制、读写分离、负载均衡)

Amoeba是什么? Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件.这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发,它位于与Client.DBServer(s)之间,对客户端透明.具有 负载均衡.高可用性.SQL过滤.读写分离.可路由相关的到目标数据库.可并发请求多台数据库合并结果 . 通过Amoeba你能够完成多数据源的

mysql+amoeba 主从复制,读写分离,负载均衡

Amoeba是什么?Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件.这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发,它位于与Client.DBServer(s)之间,对客户端透明.具有 负载均衡.高可用性.SQL过滤.读写分离.可路由相关的到目标数据库.可并发请求多台数据库合并结果 . 通过Amoeba你能够完成多数据源的高

使用Maxscale实现mysql读写分离

MaxScale 是 MariaDB 的产品之一,可以很方便的实现读写分离方案:并且提供了读写分离的负载均衡和高可用性保障. 一.安装配置 前提:先配置好mysql的主从,Maxscale会根据主从复制信息来判断Master和slave 注:不能配置mysql互为主从,如果互为主从,两台都会被认为slave,在这种情况下,写请求会被拒绝,只接受读请求. 1.1.安装 官网下载对应的rpm包, wget  https://downloads.mariadb.com/MaxScale/2.0.3/c

Gtid+MGR+atlas读写分离以及负载均衡高可用架构

MySQL5.7.24 Gtid+MGR+atlas读写分离以及负载均衡高可用架构 一.服务器环境介绍: 腾讯云的云主机安装360开源的mysql中间键Atlas腾讯云机器的外网ip:119.29.97.131沧州233测试物理机器的外网ip192.168.1.233(安全起见故意写成内网的ip,其实是外网ip) 二.mysqlGtid+MGR安装 参考博文地址: 三.中间键Atlas简介 (摘抄自https://github.com/Qihoo360/Atlas) Atlas 是由 Qihoo

CentOS 7上部署Amoeba实现MySQL主从同步,读写分离,负载均衡高可用群集

实验描述 本实验需要四台主机安装mysql,一台部署Amoeba,一台主数据库服务器,两台从数据库服务器,还需一台主机做客户端访问测试,本实验结束可实现主数据库服务器与从数据库服务器之间数据同步,读写分离(客户机读从服务器的数据,写入的数据存储在主服务器,主服务器再同步给从服务器),负载均衡. 实验拓扑 实验环境 实验步骤 一.Master同步时间 1.Master安装ntp yum install ntp -y 2.修改ntp配置文件 vim /etc/ntp.conf #空白处插入如下内容

数据库读写分离和负载均衡策略

最近在学习数据库的读写分离和主从复制,采用的是一主多从策略,采用轮询的方式,读取从数据库的内容.但是,假如某一台从数据库宕机了,而客户端不知道,每次轮选到此从数据库,不都要报错?到网上查阅了资料,找到一篇不错的博文,不仅讲了解决方案,也详细的讲述了数据库的分区,分表,集群和负载均衡策略,博文原址http://www.cnblogs.com/zhongxinWang/p/4262650.html 第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互

SQL的读写分离与负载均衡问题设想。

首先,我们可以了解一下,SQL的读写分离的工作方式,如下图所示: 总得来说,三种方案,现阶段来说,都是单节点写,多节点读.SQL 2012 的Always On还实现了读负载均衡,但方案投入相对来说较大. 所以用得最多的应还是第二种方案,表级同步,数据差异几秒.但有个问题,当只读的节点多了时,要如何实现负载均衡? 真正的负载均衡,需要计算的东西太多,要计算连接线程数,要计算CPU使用率等,而这一切都需要你在程序中体现.实现难度相对来说会好大! 除非你用第三方服务软件来实现,SQL现阶段来说,这样