一、MaxScale作用    

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

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

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

二、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实现