使用MaxScale实现mysql读写分离

Posted 智云-wjp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用MaxScale实现mysql读写分离相关的知识,希望对你有一定的参考价值。

概述

试验目的

验证、测试使用MaxScale实现mysql的读写分离

试验环境

准备两台服务器,分别安装好操作系统和数据库,数据库的版本要一样。

环境项目环境配置备注
server1Windows 10家庭版,物理机ip: 192.168.229.1,master
server2Ubuntu 20.04.2 LTS 服务器版,虚拟机ip: 192.168.229.129,slave
maxscale serverUbuntu 20.04.2 LTS 桌面版,虚拟机ip: 192.168.229.128,安装maxscale
MySQL8.0.25server1 和server2 必须先配置完成主从或者主主复制(此实验环境配置的是主从复制)。 配置方法请参考《Linux系统下使用MySql双机热备功能》 《Windows配置MySQL双机热备
MaxScale2.5.13-GAMaxScale 是官方提供的 MySQL 的兄弟 MariaDB 数据库提供的中间件产品可以实现负载平衡, 读写分离

试验拓扑图

用server1模拟客户端,maxscale也可以安装于某一个server上。

试验背景

在项目中曾经使用nginx配置过 server1和server2中MySQL的负载均衡(server1和server2中配置了MySQL的主主复制),但在使用中如果项目应用程序是多线程的,会存在同一个应用程序同时写server1和server2的现象(虽然nginx开启了iphash)。这种情况就会存在两个server同时使用同一个表中的同一个id序号的概率,导致数据因id重复而丢失。因此启用读写分离很有必要。
此前试验了mysql官方出品的mysql-proxy,虽然可以实现功能(参见《使用mysql-proxy实现mysql的读写分离》),但现在 mysql 官方已经不再对 mysql-proxy 提供更新,也不推荐使用到生产系统上。mysql官方推出的替代 mysql-proxy 的产品 mysql-router 对读写分离的支持又需要两个端口,一个端口写,一个端口读,这就要更改应用程序进行支持。因此找到了 MaxScale 进行测试。 MaxScale是Mysql 的兄弟公司 MariaDB 开发的,现在已经发展得非常成熟

准备环境

安装操作系统

分别在两台服务器上安装操作系统,本文略。请参考《华为服务器安装Ubuntu 20.04系统并实现向日葵远程桌面

安装MySQL

分别在两台服务器上安装MySQL,本文略。

配置MySQL的主从复制

如果单纯完成本文的试验,MySQL数据库配置主从复制即可。为了实现后续的高可用性,本文实际配置的是主主复制,配置详情请参考《Linux系统下使用MySql双机热备功能

下载安装

下载

下载地址:https://mariadb.com/downloads/#mariadb_platform-mariadb_maxscale

安装

直接双击安装即可。

配置maxscale

准备账号

  1. 在master库创建监控用户
CREATE USER `maxmon`@`%` IDENTIFIED WITH mysql_native_password BY '123456';

GRANT Replication Client, Replication Slave ON *.* TO `maxmon`@`%`;
  1. 在master库创建路由用户
CREATE USER `maxrou`@`%` IDENTIFIED WITH mysql_native_password BY '123456';

GRANT Select ON `mysql`.* TO `maxrou`@`%`;

GRANT Show Databases ON *.* TO `maxrou`@`%`;

修改maxscale配置文件

配置文件的存储路径为:/etc/maxscale.cnf
编辑配置文件:

sudo vim /etc/maxscale.cnf
  1. 修改[server*]部分
    找到 [server1] 部分,修改其中的 address 和 port,指向 master 的 IP 和端口,修改protocol为MySQLBackend。
    复制黏贴[server1] 的整块儿内容,改为 [server2],同样修改其中的 address 和 port,指向 slave。
    如果有更多mysql的服务器,就再多复制几个,每个服务器一个[server*]

  2. 修改[MariaDB-Monitor]部分
    找到 [MariaDB-Monitor] 部分,修改为[MySQL-Monitor],
    修改module的值为mysqlmon,
    修改servers 的值为 server1,server2,
    修改 user 和 passwd 为之前创建的监控用户的信息(maxmon,123456)

  3. 修改[Read-Write Service] 部分
    找到 [Read-Write Service] 部分,修改 servers 的值为 server1,server2,
    修改 user 和 passwd 为之前创建的路由用户的信息(maxrou,123456)

  4. 修改[Read-Write-Listener]部分
    找到[Read-Write-Listener]部分,修改 protocol 的值为MySQLClient,
    修改 port 的值为项目实际端口,此端口即为外部客户端访问数据库集群的端口,默认值为4006。

  5. 删除或者屏蔽其他不需要的部分
    将[Read-Only-Service]部分、[Read-Only-Listener]部分等不需要的部分全部屏蔽或者删除。

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

启动maxscale

启停控制

# 服务启动、停止、查看状态、重启命令
sudo service maxscale start | stop | status | restart

查看监听端口是否启动

netstat -ntelp | grep 4006

测试

通过代理端口连接数据库

在客户机上连接数据库:

mysql -uadmin -h192.168.229.128 -P4006 -p

连接成功:

基本测试

mysql> Select @@hostname;
mysql> start transaction;
mysql> Select @@hostname;
mysql> rollback;
mysql> Select @@hostname;

插入数据

Port 4006:

mysql> USE mytest;
mysql> INSERT INTO tb1 (value) values ('a');

在代理端口和两个server中都能查询的数据:

关闭slave的同步,再次通过代理插入数据

slave:

mysql > stop slave;

Port 4006:

mysql> INSERT INTO tb1 (value) values ('b');

结果正确:通过代理能插入,能查询到数据,master能查询到数据,slave不能查询到数据。

恢复slave的同步:

start slave;
# 稍等一会儿再查询
select * from tb1;

可以正确查询到数据:

停止slave的mysql服务,再次通过代理插入数据

slave:

sudo service mysql stop

Port 4006:

mysql> INSERT INTO tb1 (value) values ('c');

结果正确:通过代理能插入,能查询到数据,master能查询到数据,slave不能连接到服务。

重启slave的服务后,再次查询,结果正常:

停止master的mysql服务

master:

net stop mysql


通过代理端口Port 4006查询时,发现连接已经中断:

通过maxscale代理数据库集群时,master服务不可中断。
为了确保master宕机时服务不中断,需要再增加一层高可用性保障。
恢复master的服务后,代理端口自动恢复:

结论

MaxScale可以实现读写分离,从机离线不影响集群的使用。但是master主机离线会造成MaxScale服务的不可用,因此需要再加一层高可用性保障,防止MaxScale和Master的单点故障。

附件

maxscale.cnf文件的默认内容

# MaxScale documentation:
# https://mariadb.com/kb/en/mariadb-maxscale-25/

# Global parameters
#
# Complete list of configuration options:
# https://mariadb.com/kb/en/mariadb-maxscale-25-mariadb-maxscale-configuration-guide/

[maxscale]
threads=auto

# Server definitions
#
# Set the address of the server to the network
# address of a MariaDB server.
#

[server1]
type=server
address=127.0.0.1
port=3306
protocol=MariaDBBackend

# Monitor for the servers
#
# This will keep MaxScale aware of the state of the servers.
# MariaDB Monitor documentation:
# https://mariadb.com/kb/en/maxscale-25-monitors/

[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1
user=myuser
password=mypwd
monitor_interval=2000

# Service definitions
#
# Service Definition for a read-only service and
# a read/write splitting service.
#

# ReadConnRoute documentation:
# https://mariadb.com/kb/en/mariadb-maxscale-25-readconnroute/

[Read-Only-Service]
type=service
router=readconnroute
servers=server1
user=myuser
password=mypwd
router_options=slave

# ReadWriteSplit documentation:
# https://mariadb.com/kb/en/mariadb-maxscale-25-readwritesplit/

[Read-Write-Service]
type=service
router=readwritesplit
servers=server1
user=myuser
password=mypwd

# Listener definitions for the services
#
# These listeners represent the ports the
# services will listen on.
#

[Read-Only-Listener]
type=listener
service=Read-Only-Service
protocol=MariaDBClient
port=4008

[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=4006

参考文献

轻松实现MySQL读写分离
配置maxscale中间件实现MySQL读写分离
Mysql - 读写分离与读负载均衡之Maxscale

以上是关于使用MaxScale实现mysql读写分离的主要内容,如果未能解决你的问题,请参考以下文章

使用MaxScale实现mysql读写分离

Mysql 读写分离中间件 MaxScale

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

轻松实现MySQL读写分离

如何实现MySQL读写分离?

maxscale配合MHA搭建读写分离的高可用架构(基于GTID replication主从架构,mysql5.6)