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主实列中运行以下命令:
监控用户
1 2 3 | CREATE USER 'maxscalemon' @ '%' IDENTIFIED BY 'abcd@1234' ; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'maxscalemon' @ '%' ; FLUSH PRIVILEGES ; |
路由用户
1 2 3 4 | CREATE USER 'maxscalerouter' @ '%' IDENTIFIED BY 'abcd@1234' ; GRANT SELECT ON mysql.* TO maxscalerouter@ "%" ; GRANT SHOW DATABASES ON *.* TO 'maxscalerouter' @ '%' ; FLUSH PRIVILEGES ; |
五、修改主配置文件
由于我们这里只配置读写分离,所以需要删除掉一些配置信息,可以只留下下文定义的内容
maxscale.cnf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | [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 路由器可能会将这些语句视为潜在的写操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2021-01-02 安装Istio