文章目录
概述
试验目的
验证、测试使用MaxScale实现MySQL的读写分离
试验环境
准备两台服务器,分别安装好操作系统和数据库,数据库的版本要一样。
环境项目 | 环境配置 | 备注 |
---|---|---|
server1 | Windows 10家庭版,物理机 | ip: 192.168.229.1,master |
server2 | Ubuntu 20.04.2 LTS 服务器版,虚拟机 | ip: 192.168.229.129,slave |
maxscale server | Ubuntu 20.04.2 LTS 桌面版,虚拟机 | ip: 192.168.229.128,安装maxscale |
MySQL | 8.0.25 | server1 和server2 必须先配置完成主从或者主主复制(此实验环境配置的是主从复制)。 配置方法请参考《Linux系统下使用MySql双机热备功能》 《Windows配置MySQL双机热备》 |
MaxScale | 2.5.13-GA | MaxScale 是官方提供的 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
准备账号
- 在master库创建监控用户
CREATE USER `maxmon`@`%` IDENTIFIED WITH mysql_native_password BY '123456';
GRANT Replication Client, Replication Slave ON *.* TO `maxmon`@`%`;
- 在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
-
修改[server*]部分
找到 [server1] 部分,修改其中的 address 和 port,指向 master 的 IP 和端口,修改protocol为MySQLBackend。
复制黏贴[server1] 的整块儿内容,改为 [server2],同样修改其中的 address 和 port,指向 slave。
如果有更多mysql的服务器,就再多复制几个,每个服务器一个[server*]
-
修改[MariaDB-Monitor]部分
找到 [MariaDB-Monitor] 部分,修改为[MySQL-Monitor],
修改module的值为mysqlmon,
修改servers 的值为 server1,server2,
修改 user 和 passwd 为之前创建的监控用户的信息(maxmon,123456)
-
修改[Read-Write Service] 部分
找到 [Read-Write Service] 部分,修改 servers 的值为 server1,server2,
修改 user 和 passwd 为之前创建的路由用户的信息(maxrou,123456)
-
修改[Read-Write-Listener]部分
找到[Read-Write-Listener]部分,修改 protocol 的值为MySQLClient,
修改 port 的值为项目实际端口,此端口即为外部客户端访问数据库集群的端口,默认值为4006。
-
删除或者屏蔽其他不需要的部分
将[Read-Only-Service]部分、[Read-Only-Listener]部分等不需要的部分全部屏蔽或者删除。
-
配置完成,保存并退出编辑器
启动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