MariaDB MaxScale是一种数据库代理,可将数据库语句转发到一个或多个数据库服务器。 使用基于数据库语句的语义理解以及数据库后端集群中服务器的角色的规则执行转发。 MariaDB MaxScale旨在为应用程序透明地提供负载平衡和高可用性功能。MariaDB MaxScale具有可扩展且灵活的体系结构,其插件组件可支持不同的协议和路由方法。
官方maxscale配置参数文档说明:请点击 官方maxscale读写分离详细配置参数说明:请点击 官方MaxCtrl更多使用信息和rest-api:请点击
案例:会创建3个mysql用户一个是maxscale的监控账户monitor_user,一个是maxscale的service服务账户maxscale,一个是模拟应用程序用户jdoe
机器IP | 节点角色信息 |
---|---|
192.168.117.128 | master |
192.168.117.129 | salve & maxscale |
主从复制安装过程请移步:mariadb 10.4.12 主从复制
从节点配置
[root@localhost ~]# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-maxscale-version="2.4" --mariadb-server-version="mariadb-10.4"
[info] Repository file successfully written to /etc/yum.repos.d/mariadb.repo
[info] Adding trusted package signing keys...
[info] Successfully added trusted package signing keys
[root@localhost ~]# yum install -y maxscale
mariadb主节点(创建maxscale账户)
创建这个账号的作用:MaxScale检查接入客户端是否有效。为此,MaxScale需要从后端数据库检索接入用户身份验证信息。这个账号就是用来查询以后连接maxscale的用户。
MariaDB [(none)]> CREATE USER 'maxscale'@'%' IDENTIFIED BY 'maxscale_pw';
Query OK, 0 rows affected (2.035 sec)
MariaDB [(none)]> GRANT SELECT ON mysql.user TO 'maxscale'@'%';
Query OK, 0 rows affected (0.036 sec)
MariaDB [(none)]> GRANT SELECT ON mysql.db TO 'maxscale'@'%';
Query OK, 0 rows affected (0.005 sec)
MariaDB [(none)]> GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'%';
Query OK, 0 rows affected (0.003 sec)
MariaDB [(none)]> GRANT SELECT ON mysql.roles_mapping TO 'maxscale'@'%';
Query OK, 0 rows affected (0.002 sec)
MariaDB [(none)]> GRANT SHOW DATABASES ON *.* TO 'maxscale'@'%';
Query OK, 0 rows affected (0.001 sec)
#MariaDB versions 10.2.2 to 10.2.10 also require GRANT SELECT ON mysql.* TO
'maxscale'@'%';
创建客户端账户:app程序使用的真实读写数据库的账号,权限根据自己的需求来创建。在master节点执行。
[root@localhost ~]# mysql -uroot -p
Enter password:
MariaDB [(none)]> grant all privileges on *.* to 'jdoe'@'%' IDENTIFIED BY 'my_secret_password';
Query OK, 0 rows affected (0.340 sec)
MariaDB [(none)]>
配置文件位置/etc/maxscale.cnf,
[root@localhost ~]# vim /etc/maxscale.cnf
#...修改server1增加server2,如果你2个salve,再增加server3
[server1]
type=server
address=192.168.117.128
port=3306
protocol=MariaDBBackend
[server2]
type=server
address=192.168.117.129
port=3306
protocol=MariaDBBackend
#...省略部分内容
[root@localhost ~]# vim /etc/maxscale.cnf
#...省略部分内容
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2
user=monitor_user
password=my_password
monitor_interval=2000
##检查复制延迟
detect_replication_lag=true
#全部slave不可用,select查询转发至master。
detect_stale_master=true
#...省略部分内容
#创建监控账号,在master上执行
CREATE USER 'monitor_user'@'%' IDENTIFIED BY 'my_password';
GRANT REPLICATION CLIENT on *.* to 'monitor_user'@'%';
#如果配置集群自动故障转移请执行,不配置故障转移可以省略
GRANT SUPER, RELOAD on *.* to 'monitor_user'@'%';
[root@localhost ~]# vim /etc/maxscale.cnf
#[Read-Write-Service] #<--删除掉原来的默认配置组
#[Read-Only-Service]#<--删除掉原来的默认配置组
#[Read-Only-Listener]#<--删除掉原来的默认配置组
#[Read-Write-Listener]#<--删除掉原来的默认配置组
#...省略部分内容,以下为新增加的内容
[Splitter-Service]
type=service
router=readwritesplit
servers=server1,server2
user=maxscale
password=maxscale_pw
#全部slave提供select查询服务
max_slave_connections=100%
#slave超时5秒,请求转发到其他slave
max_slave_replication_lag=5
#预先设置会话变量,例如 set character_set_connection=utf8,character_set_results=utf8,character_set_client=binary
use_sql_variables_in=all
#允许root用户登录
enable_root_user=1
[Splitter-Listener]
type=listener
service=Splitter-Service
protocol=MariaDBClient
port=4006
#...省略部分内容
注意:生产集群maxscale节点需要高可用配置,可以参照keepalived与nginx高可用文章。
[root@localhost ~]# systemctl start maxscale
[root@localhost ~]# systemctl enable maxscale
[root@localhost ~]# maxctrl list services
┌──────────────────┬────────────────┬─────────────┬───────────────────┬──────────────────┐
│ Service │ Router │ Connections │ Total Connections │ Servers │
├──────────────────┼────────────────┼─────────────┼───────────────────┼──────────────────┤
│ Splitter-Service │ readwritesplit │ 0 │ 0 │ server1, server2 │
└──────────────────┴────────────────┴─────────────┴───────────────────┴──────────────────┘
[root@localhost ~]# maxctrl list servers
┌─────────┬─────────────────┬──────┬─────────────┬─────────────────┬────────┐
│ Server │ Address │ Port │ Connections │ State │ GTID │
├─────────┼─────────────────┼──────┼─────────────┼─────────────────┼────────┤
│ server1 │ 192.168.117.128 │ 3306 │ 0 │ Master, Running │ 0-1-16 │
├─────────┼─────────────────┼──────┼─────────────┼─────────────────┼────────┤
│ server2 │ 192.168.117.129 │ 3306 │ 0 │ Slave, Running │ 0-1-16 │
└─────────┴─────────────────┴──────┴─────────────┴─────────────────┴────────┘
[root@localhost ~]# maxctrl list listeners Splitter-Service
省略输出
验证读写分离
MariaDB [(none)]> use reptest;
Database changed
MariaDB [reptest]> create table test_maxscale(id int);
Query OK, 0 rows affected (0.539 sec)
MariaDB [reptest]> insert into test_maxscale values(87);
Query OK, 1 row affected (0.110 sec)
MariaDB [reptest]> select * from test_maxscale;
+------+
| id |
+------+
| 87 |
+------+
1 row in set (0.070 sec)
在salve执行
MariaDB [(none)]> use reptest;
Database changed
MariaDB [reptest]> insert into test_maxscale values(86);
Query OK, 1 row affected (0.397 sec)
MariaDB [reptest]> select * from test_maxscale;
+------+
| id |
+------+
| 87 |
| 86 |
+------+
2 rows in set (0.073 sec)
连接maxscale执行(注意-P端口)
[root@localhost ~]# mysql -P4006 -ujdoe -pmy_secret_password -h192.168.117.129 -e "insert into reptest.test_maxscale values(100);"
[root@localhost ~]# mysql -P4006 -ujdoe -pmy_secret_password -h192.168.117.129 -e "select * from reptest.test_maxscale;"
+------+
| id |
+------+
| 87 |
| 86 |
| 100 |
+------+
[root@localhost ~]# mysql -P3306 -ujdoe -pmy_secret_password -h192.168.117.128 -e "select * from reptest.test_maxscale;"
+------+
| id |
+------+
| 87 |
| 100 |
+------+
[root@localhost ~]# mysql -P3306 -ujdoe -pmy_secret_password -h192.168.117.129 -e "select * from reptest.test_maxscale;"
+------+
| id |
+------+
| 87 |
| 86 |
| 100 |
+------+
通过多次插入、查询可以看到maxscale实现了读写分离。
选项 | 作用范围 | 含义 |
---|---|---|
threads | [maxscale]全局 | 定义工作线程数auto表示与cpu线程数相同 |
thread_stack_size | [maxscale]全局 | 2.3版本之后弃用此参数,设置线程stack大小,2.3版本之后,maxscale启动前通过配置系统ulimit -s来设置。 |
auth_connect_timeout | [maxscale]全局 | 默认3秒,提取用户身份验证数据后,MySQL与后端服务器的连接超时(以秒为单位)。 |
auth_read_timeout | [maxscale]全局 | 默认1秒,提取用户身份验证数据时,MySQL与后端数据库的连接的读取超时(以秒为单位)。 |
auth_write_timeout | [maxscale]全局 | 提取用户身份验证数据时,MySQL与后端数据库的连接的写入超时(以秒为单位)。当前,MariaDB MaxScale不会在后端服务器中写入或修改数据。默认值为2秒。 |
query_retries | [maxscale]全局 | 被重试的内部查询的次数。内部查询仅用于检索身份验证数据和监视服务器。 |
query_retry_timeout | [maxscale]全局 | 任何重试查询的总超时时间(以秒为单位)。默认值为5秒。 |
ms_timestamp | [maxscale]全局 | 启用此选项可以为所有日志文件时间戳增加毫秒精度。#ms_timestamp = <0 |
skip_permission_checks | [maxscale]全局 | 跳过服务并监视用户权限检查。当您知道权限确定并且想要加快启动过程时,此功能很有用。默认false ,启动skip_permission_checks = true |
syslog | [maxscale]全局 | 启用或禁用将消息记录到syslog。默认情况下,启用到syslog的日志记录。通过0 |
maxlog | [maxscale]全局 | 默认值1,禁止将消息记录到MariaDB MaxScale的日志文件中。syslog = <0 |
log_to_shm | [maxscale]全局 | 此参数已在2.4.0中删除:请勿使用 |
log_warning | [maxscale]全局 | 默认1启用,启用或禁用系统日志优先级为warning的消息的日志记录 |
log_notice | [maxscale]全局 | 启用或禁用的消息,其syslog优先权在日志通知。 |
log_info | [maxscale]全局 | 默认值是禁止0;启用或禁用系统日志优先级为info的消息的日志记录。#log_info = <0 |
log_debug | [maxscale]全局 | 如果错误原因持续存在,则可能会一遍又一遍地记录特定的错误(或警告)。为了防止日志泛滥 默认禁止,用于maxscale开发调试 |
log_throttling | [maxscale]全局 | 如果错误原因持续存在,为了防止日志泛滥。log_throttling=8, 2s, 15000ms ,2秒内记录了8次错误,则将特定错误的记录抑制15秒。 |
logdir | [maxscale]全局 | 设置日志文件的存储目录。运行MariaDB MaxScale的用户需要该文件夹可读写。 |
datadir | [maxscale]全局 | 设置MariaDB MaxScale使用的数据文件的存储目录。用于存储二进制日志和maxkeys加密密码。 |
libdir | [maxscale]全局 | MaxScale查找模块目录 |
cachedir | [maxscale]全局 | 配置用于存储缓存数据的目录MariaDB MaxScale。缓存数据的一个例子是从后端服务器获取的身份验证数据。 |
piddir | [maxscale]全局 | 为MariaDB MaxScale的PID文件配置目录。 |
execdir | [maxscale]全局 | 可执行文件存放目录 |
connector_plugindir | [maxscale]全局 | MariaDB Connector-C插件存放目录 |
persistdir | [maxscale]全局 | 配置存储持久配置的目录。通过MaxAdmin创建新服务器时,它将存储在此目录中。persistdir=/var/lib/maxscale/maxscale.cnf.d/ |
query_classifier | [maxscale]全局 | MariaDB MaxScale用于查询分类的模块。在确定应将特定语句发送到何处时,MariaDB MaxScale将使用此模块提供的信息。默认查询分类器是 qc_sqlite。 |
local_address | [maxscale]全局 | 连接到服务器时要使用的特定本地地址/接口 |
admin_host | [maxscale]全局 | REST API侦听的网络接口。默认值为127.0.0.1仅侦听本地连接的IPv4地址。 |
admin_port | [maxscale]全局 | REST API侦听的端口。默认值为端口8989。 |
admin_auth | [maxscale]全局 | 使用HTTP基本访问身份验证启用REST API身份验证。如果没有HTTPS,这不是一种安全的身份验证方法,但确实会增加一小层安全性。默认情况下启用此选项。管理界面身份验证使用与MaxAdmin网络界面相同的用户。这意味着可以同时使用MaxAdmin和REST API添加新用户。该接口的默认凭据为admin:mariadb。 |