一 介绍
MariaDB MaxScale是一个数据库代理,它将数据库语句转发到一个或多个数据库服务器。它扩展了MariaDB服务器的高可用性、可伸缩性和安全性,同时通过将其与底层数据库基础设施分离来简化应用程序开发。
MariaDB MaxScale旨在向应用程序透明地提供负载平衡和高可用性功能。MariaDB MaxScale有一个可伸缩和灵活的体系结构,带有支持不同协议和路由方法的插件组件。
MaxScale可以实现读写分离及负载均衡。
当主库故障后,maxscale可以实现数据库自动故障转移(自动选取其中一个从库作为主库,其他从库自动指向新主库进行复制)。
二 试验环境
IP | 角色 | 版本 | 主机名 |
192.168.144.105 | MaxScale | 2.4.4 | maxscale |
192.168.144.107 | 主库 | 10.4.14-MariaDB-log | master |
192.168.144.108 | 从库1 | slave1 | |
192.168.144.109 | 从库2 | slave2 | |
192.168.144.110 | 测试读写分离的客户端 |
三 试验步骤
已搭建好MariaDB一主两从架构,具体步骤略。
搭建MariaDB普通主从复制搭建可参考:
https://blog.csdn.net/yabingshi_tech/article/details/108887577
3.1 下载安装MaxScale
3.1.1 安装依赖包
#安装libatomic
yum install libatomic
#安装nettle
rpm -ivh nettle-2.7.1-8.el7.x86_64.rpm
nettle下载地址:
RPM resource libnettle.so.4()(64bit)
#安装trousers
rpm -ivh trousers-0.3.14-2.el7.x86_64.rpm
trousers下载地址:
#安装gnutls
rpm -ivh gnutls-3.3.29-9.el7_6.x86_64.rpm
gnutls下载地址:
RPM resource libgnutls.so.28(GNUTLS_1_4)(64bit)
3.1.2 安装MaxScale
maxscale下载地址:
Download MariaDB Products & Tools | MariaDB
#安装maxscale
rpm -ivh maxscale-2.4.4-1.rhel.7.x86_64.rpm
3.2 配置MaxScale
3.2.1 在MariaDB上创建用户
3.2.1.1 为MaxScale创建专用用户
MaxScale检查传入的客户端是否有效。为此,MaxScale需要从后端数据库检索用户身份验证信息。
在主数据库上创建:
CREATE USER 'maxscale'@'192.168.144.105' IDENTIFIED BY 'maxscale_pw';
GRANT SELECT ON mysql.user TO 'maxscale'@'192.168.144.105';
GRANT SELECT ON mysql.db TO 'maxscale'@'192.168.144.105';
GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'192.168.144.105';
GRANT SELECT ON mysql.columns_priv TO 'maxscale'@'192.168.144.105';
GRANT SELECT ON mysql.proxies_priv TO 'maxscale'@'192.168.144.105';
GRANT SELECT ON mysql.roles_mapping TO 'maxscale'@'192.168.144.105';
GRANT SHOW DATABASES ON *.* TO 'maxscale'@'192.168.144.105';
3.2.1.2 为客户端创建用户
因为MariaDB MaxScale位于客户机和后端数据库之间,所以后端数据库将看到所有客户机,就像它们从MaxScale的地址连接一样。这通常意味着每个用户需要两组授权。
例如,假设用户“jdoe”@“client-host”存在,如果“jdoe”@“client-host”需要能够通过MaxScale连接,则必须创建另一个用户“jdoe”@“MaxScale-host”。第二个用户必须具有与“jdoe”@“client-host”相同的密码和类似的授权。
#在主数据库上创建一个程序账号
CREATE USER 'ProgramUser'@'192.168.144.105' IDENTIFIED BY 'my_secret_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'ProgramUser'@'192.168.144.105';
CREATE USER 'ProgramUser'@'192.168.144.110' IDENTIFIED BY 'my_secret_password'; #这里客户端ip是144.110
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'ProgramUser'@'192.168.144.110';
--备注
3.2.1.3 创建监控用户
#host为数据库服务器(主库故障后,其他从库指向新主库时会用该用户进行复制,因此需要提前授权)
- 在所有mariadb节点上创建一个监控账号
CREATE USER 'MonitorUser'@'%' IDENTIFIED BY 'my_password';
GRANT REPLICATION CLIENT on *.* to 'MonitorUser'@'%';
GRANT REPLICATION slave on *.* to 'MonitorUser'@'%';
GRANT SUPER, RELOAD, event on *.* to 'MonitorUser'@'%';
GRANT select on mysql.user to 'MonitorUser'@'%';
3.2.2 修改配置文件
#创建加密密钥以存储密钥
# 语法: maxkeys [PATH]
maxkeys /var/lib/maxscale/
该命令会自动在/var/lib/maxscale/下生成一个.secrets文件
#生成加密密钥
#注意,密码前必须带一个空格,否则maxscale会起不来,报maxscale用户账号密码不对
#为MonitorUser生成加密密钥
maxpasswd /var/lib/maxscale/ my_password
9800BB21D394CD378938035E1C92CC092CC44D81F309C4879D3300B2CA53EB89
记录下执行该命令输出的值
/*
每台机器上对相同密码生成的加密后的秘钥都不相同,请不要复制本文的密码,请自己生成加密后的密码
*/
#为MaxscaleUser生成加密密钥
maxpasswd /var/lib/maxscale/ maxscale_pw
9800BB21D394CD378938035E1C92CC0989DF6B0633AED0C86593E9A7100E7375
记录下执行该命令输出的值
cd /etc
cp maxscale.cnf maxscale.cnf_bak
修改/etc/maxscale.cnf:
3.2.2.1 配置maxscale
[maxscale]
threads=auto
maxlog=1
log_warning=1
3.2.2.2 配置servers
第一步是定义组成集群的servers。这些服务器将由services使用,并由monitor监视。
示例:
[server1]
type=server
address=192.168.144.107
port=3306
protocol=MariaDBBackend
[server2]
type=server
address=192.168.144.108
port=3306
protocol=MariaDBBackend
[server3]
type=server
address=192.168.144.109
port=3306
protocol=MariaDBBackend
3.2.2.3 配置monitor
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers= server1, server2,server3 #注意:servers的第一个值须写成主库的server名称
user=MonitorUser
password=9800BB21D394CD378938035E1C92CC092CC44D81F309C4879D3300B2CA53EB89
monitor_interval=2000
detect_stale_master=true
detect_stale_slave=on
auto_failover=true
auto_rejoin=true
enforce_read_only_slaves=on
backend_connect_attempts=30
/*
参数含义介绍:
monitor_interval=2000 #单位是毫秒
detect_stale_master=true #当slave全部宕掉时,maxscale仍然可用,将所有的访问指向master节点
detect_stale_slave=on #即便复制停止,slave节点也继续服务
max_slave_replication_lag=120 #单位是秒,表示延迟超过两分钟,就会将该从库剔除,不会将查询路由到该从库上了
*/
3.2.2.4 配置services
[Read-Write-Service]
type=service
router=readwritesplit
servers=server1,server2,server3
user=maxscale
password=9800BB21D394CD378938035E1C92CC0989DF6B0633AED0C86593E9A7100E7375
max_sescmd_history=1500
disable_sescmd_history=true
use_sql_variables_in=master
max_slave_replication_lag=120
filters=Hint
enable_root_user=1
#readwritesplit实现了将读查询分布在多个从节点上,而所有写查询都将发送到主节点。
[MaxAdmin-Service]
type=service
router=cli
3.2.2.5 配置监听
要允许到service的网络连接,必须将网络端口与其关联。这是通过在配置文件中创建单独的监听器部分来完成的。
[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=4006
[MaxAdmin-Listener]
type=listener
service=MaxAdmin-Service
protocol=maxscaled
socket=default
3.2.2.6 配置Hint
[Hint]
type=filter
module=hintfilter
3.3 启动MaxScale
3.3.1 启动MaxScale
systemctl start maxscale
3.3.2 检查MaxScale状态
3.3.3 开放防火墙端口
如果系统开启了防火墙的话,需要开放4006端口:
firewall-cmd --add-port=4006/tcp --permanent
firewall-cmd --reload
3.4 验证读写分离
#在主库上创建测试表
use baidd;
create table t(id int primary key,name varchar(30));
#在一台客户端服务器上远程连接maxscale插入两百条数据
vi c.sh
for i in {1..200}
do
mysql -h 192.168.144.105 -u ProgramUser -pmy_secret_password -P 4006 -e "insert into baidd.t(id,name) values($i,@@hostname);"
done
sh c.sh
#验证读写分离
mysql -h 192.168.144.105 -u ProgramUser -pmy_secret_password -P 4006 -e " select count(*) from baidd.t where name='master'"
+----------+
| count(*) |
+----------+
| 200 |
+----------+
结果为200条数据,说明写全部在主库上。
vi d.sh
for i in {1..200}
do
mysql -h 192.168.144.105 -u ProgramUser -pmy_secret_password -P 4006 -e "select @@hostname;"
done
sh d.sh > d.log
cat d.log | grep master | wc -l #结果为0
cat d.log |grep slave1 | wc -l
cat d.log |grep slave2 | wc -l
slave1+slave2共200条
因此,可以看到实现了读写分离。
3.5 实现主库故障自动转移
3.5.1 配置自动故障转移
MariaDB监视器不仅能够监视MariaDB主从集群的状态,还能够执行故障转移和切换。
请注意,故障转移(以及切换和重新连接)功能仅支持与基于GTID的复制结合使用,并且最初仅支持简单拓扑,即1个主拓扑和多个从拓扑。
故障转移、切换和重新连接功能是MariaDB监视器的固有部分,但默认情况下,自动故障转移和自动重新连接(auto_rejoin=true)都不启用。
修改配置文件/etc/maxscale.cnf,在监控模块处添加:
auto_failover=true
#重启maxscale:
systemctl restart maxscale
3.5.2 模拟主库故障
如果server1现在停止运行,将自动执行故障转移,MariaDB监视器现在将自动推断哪个从库最适合升级为master,将其升级为master,并将其他slave自动指向新主库。
systemctl stop mariadb
Maxscale日志显示了详细的切换过程:
注意检查下slave2的主从复制状态。
故障模拟结束后,启动原主库:
systemctl start mariadb
已试验,当从库延迟情况下(io进程或者sql进程停止了),仍然会发生主库故障自动转移到从库。
已试验,当从库设置了只读,主库故障转移时,会自动关闭从库的只读模式。
#备注
若未设置auto_failover=true,想要手动故障切换的话,执行如下命令:
maxctrl call command mariadbmon failover MariaDB-Monitor
3.6 配置原主库恢复后将其自动加入集群
修改配置文件/etc/maxscale.cnf,在监控模块处添加:
auto_rejoin=true
#重启maxscale
systemctl restart maxscale
原主库启动后,Maxscale会自动将其加入集群里,并指向新主库进行复制:
#检查主从复制状态
show slave status \G;
3.7 手动switchover
有时希望将主角色从一个服务器移动到另一个服务器。
如果我们希望再次将server1设为master,则必须发出以下命令:
maxctrl call command mariadbmon switchover MariaDB-Monitor server1 server2
第一个值server1表示要变成主库的server,第二个值server2表示当前的主。
执行该命令的前提是server1目前是server2的从库。
3.8 模拟从库故障
3.8.1 模拟其中一个从库故障
[root@slave1 backup]# systemctl stop mariadb
该从库被maxscale标记为down状态,通过maxscale能正常读数据(读的另一个从库):
[root@PC download]# mysql -h 192.168.144.105 -u ProgramUser -pmy_secret_password -P 4006 -e "SELECT @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| slave2 |
+------------+
3.8.2 模拟所有从库全部宕机
[root@slave2 1614]# systemctl stop mariadb
[root@PC download]# mysql -h 192.168.144.105 -u ProgramUser -pmy_secret_password -P 4006 -e "SELECT @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| master |
+------------+
可以看到,当所有从库全部宕机后,读取的主库的数据。
--想实现maxscale本身的高可用的话,可以安装两个maxscale,将第一台maxscale的passive设置为off,将第二台maxscale的passive设置为on。在两个maxscale上安装keepalive,配置vip,同一时刻,vip只在其中一个maxscale节点上。
注意,不要用haproxy同时代理两个maxscale,这样有可能会有以下问题:
当后端mariadb主库宕机,或者maxscale由于网络问题,连不上后端mariadb主库,第一台maxscale会触发主从切换,在该过程中假如将后端mariadb启动,或者网络恢复正常了,那第一台maxscale最终会选举一个新mariadb作为主库,而第二台maxscale会以为原主库是master,这样两个maxscale显示的主从状态就不一样了,就会往自己以为的主库写入数据,从而导致数据错乱。
本篇文章主要参考自:
MariaDB MaxScale Installation Guide - MariaDB Knowledge Base,
Setting up MariaDB MaxScale - MariaDB Knowledge Base及
MariaDB MaxScale Administration Tutorial - MariaDB Knowledge Base