安装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.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下载地址:

RPM resource 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

Readwritesplit - MariaDB Knowledge Base

Readconnroute - MariaDB Knowledge Base

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值