一、简介
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 路由器可能会将这些语句视为潜在的写操作。
标签:info,log,MaxScale,ubuntu,maxscale,mysql,服务器,安装 From: https://www.cnblogs.com/xiao987334176/p/18647821