ubuntu安装maxscale

一、简介

MaxScale 是 MariaDB 开发的一个数据库智能代理服务,允许根据数据库 SQL 语句将请求转向目标一个到多个服务器,可设定各种复杂程度的转向规则。

MaxScale 设计用于透明的提供数据库的负载均衡和高可用性,同时提供高度可伸缩和灵活的架构,支持不同的协议和路由决策。MaxScale 使用 C 语言开发,利用 Linux 下的异步 I/O 功能。使用 epoll 作为事件驱动框架。

二、下载

官方下载地址:https://mariadb.com/downloads/community/maxscale/

点击maxscale

目前最新版本为:24.02.3-GA

操作系统选择:Ubuntu 22.04 Jammy (64-bit x86)


点击右下角的下载按钮,会得到一个文件maxscale_24.02.3~jammy-1_amd64.deb

 

三、安装

dpkg -i maxscale_24.02.3~jammy-1_amd64.deb

执行之后,安装提示报错,缺少相关依赖。

安装依赖

apt-get install -f

 

安装完成后,启动服务

systemctl restart maxscale

 

四、添加用户授权

根据maxscale.cnf文件配置,在主/从服务器上添加对应的授权用户,因为2台数据库服务器是主从同步结构,只在主数据库服务器添加用户即可,从服务器会自动同步,这里需要授权两个用户,在mysql上创建,一个是监控用户(监控的数据库服务器),一个是路由用户(监控读写分离),这两个用户是用来在maxscale中使用的

 

在mysql主实列中运行以下命令:

监控用户

CREATE USER 'maxscalemon'@'%' IDENTIFIED BY 'abcd@1234';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'maxscalemon'@'%';
FLUSH PRIVILEGES;

 

路由用户

CREATE USER 'maxscalerouter'@'%' IDENTIFIED BY 'abcd@1234';
GRANT SELECT ON mysql.* TO maxscalerouter@"%";
GRANT SHOW DATABASES ON *.* TO 'maxscalerouter'@'%';
FLUSH PRIVILEGES;

  

五、修改主配置文件

由于我们这里只配置读写分离,所以需要删除掉一些配置信息,可以只留下下文定义的内容

maxscale.cnf

[maxscale]
threads=auto
#启用MaxGUI
admin_enabled=1
admin_gui=1
admin_host=0.0.0.0
admin_port=8989
# 如果设置为1,则启用SSL/TLS
admin_secure_gui=0
log_debug=0
log_info=1
#控制日志记录的节流
log_throttling=8,2s,15000ms
 
[master]
type=server
address=mysql-***-001.mysql.database.azure.com
port=3306
protocol=MySQLBackend
 
[slave]
type=server
address=mysql-***-001-replicate.mysql.database.azure.com
port=3306
protocol=MySQLBackend
 
[MySQL-Monitor]
type=monitor
module=mysqlmon
servers=master,slave
user=maxscalemon
password=abcd@1234
monitor_interval=2s
 
[Read-Write-Service]
type=service
router=readwritesplit
servers=master,slave
user=maxscalerouter
password=abcd@1234
 
[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MySQLClient
port=4006

 

列出所有服务器,使用以下命令:

maxctrl list servers

 

六、验证读写分离

这里需要修改参数

log_info=1

 

查看日志

tail -f /var/log/maxscale/maxscale.log

修改一条mysql数据

 


这里可以看到执行了:UPDATE `tm_test` SET `name`='苹果' WHERE (`ID`='2'),指向的服务器是master,也就是主库

 

2024-11-15 17:13:18 info : (5) (Read-Write-Service); > Autocommit: [enabled], trx is [not open], cmd: (0x3) COM_QUERY, plen: 63, type: sql::TYPE_WRITE, stmt: UPDATE `tm_test` SET `name`='苹果' WHERE (`ID`='2')
2024-11-15 17:13:18 info : (5) [readwritesplit] (Read-Write-Service); Route query to primary: master <
2024-11-15 17:13:18 info : (5) [readwritesplit] (Read-Write-Service); Reply complete from 'master' (OK: 0 warnings)

 

验证完成之后,最好把log_info=1给注释掉,否则日志会很大。maxscale没有参数,可以控制日志大小,因此需要操作系统层面来进行日志切割处理。

 

七、web后台页面

访问地址:http://192.168.10.1:8989/
登录信息如下:

用户名:admin

密码:mariadb

登录之后,效果如下:

 点击Current Sessions,可以看到当前mysql会话

 点击Visualization,可以看到拓扑图

 点击Logs Archive,可以查看日志

 

八、疑难问题:

1. java代码里面先更新了数据,再次查询,发现数据没更新,还是之前的数据。

解决办法:

修改java代码,将更新和查询,使用事务模式进行包裹,就可以解决这个问题。

在 MaxScale 的事务模式下,即使没有修改操作,只有读取操作,也可能会被路由到主库
。这是因为 MaxScale 的 readwritesplit 路由器在处理事务时,会将事务中的所有语句路由到同一个服务器上。

需要注意的是,即使在事务中只有读取操作,如果事务中包含了某些特定的 SQL 语句(如存储过程或函数调用),这些语句可能会被路由到主库
。这是因为 MaxScale 的 readwritesplit 路由器可能会将这些语句视为潜在的写操作。

 

posted @ 2025-01-02 15:18  肖祥  阅读(8)  评论(0编辑  收藏  举报