MariaDB *MaxScale*实现mysql8读写分离

1.MaxScale 是干什么的?

MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换,对多个从服务器能实现负载均衡

2.MaxScale 实验环境

中间件 192.168.121.160(Rocky8) MaxScale 22.08.4
主服务器 192.168.121.150(open-Euler1) mysql 8.0.36
从服务器 192.168.121.151(open-Euler2) mysql 8.0.36
从服务器 192.168.121.152(open-Euler3) mysql 8.0.36

3.实现数据库主从复制

bash 复制代码
# tail -4 /etc/hosts
192.168.150.21 master  (实际主机名:open-Euler1)
192.168.150.22 slave1  (open-Euler2) 
192.168.150.23 slave2  (open-Euler3)
192.168.150.24 prox    (Rocky8) 
bash 复制代码
# 主库配置
# tail -3 /etc/my.cnf.d/mysql-server.cnf
server_id=150
gtid_mode=ON
enforce-gtid-consistency=ON
# systemctl restart mysqld

--创建用户
create user 'rep'@'192.168.121.%' identified with mysql_native_password by '123456';
--用户授权 "同步复制"、"同步复制状态"
grant replication slave on *.* to 'rep'@'192.168.121.%';
bash 复制代码
--从库配置
# tail -3 /etc/my.cnf.d/mysql-server.cnf
server_id=151/152
gtid_mode=ON
enforce-gtid-consistency=ON
read_only=ON
# systemctl restart mysqld

--配置主从同步
CHANGE MASTER TO
MASTER_HOST = '192.168.121.150',
MASTER_USER = 'rep',
MASTER_PASSWORD = '123456',
MASTER_AUTO_POSITION = 1;

--启动主从同步
start slave

--检查
# mysql -e 'show slave status \G'  | grep -E -w "Slave_IO_Running|Slave_SQL_Running"
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

4.创建用户

在开始配置之前,需要在**master**中为 MaxScale 创建两个用户,用于监控模块和路由模块,已经实现主从复制的前提下,主库创建的用户,能同步到从库上

1) 创建监控用户

bash 复制代码
--创建用户
create user 'maxscale_monitor'@'192.168.121.%' identified with mysql_native_password by 'Admin@123456';
--用户授权 "同步复制"、"同步复制状态"
grant replication slave, replication client on *.* to maxscale_monitor@'192.168.121.%';

2) 创建路由用户

bash 复制代码
--创建用户
create user 'maxscale_route'@'192.168.121.%' identified with mysql_native_password by 'Admin@123456';
--用户授权
GRANT SHOW DATABASES ON *.* TO maxscale_route@'192.168.121.%';
GRANT SELECT ON mysql.user TO maxscale_route@'192.168.121.%';
GRANT SELECT ON mysql.db TO maxscale_route@'192.168.121.%';
GRANT SELECT ON mysql.tables_priv TO maxscale_route@'192.168.121.%';
GRANT SELECT ON mysql.columns_priv TO maxscale_route@'192.168.121.%';
GRANT SELECT ON mysql.proxies_priv TO maxscale_route@'192.168.121.%';

5.安装MaxScale

1)docker安装

代理服务器在 Download MariaDB Products & Tools | MariaDB 选择对应系统合适的版本下载安装,我这里使用docker 安装

bash 复制代码
# yum install docker -y
# systemctl enable --now docker

 # 管理后台端口8989,3306中间件连接端口 
 docker run -d --name mxs -p 8989:8989 -p 3306:3306 -v /data/maxscale/maxscale.cnf:/etc/maxscale.cnf.d mariadb/maxscale:latest
 
 # docker save mariadb/maxscale:latest -o maxscale_latest.tar

启动后 可登录到docker容器,查看MaxScale版本与日志信息

bash 复制代码
# docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                            NAMES
4e2804021a7d        mariadb/maxscale:latest   "/usr/bin/tini -- do..."   3 minutes ago       Up 3 minutes        0.0.0.0:3306->3306/tcp, 0.0.0.0:8989->8989/tcp   mxs

# 登录容器
docker exec -it mxs bash
# 查看版本信息
[root@4e2804021a7d /]# maxscale -version
MaxScale 23.08.3
# 查看版本日志
cat /var/log/maxscale/maxscale.log

2)yum(dnf)源安装

bash 复制代码
# 配置存储库源
[root@localhost ~]# curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash
 
# 安装maxscale
[root@localhost ~]# dnf install maxscale -y

6.配置maxscale

在/etc/maxscale.cnf.d新建一个配置my.cnf或者直接修改/etc/maxscale.cnf文件,我这里直接配置/etc/maxscale.cnf文件了:

bash 复制代码
[maxscale]
threads=auto # 开启线程个数,默认为1.设置为auto会同cpu核数相同
admin_host=0.0.0.0
admin_secure_gui=false

[dbserv1] # 定义服务器主机1
type=server
address=192.168.121.150
port=3306
protocol=MariaDBBackend

[dbserv2] # 定义服务器主机2
type=server
address=192.168.121.151
port=3306
protocol=MariaDBBackend

[dbserv3] # 定义服务器主机1
type=server
address=192.168.121.152
port=3306
protocol=MariaDBBackend

[MySQL-Monitor] #监视进程
type=monitor
module=mariadbmon
servers=dbserv1, dbserv2, dbserv3
user=maxscale_monitor
password=Admin@123456
monitor_interval=2s

[Read-Write-Service]  # 读写分离
type=service 
router=readwritesplit
servers=dbserv1,dbserv2,dbserv3
user=maxscale_route
password=Admin@123456
enable_root_user=true

[Read-Write-Listener] # 监听读写服务端口
type=listener
service=Read-Write-Service
protocol=MariaDBClient
address=0.0.0.0
port=3307

配置完成后 重启MaxScale服务,可用命令启动:

bash 复制代码
maxscale -f /etc/maxscale.cnf.d/my.cnf -U maxscale

当然也可以直接用服务启动:

bash 复制代码
systemctl start maxscale.service 

注:使用其一即可,如果已经用命令启动还想用服务启动的话得先用kill关闭之前启动的所有maxscale进程哦。具体如下:

bash 复制代码
[root@Rocky8 ~]# ps -ef | grep maxscale
maxscale     849       1  0 03:57 ?        00:00:01 /usr/bin/maxscale
root        1769    1637  0 04:39 pts/0    00:00:00 grep --color=auto maxscale

# 关闭进程,停止服务
[root@Rocky8 ~]# killall -9 maxscale
(如果之前用命令启动没有关闭的话完成这个之后就能用服务启动咯)

查看maxscale状态:

bash 复制代码
使用 maxctrl list servers 命令查看运行状态
[root@Rocky8 ~]# maxctrl list servers
┌─────────┬─────────────────┬──────┬─────────────┬───────┬──────┬───────────────┐
│ Server  │ Address         │ Port │ Connections │ State │ GTID │ Monitor       │
├─────────┼─────────────────┼──────┼─────────────┼───────┼──────┼───────────────┤
│ dbserv1 │ 192.168.121.150 │ 3306 │ 0           │ Down  │      │ MySQL-Monitor │
├─────────┼─────────────────┼──────┼─────────────┼───────┼──────┼───────────────┤
│ dbserv2 │ 192.168.121.151 │ 3306 │ 0           │ Down  │      │ MySQL-Monitor │
├─────────┼─────────────────┼──────┼─────────────┼───────┼──────┼───────────────┤
│ dbserv3 │ 192.168.121.152 │ 3306 │ 0           │ Down  │      │ MySQL-Monitor │
└─────────┴─────────────────┴──────┴─────────────┴───────┴──────┴───────────────┘

查看注册服务
[root@Rocky8 ~]# maxctrl list services
┌────────────────────┬────────────────┬─────────────┬───────────────────┬───────────────────────────┐
│ Service            │ Router         │ Connections │ Total Connections │ Targets                   │
├────────────────────┼────────────────┼─────────────┼───────────────────┼───────────────────────────┤
│ Read-Write-Service │ readwritesplit │ 0           │ 0                 │ dbserv1, dbserv2, dbserv3 │
└────────────────────┴────────────────┴─────────────┴───────────────────┴───────────────────────────┘

使用 maxctrl list listeners Read-Write-Service 命令查看服务监听状态信息
[root@Rocky8 ~]# maxctrl list listeners Read-Write-Service
┌─────────────────────┬──────┬─────────┬─────────┬────────────────────┐
│ Name                │ Port │ Host    │ State   │ Service            │
├─────────────────────┼──────┼─────────┼─────────┼────────────────────┤
│ Read-Write-Listener │ 3307 │ 0.0.0.0 │ Running │ Read-Write-Service │
└─────────────────────┴──────┴─────────┴─────────┴────────────────────┘

7.客户端连接测试

1)在 master中创建一个访问用户,已经实现主从复制的前提下,主库创建的用户,能同步到从库上

bash 复制代码
-- 创建用户
create user 'admin_user'@'%' identified with mysql_native_password by 'Admin@123456'; --msql 8.0.x 用户认证的方式需要修改为 mysql_native_password
--用户授权
grant all privileges on *.* to 'admin_user'@'%' with grant option;

2)测试读写分离和负载均衡

bash 复制代码
[root@Rocky8 ~]# mysql -uadmin_user -p'Admin@123456' -h 192.168.121.160 -e "select @@server_id"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
|         150 |
+-------------+
[root@Rocky8 ~]# mysql -uadmin_user -p'Admin@123456' -h 192.168.121.160 -e "select @@server_id"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
|         151 |
+-------------+
[root@Rocky8 ~]# mysql -uadmin_user -p'Admin@123456' -h 192.168.121.160 -e "begin;select @@server_id commit;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
|         152 |
+-------------+

3)可以在从库中 slave(192.168.121.152) 新增一条数据,登录主库 master(192.168.121.150) 进行查询如果查询不到,在中间件连接库中 maxscale(192.168.121.160) 可以查询到则成功(不建议,会破坏主从同步)

8.配置maxscale的web管理界面

(1)在maxscale配置文件中[maxscale]下添加两行配置

bash 复制代码
[root@Rocky8 ~]# vim /etc/maxscale.cnf
[root@Rocky8 ~]# head -n4 /etc/maxscale.cnf
[maxscale]
threads=auto
admin_host=0.0.0.0
admin_secure_gui=false
[root@localhost ~]# systemctl restart maxscale

(2)访问 http://192.168.121.160:8989(默认账户密码如下)

相关推荐
程序员陆业聪6 小时前
从 OpenClaw 到 Android:Harness Engineering 是怎么让 Agent 变得可用的
android
身如柳絮随风扬8 小时前
MySQL核心知识
数据库·mysql
hnlgzb8 小时前
常见的Android Jetpack库会有哪些?这些库中又有哪些常用类的?
android·android jetpack
551只玄猫8 小时前
【数据库原理 实验报告1】创建和管理数据库
数据库·sql·学习·mysql·课程设计·实验报告·数据库原理
q5431470879 小时前
MySQL SQL100道基础练习题
数据库·mysql
zhoupenghui1689 小时前
mysql 中如果条件where中有or,则要求or两边的字段都必须有索引,否则不能用到索引, 为什么?
数据库·mysql·索引
eggwyw10 小时前
完美解决phpstudy安装后mysql无法启动
数据库·mysql
java修仙传11 小时前
MySQL 事务隔离级别详解
数据库·mysql·oracle
Irissgwe11 小时前
MySQL存储过程和触发器专题
数据库·mysql·oracle
钛态12 小时前
Flutter 三方库 http_mock_adapter — 赋能鸿蒙应用开发的高效率网络接口 Mock 与自动化测试注入引擎(适配鸿蒙 HarmonyOS Next ohos)
android·网络协议·flutter·http·华为·中间件·harmonyos