安装maxscale实现MariaDB高可用及读写分离
一 介绍
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.****.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下载地址:
http://rpmfind.net/linux/rpm2html/search.php?query=libnettle.so.4()(64bit)
#安装trousers
rpm -ivh trousers-0.3.14-2.el7.x86_64.rpm
trousers下载地址:
http://rpmfind.net/linux/rpm2html/search.php?query=trousers&submit=Search+...&system=centos&arch=
#安装gnutls
rpm -ivh gnutls-3.3.29-9.el7_6.x86_64.rpm
gnutls下载地址:
http://rpmfind.net/linux/rpm2html/search.php?query=libgnutls.so.28(GNUTLS_1_4)(64bit)
3.1.2 安装MaxScale
maxscale下载地址:
https://mariadb.com/downloads/#mariadb_platform-mariadb_maxscale
#安装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为maxscale
CREATE USER 'MonitorUser'@'192.168.144.105' IDENTIFIED BY 'my_password';
GRANT REPLICATION CLIENT on *.* to 'MonitorUser'@'192.168.144.105';
GRANT REPLICATION slave on *.* to 'MonitorUser'@'192.168.144.105';
GRANT SUPER, RELOAD on *.* to 'MonitorUser'@'192.168.144.105';
#host为数据库服务器(主库故障后,其他从库指向新主库时会用该用户进行复制,因此需要提前授权)
- 节点一
CREATE USER 'MonitorUser'@'192.168.144.107' IDENTIFIED BY 'my_password';
GRANT REPLICATION CLIENT on *.* to 'MonitorUser'@'192.168.144.107';
GRANT REPLICATION slave on *.* to 'MonitorUser'@'192.168.144.107';
GRANT SUPER, RELOAD on *.* to 'MonitorUser'@'192.168.144.107';
② 节点二
CREATE USER 'MonitorUser'@'192.168.144.108' IDENTIFIED BY 'my_password';
GRANT REPLICATION CLIENT on *.* to 'MonitorUser'@'192.168.144.108';
GRANT REPLICATION slave on *.* to 'MonitorUser'@'192.168.144.108';
GRANT SUPER, RELOAD on *.* to 'MonitorUser'@'192.168.144.108';
③ 节点三
CREATE USER 'MonitorUser'@'192.168.144.109' IDENTIFIED BY 'my_password';
GRANT REPLICATION CLIENT on *.* to 'MonitorUser'@'192.168.144.109';
GRANT REPLICATION slave on *.* to 'MonitorUser'@'192.168.144.109';
GRANT SUPER, RELOAD on *.* to 'MonitorUser'@'192.168.144.109';
3.2.2 修改配置文件
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=my_password
monitor_interval=2000 #单位是毫秒
detect_stale_master=true #当slave全部宕掉时,maxscale仍然可用,将所有的访问指向master节点
detect_stale_slave=on #即便复制停止,slave节点也继续服务
detect_replication_lag=true #检测主服务器和从服务器之间的复制延迟,只路由到最新的从服务器
注意:配置的时候,把#这些注释文本去除。
3.2.2.4 配置services
[Read-Write-Service]
type=service
router=readwritesplit
servers=server1,server2,server3
user=maxscale
password=maxscale_pw
#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.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条数据,说明写全部在主库上。
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 模拟其中一个从库故障
[[email protected] backup]# systemctl stop mariadb
该从库被maxscale标记为down状态,通过maxscale能正常读数据(读的另一个从库):
[[email protected] 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 模拟所有从库全部宕机
[[email protected] 1614]# systemctl stop mariadb
[[email protected] 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 |
+------------+
可以看到,当所有从库全部宕机后,读取的主库的数据。
本篇文章主要参考自:
https://mariadb.com/kb/en/mariadb-maxscale-25-mariadb-maxscale-installation-guide/,
https://mariadb.com/kb/en/mariadb-maxscale-25-setting-up-mariadb-maxscale/及
https://mariadb.com/kb/en/mariadb-maxscale-25-mariadb-maxscale-administration-tutorial/
https://mariadb.com/kb/en/mariadb-maxscale-24-readwritesplit/
https://mariadb.com/kb/en/mariadb-maxscale-24-readconnroute/#overview