使用 MaxScale实现读写分离

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

一、MaxScale作用    

        MaxScale是maridb开发的一个MySQL数据中间件,配置好MySQL的主从复制架构后,希望实现读写分离,把读操作分散到从服务器中,并且对多个服务器实现负载均衡。

    MaxScale是插件式结构,允许用户开发适合自己的插件。

        读写分离和负载均衡是MySQL集群的基础需求,基础架构:

wKioL1geuIOAIu54AAE3z9zfFT8243.png-wh_50

二、MaxScale的基础组成

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

    认证插件

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

    协议插件

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

    路由插件 

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

    监控插件

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

    日志和过滤插件

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


三、配置和测试过程:

    基础要求:

        master:192.168.1.107

        slave:192.168.1.108

        slave:192.168.1.114

        db verson:yum rpm

        MaxScale version:RPM包

    1、安装数据库、主从搭建(略)

        主库搭建好后添加MS用户和Maxscale的路由用户、监控账号

        grant replication slave, replication client on *.* to rep@'%' identified by 'root123';

        grant replication slave, replication client on *.* to  maxscale_monitor@'%' identified by 'root123';

        grant select,show databases on *.* to maxscale@'%' identified by 'root123';

    2、MaxScale:

        安装maxscale看了网络上的各种文档,只能呵呵....

        这里提供maxscale的RPM的包,安装简单,直接yum -y install +包名即可

        b、yum  - y install 

        c、修改maxscale配置文件(详细见maxscale.cnf)

    3、主从读写分离验证:

        1、在主节点通过3306登陆DB,添加表 添加数据:

        

     CREATE TABLE `write_read` (

      `id` int(11) DEFAULT NULL

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

    insert into write_read values(87);

同时也在其他2个SLAVE插入86 88的数据

        2、通过mysql命令行访问maxscale所在节点的读写分离listener 4006端口

                /usr/local/mysql/bin/mysql -udlan -proot123 -hip -P4006

    MySQL [maxscale]> select * from write_read;

    +------+

    | id   |

    +------+

    |   87 |

    |   86 |

    +------+

        
select 语句在其中的一个从库上了

        3、同时操作INSERT语句

    MySQL [maxscale]> insert into write_read values(90)

        -> ;

    Query OK, 1 row affected (0.04 sec)

  server1:  

    MySQL [maxscale]> select * from write_read;

    +------+

    | id   |

    +------+

    |   87 |

    |   86 |

    |   90 |

    +------+

    3 rows in set (0.00 sec)

 ###通过登陆3个DB的3306比较结果集:

MariaDB [maxscale]> select * from write_read;

+------+

| id   |

+------+

|   87 |

|   90 |

+------+

2 rows in set (0.01 sec)

server2:

MariaDB [maxscale]> select * from write_read;

+------+

| id   |

+------+

|   87 |

|   86 |

|   90 |

+------+

3 rows in set (0.00 sec)

server3:

MariaDB [maxscale]> select * from write_read;

+------+

| id   |

+------+

|   87 |

|   88 |

|   90 |

+------+

3 rows in set (0.00 sec)

####maxcale实现了读写分离效果,若开始一个事物的话,maxscale就会自动路由到master上,普通的查询还是在SLAVE上

4、验证当一台slave出现故障后,查看MAXSCALE的状态,及恢复后状态 

注意使用yum 安装是在/var/log/maxscale2.log,log_info=1logdir=/tmp/  ###通过开启 log_info 级别,可以看到 MaxScale 的路由日志

 运行正常情况下:

[root@haproxy_2 ~]# maxadmin -pmariadb list servers;

Servers.

-------------------+-----------------+-------+-------------+--------------------

Server             | Address         | Port  | Connections | Status              

-------------------+-----------------+-------+-------------+--------------------

server1            | 192.168.1.108   |  3306 |           0 | Master, Running

server2            | 192.168.1.107   |  3306 |           0 | Slave, Running

server3            | 192.168.1.114   |  3306 |           0 | Slave, Running

-------------------+-----------------+-------+-------------+--------------------

停止server2 的复制:

[root@haproxy_2 ~]# maxadmin -pmariadb list servers;

Servers.

-------------------+-----------------+-------+-------------+--------------------

Server             | Address         | Port  | Connections | Status              

-------------------+-----------------+-------+-------------+--------------------

server1            | 192.168.1.108   |  3306 |           0 | Master, Running

server2            | 192.168.1.107   |  3306 |           0 | Running

server3            | 192.168.1.114   |  3306 |           0 | Slave, Running

-------------------+-----------------+-------+-------------+--------------------

状态改变了。。。。

查看日志:

2016-09-15 04:10:08   notice : Server changed state: server2[192.168.1.107:3306]: lost_slave. [Slave, Running] -> [Running]

再次登陆maxcale的4006查看客户端查询结果:

MySQL [maxscale]> select * from write_read;

+------+

| id   |

+------+

|   87 |

|   88 |

|   90 |

+------+

3 rows in set (0.00 sec)


MySQL [maxscale]> select @@hostname;

+------------+

| @@hostname |

+------------+

| mycat      |

+------------+

由此可见maxcale功能,在SLAVE故障后自动排除不再向其转发请求

##恢复server2。。。。

[root@haproxy_2 ~]# maxadmin -pmariadb list servers;

Servers.

-------------------+-----------------+-------+-------------+--------------------

Server             | Address         | Port  | Connections | Status              

-------------------+-----------------+-------+-------------+--------------------

server1            | 192.168.1.108   |  3306 |           0 | Master, Running

server2            | 192.168.1.107   |  3306 |           0 | Slave, Running

server3            | 192.168.1.114   |  3306 |           0 | Slave, Running

-------------------+-----------------+-------+-------------+-------------------

5、全部的SLAVE故障情况:

[root@haproxy_2 ~]# maxadmin -pmariadb list servers;

Servers.

-------------------+-----------------+-------+-------------+--------------------

Server             | Address         | Port  | Connections | Status              

-------------------+-----------------+-------+-------------+--------------------

server1            | 192.168.1.108   |  3306 |           0 | Running

server2            | 192.168.1.107   |  3306 |           0 | Running

server3            | 192.168.1.114   |  3306 |           0 | Running

-------------------+-----------------+-------+-------------+--------------------

  全部GG了。。。。

说明SLAVE全部失效后,会导致MASTER也无法识别,整个服务失效,但实际还有个M还活着,还能提供服务,需要在monitor模块里添加一个重要参数

detect_stale_master=true

[root@haproxy_2 ~]# maxadmin -pmariadb list servers;

Servers.

-------------------+-----------------+-------+-------------+--------------------

Server             | Address         | Port  | Connections | Status              

-------------------+-----------------+-------+-------------+--------------------

server1            | 192.168.1.108   |  3306 |           0 | Master, Stale Status, Running

server2            | 192.168.1.107   |  3306 |           0 | Running

server3            | 192.168.1.114   |  3306 |           0 | Running

-------------------+-----------------+-------+-------------+--------------------

.  

    ####

通过定义的telnet登陆方式与maxadmin的登陆方式一样:

telnet 127.0.0.1 4442 默认用户名密码admin/mariadb

MaxScale> add user max password

Account max for remote (network) usage has been successfully added.

MaxScale> show users

Enabled Linux accounts (secure)    : 

Created network accounts (insecure): max

就可以通过telnet 使用新的用户登录

查看更多的命令show --help

list threads.......

查看服务状态信息show server servername

MaxScale> show server server1

Server 0x1536ed0 (server1)

Server:                              192.168.1.108

Status:                              Master, Stale Status, Running

Protocol:                            MySQLBackend

Port:                                3306

Server Version:                      10.1.16-MariaDB

Node Id:                             28703306

Master Id:                           -1

Slave Ids:                           

Repl Depth:                          -1

Number of connections:               1

Current no. of conns:                0

Current no. of operations:           0


如何实现单点故障,解决资源切换,需要配合MHA实现




本文转自 DBAspace 51CTO博客,原文链接:http://blog.51cto.com/dbaspace/1871274
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
SQL 存储 关系型数据库
MySQL主从复制、读写分离
MySQL主从复制、读写分离
132 0
|
8月前
|
SQL 缓存 关系型数据库
|
8月前
|
SQL 关系型数据库 MySQL
【MySQL】主从复制 | 读写分离 简单配置
【MySQL】主从复制 | 读写分离 简单配置
126 0
|
11月前
|
SQL 缓存 负载均衡
MySQL-通过MaxScale实现读写分离初探
MySQL-通过MaxScale实现读写分离初探
116 0
|
关系型数据库 MySQL Java
MySQL主从复制+读写分离(二)
MySQL主从复制+读写分离(二)
MySQL主从复制+读写分离(二)
|
SQL 存储 关系型数据库
|
关系型数据库 MySQL 数据库
mysql主从复制与读写分离(二)
mysql主从复制与读写分离(二)
120 0
mysql主从复制与读写分离(二)
|
SQL 存储 运维
mysql主从复制与读写分离(一)
mysql主从复制与读写分离(一)
201 0
mysql主从复制与读写分离(一)
|
SQL 负载均衡 监控
关于Linux下MySQL主备集群负载均衡之读写分离(MaxScale)的一些记笔
分享一些MySQL(MariaDB)集群主从结构数据读写分离的笔记,关于读写分离: 一如果对于读密集型应用,可以容忍从库异步复制延迟导致的脏数据,读写分离是一种不错的负载均衡方式 如果对于脏数据零容忍,不建议这样搞,出了故障还需要考虑这个因素,不太方便定位问题 二是读写分离需要做体量评估,不能为了读写分离去读写分离,系统负载正常,完全没必要,如果扩了资源还是频繁的sql timeout,读写分离是解决方法之一 博文偏实战,内容涉及: 为什么需要负载均衡? MaxScale配置主从集群的读写分离 食用方式:了解Linux,MySQL 理解不足小伙伴帮忙指正
404 0
关于Linux下MySQL主备集群负载均衡之读写分离(MaxScale)的一些记笔
|
SQL 缓存 运维
读写分离之MySql主从复制
本文介绍读写分离作用,以及MySql主从复制会存在的问题
读写分离之MySql主从复制