lamp架构(13)-mysql路由器配置、MHA高可用部署、MHA的故障切换过程

一、mysql路由器配置

通过配置Mysql路由器来实现读写分离的效果,编写配置文件,能够实现读写调度到Mysql组复制集群中的不同后端

1.开启一个新的节点配置mysql路由器

[root@server4 ~]# rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm     %安装相关rpm安装包
[root@server4 ~]# cd /etc/mysqlrouter/
[root@server4 mysqlrouter]# ls
mysqlrouter.conf
[root@server4 mysqlrouter]# vim mysqlrouter.conf      %添加下面的内容
[routing:ro]                    %只读路由
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.1.1:3306,172.25.1.2:3306,172.25.1.3:3306
routing_strategy = round-robin     %调度算法

[routing:rw]                    %读写路由     
bind_address = 0.0.0.0
bind_port = 7002
destinations = 172.25.1.1:3306,172.25.1.2:3306,172.25.1.3:3306
routing_strategy = first-available 
[root@server4 mysqlrouter]# systemctl start mysqlrouter.service       %重启服务
[root@server4 mysqlrouter]# yum install -y net-tools
[root@server4 mysqlrouter]# netstat -antulp           %查看相关端口是否开启
tcp        0      0 0.0.0.0:7001            0.0.0.0:*               LISTEN      4011/mysqlrouter    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      3237/master         
tcp        0      0 0.0.0.0:7002            0.0.0.0:*               LISTEN      4011/mysqlrouter   

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.在server1上创建mysql远程登陆用户,并作相应授权

[root@server1 data]# mysql -pwestos
mysql> grant select on *.* to user1@'%' identified by 'westos';    %创建user1并且授予select(查询)权限
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> grant all on test.* to user2@'%' identified by 'westos';    %创建user2并且授予对test库具备all(完全)权限
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

在这里插入图片描述

3.路由器配置好之后在宿主机上以指定用户远程连接mysql指定路由端口,7001或7002

[root@foundation1 ~]# mysql -h 172.25.1.4 -P 7001 -u user1 -pwestos     %连接7001端口为只读
[root@foundation1 ~]# mysql -h 172.25.1.4 -P 7002 -u user2 -pwestos     %连接7002端口为可读写

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.使用lsof在mysql其它节点上测试连接情况

当某个节点mysql退出之后(不是关闭mysql服务),远程主机可通过路由端口连接到其他mysql主机上继续进行相关操作,因为配置文件中只读策略中定义的算法为round-robin(l轮询调度,一个一个轮着调度)

[root@server1 data]# yum install -y lsof
[root@server1 data]# lsof -i :3306
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  3666 mysql   31u  IPv6  27108      0t0  TCP *:mysql (LISTEN)
mysqld  3666 mysql   83u  IPv6  32262      0t0  TCP server1:mysql->server4:45442 (ESTABLISHED)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

mysql路由具有后端健康检查功能 ,配置文件中设置rw端口连接调度算法为first-available,即一旦有节点挂掉就会调度到其它节点上;远程主机在登录数据库时实际上连接的是server4 mysql路由器,之后server4通过proxy来对后端server2、server3进行调度

在这里插入图片描述
此时远端再次登入数据库发现已经调度到server2上:
在这里插入图片描述

二、MHA高可用部署

整体结构图:
在这里插入图片描述

1.先把server1、server2、server3上的mysql都停掉(为了做新的配置)

[root@server1 data]# /etc/init.d/mysqld stop
Shutting down MySQL........... SUCCESS! 

在这里插入图片描述
在这里插入图片描述

2.删除三个节点上的/usr/local/mysql/data中的文件、更改/etc/my.cnf文件,重新初始化、安装

[root@server1 data]# rm -rf *
[root@server1 data]# vim /etc/my.cnf
[root@server1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
symbolic-links=0

server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
[root@server1 data]# mysqld --initialize --user=mysql
[root@server1 data]# /etc/init.d/mysqld start
[root@server1 data]# mysql_secure_installation 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.在server1上作slave授权、其它两个节点作change master设置,构建一个一主两从的设置

[root@server1 data]# mysql -pwestos
mysql> grant replication slave on *.* to repl@'%' identified by 'westos';
Query OK, 0 rows affected, 1 warning (0.01 sec)

[root@server2 data]# mysql -pwestos
mysql> change master to  MASTER_HOST = '172.25.1.1', MASTER_USER = 'repl',  MASTER_PASSWORD = 'westos', MASTER_AUTO_POSITION = 1;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.在sever4上安装需要安装的资源,并将node节点上所需要安装的资源复制到各个node上安装

[root@server4 ~]# ls
MHA-7  mysql-router-community-8.0.21-1.el7.x86_64.rpm
[root@server4 ~]# cd MHA-7/
[root@server4 MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm  perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
mha4mysql-manager-0.58.tar.gz                   perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
mha4mysql-node-0.58-0.el7.centos.noarch.rpm     perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm          perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm  perl-Net-Telnet-3.03-19.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm       perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
[root@server4 MHA-7]# yum install *.rpm -y
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server1:
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server2:
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server3:

在三个节点上(server1、23):
yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm

在这里插入图片描述
在这里插入图片描述

5.将MHA全局部署文件与另外一个单独文件整合到一起并编辑

[root@server4 ~]# cd MHA-7/
[root@server4 MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm  perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
mha4mysql-manager-0.58.tar.gz                   perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
mha4mysql-node-0.58-0.el7.centos.noarch.rpm     perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm          perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm  perl-Net-Telnet-3.03-19.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm       perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
[root@server4 MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz
[root@server4 MHA-7]# cd mha4mysql-manager-0.58/
[root@server4 mha4mysql-manager-0.58]# ls
AUTHORS  bin  COPYING  debian  lib  Makefile.PL  MANIFEST  MANIFEST.SKIP  README  rpm  samples  t  tests
[root@server4 mha4mysql-manager-0.58]# cd samples/
[root@server4 samples]# ls
conf  scripts
[root@server4 samples]# cd conf/
[root@server4 conf]# ls
app1.cnf  masterha_default.cnf
[root@server4 conf]# cat masterha_default.cnf app1.cnf > /etc/masterha/app.cnf
[root@server4 masterha]# vim app.cnf
[server default]
user=root                   %mysql主从节点的管理员用户密码,确保可以从远程登陆
password=westos
ssh_user=root
repl_user=repl              %主从复制用户密码
repl_password=westos
master_binlog_dir= /usr/local/mysql/data      %mysql主服务器的binlog目录
remote_workdir=/tmp
secondary_check_script= masterha_secondary_check -s 172.25.1.1 -s 172.25.1.2     %修改1
ping_interval=3
# master_ip_failover_script= /script/masterha/master_ip_failover
# shutdown_script= /script/masterha/power_manager
# report_script= /script/masterha/send_report
# master_ip_online_change_script= /script/masterha/master_ip_online_change
manager_workdir=/etc/masterha/app1           %manager工作目录
manager_log=/etc/masterha/app1/manager.log     %manager日志文件

[server1]
hostname=172.25.1.1      %修改2

[server2]
hostname=172.25.1.2      %修改3
candidate_master=1       %指定failover时此slave会接管master,即使数据不是最新的

[server3]
hostname=172.25.1.3      %修改4
no_master=1              %始终是slave

在这里插入图片描述
在这里插入图片描述

6.作server4与其它三个节点的免密,并使用脚本进行检查

[root@server4 masterha]# ssh-keygen
[root@server4 ~]# ssh-copy-id server1              %只做这一步使用脚本检测时会提示失败
[root@server4 ~]# ssh-copy-id server2
[root@server4 ~]# ssh-copy-id server3
[root@server4 ~]# scp -r .ssh/ server1:            %复制私钥和公钥到三个节点上
[root@server4 ~]# scp -r .ssh/ server2:
[root@server4 ~]# scp -r .ssh/ server3:
[root@server4 ~]# masterha_check_ssh --conf=/etc/masterha/app.cnf        %当脚本检测返回内容如下所示时说明免密做成功
Sun Apr 11 11:50:23 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Apr 11 11:50:23 2021 - [info] Reading application default configuration from /etc/masterha/app.cnf..
Sun Apr 11 11:50:23 2021 - [info] Reading server configuration from /etc/masterha/app.cnf..
Sun Apr 11 11:50:23 2021 - [info] Starting SSH connection tests..
Sun Apr 11 11:50:24 2021 - [debug] 
Sun Apr 11 11:50:23 2021 - [debug]  Connecting via SSH from root@172.25.1.1(172.25.1.1:22) to root@172.25.1.2(172.25.1.2:22)..
Sun Apr 11 11:50:23 2021 - [debug]   ok.
Sun Apr 11 11:50:23 2021 - [debug]  Connecting via SSH from root@172.25.1.1(172.25.1.1:22) to root@172.25.1.3(172.25.1.3:22)..
Sun Apr 11 11:50:24 2021 - [debug]   ok.
Sun Apr 11 11:50:25 2021 - [debug] 
Sun Apr 11 11:50:24 2021 - [debug]  Connecting via SSH from root@172.25.1.2(172.25.1.2:22) to root@172.25.1.1(172.25.1.1:22)..
Sun Apr 11 11:50:24 2021 - [debug]   ok.
Sun Apr 11 11:50:24 2021 - [debug]  Connecting via SSH from root@172.25.1.2(172.25.1.2:22) to root@172.25.1.3(172.25.1.3:22)..
Sun Apr 11 11:50:24 2021 - [debug]   ok.
Sun Apr 11 11:50:26 2021 - [debug] 
Sun Apr 11 11:50:24 2021 - [debug]  Connecting via SSH from root@172.25.1.3(172.25.1.3:22) to root@172.25.1.1(172.25.1.1:22)..
Sun Apr 11 11:50:24 2021 - [debug]   ok.
Sun Apr 11 11:50:24 2021 - [debug]  Connecting via SSH from root@172.25.1.3(172.25.1.3:22) to root@172.25.1.2(172.25.1.2:22)..
Sun Apr 11 11:50:25 2021 - [debug]   ok.
Sun Apr 11 11:50:26 2021 - [info] All SSH connection tests passed successfully.

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.在server1中进入mysql对远程管理员登陆数据库作授权

[root@server1 ~]# mysql -pwestos

mysql> grant all on *.* to root@'%' identified by 'westos';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

在这里插入图片描述

8.在server4中用脚本进行检查

[root@server4 ~]# masterha_check_repl --conf=/etc/masterha/app.cnf     %检查MySQL复制状况
Sun Apr 11 11:52:29 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Apr 11 11:52:29 2021 - [info] Reading application default configuration from /etc/masterha/app.cnf..
Sun Apr 11 11:52:29 2021 - [info] Reading server configuration from /etc/masterha/app.cnf..
Sun Apr 11 11:52:29 2021 - [info] MHA::MasterMonitor version 0.58.
Sun Apr 11 11:52:30 2021 - [info] GTID failover mode = 1
Sun Apr 11 11:52:30 2021 - [info] Dead Servers:
Sun Apr 11 11:52:30 2021 - [info] Alive Servers:
Sun Apr 11 11:52:30 2021 - [info]   172.25.1.1(172.25.1.1:3306)
Sun Apr 11 11:52:30 2021 - [info]   172.25.1.2(172.25.1.2:3306)
Sun Apr 11 11:52:30 2021 - [info]   172.25.1.3(172.25.1.3:3306)
Sun Apr 11 11:52:30 2021 - [info] Alive Slaves:
Sun Apr 11 11:52:30 2021 - [info]   172.25.1.2(172.25.1.2:3306)  Version=5.7.31-log (oldest major version between slaves) log-bin:enabled
Sun Apr 11 11:52:30 2021 - [info]     GTID ON
Sun Apr 11 11:52:30 2021 - [info]     Replicating from 172.25.1.1(172.25.1.1:3306)
Sun Apr 11 11:52:30 2021 - [info]     Primary candidate for the new Master (candidate_master is set)
Sun Apr 11 11:52:30 2021 - [info]   172.25.1.3(172.25.1.3:3306)  Version=5.7.31-log (oldest major version between slaves) log-bin:enabled
Sun Apr 11 11:52:30 2021 - [info]     GTID ON
Sun Apr 11 11:52:30 2021 - [info]     Replicating from 172.25.1.1(172.25.1.1:3306)
Sun Apr 11 11:52:30 2021 - [info]     Not candidate for the new Master (no_master is set)
Sun Apr 11 11:52:30 2021 - [info] Current Alive Master: 172.25.1.1(172.25.1.1:3306)
Sun Apr 11 11:52:30 2021 - [info] Checking slave configurations..
Sun Apr 11 11:52:30 2021 - [info]  read_only=1 is not set on slave 172.25.1.2(172.25.1.2:3306).
Sun Apr 11 11:52:30 2021 - [info]  read_only=1 is not set on slave 172.25.1.3(172.25.1.3:3306).
Sun Apr 11 11:52:30 2021 - [info] Checking replication filtering settings..
Sun Apr 11 11:52:30 2021 - [info]  binlog_do_db= , binlog_ignore_db= 
Sun Apr 11 11:52:30 2021 - [info]  Replication filtering check ok.
Sun Apr 11 11:52:30 2021 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.
Sun Apr 11 11:52:30 2021 - [info] Checking SSH publickey authentication settings on the current master..
Sun Apr 11 11:52:30 2021 - [info] HealthCheck: SSH to 172.25.1.1 is reachable.
Sun Apr 11 11:52:30 2021 - [info] 
172.25.1.1(172.25.1.1:3306) (current master)
 +--172.25.1.2(172.25.1.2:3306)
 +--172.25.1.3(172.25.1.3:3306)

Sun Apr 11 11:52:30 2021 - [info] Checking replication health on 172.25.1.2..
Sun Apr 11 11:52:30 2021 - [info]  ok.
Sun Apr 11 11:52:30 2021 - [info] Checking replication health on 172.25.1.3..
Sun Apr 11 11:52:30 2021 - [info]  ok.
Sun Apr 11 11:52:30 2021 - [warning] master_ip_failover_script is not defined.
Sun Apr 11 11:52:30 2021 - [warning] shutdown_script is not defined.
Sun Apr 11 11:52:30 2021 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.

在这里插入图片描述

三、MHA的故障切换过程

1.手动切换

server1和server2均为存活状态:
masterha_master_switch --conf=/etc/masterha/app.cnf --master_state=alive --new_master_host=172.25.1.2 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000        %切换master为server2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

server2上停掉mysql,令其为dead状态(注意,此时下述操作承接上一步,即现在master是server2):
server4上执行:
masterha_master_switch --master_state=dead --conf=/etc/masterha/app.cnf --dead_master_host=172.25.1.2 --dead_master_port=3306 --new_master_host=172.25.1.1 --new_master_port=3306 --ignore_last_failover       %忽略last_failover,如果不忽略则切换时会出错

之后再把server2 mysql开启,登陆数据库,change master操作指定master为server1,再start slave,此时show slave status\G;则能看到master为server1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关于--ignore_last_failover选项:
在执行完上述切换后会在server4上/etc/masterha/目录下生成app目录,里面会产生app.failover.complete文件(锁定文件,禁止自动切换)

此时我们执行一个脚本来测试这个文件的作用:
先删除这个目录中的这个文件然后:
masterha_manager --conf=/etc/masterha/app.cnf &          %启动MHA并打入后台(属于自动切换)

server1上再关闭数据库,此时server4上发现脚本已执行完成,master已自动切换,可以查看/etc/masterha/app目录中的日志manager.log有具体的提示信息
如果在执行脚本前没有删除那个文件,则脚本会执行失败,master切换失败

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.脚本自动切换

server4上:
复制脚本到/usr/local/bin/目录下,为这两个脚本均添加可执行权限(脚本中定义的vip要根据具体情况作更改)
vim /etc/masterha/app.cnf:
[root@server4 masterha]# cat app.cnf 
[server default]
user=root
password=westos
ssh_user=root
repl_user=repl
repl_password=westos
master_binlog_dir= /usr/local/mysql/data
remote_workdir=/tmp
secondary_check_script= masterha_secondary_check -s 172.25.1.1 -s 172.25.1.2
ping_interval=3
master_ip_failover_script= /usr/local/bin/master_ip_failover    %解开这行注释并修改前半部分路径为/usr/local/bin(failover自动切换脚本)
# shutdown_script= /script/masterha/power_manager
# report_script= /script/masterha/send_report
master_ip_online_change_script= /usr/local/bin/master_ip_online_change     %解开这行注释并修改前半部分路径为/usr/local/bin(手动切换脚本)
manager_workdir=/etc/masterha/app1
manager_log=/etc/masterha/app1/manager.log

[server1]
hostname=172.25.1.1

[server2]
hostname=172.25.1.2
candidate_master=1

[server3]
hostname=172.25.1.3
no_master=1

使用测试脚本进行repl测试:
[root@server4 masterha]# masterha_check_repl --conf=/etc/masterha/app.cnf

之后server2上添加指定vip 172.25.1.100,发现在远程主机上可以登陆这个vip的mysql
[root@foundation1 ~]# mysql -h 172.25.1.100 -u root -pwestos
之后再次手动切换master为server1,则vip会转到server1上:
masterha_master_switch --conf=/etc/masterha/app.cnf --master_state=alive --new_master_host=172.25.1.1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

之后在server4上测试,并把server1上的mysql停止,:
masterha_manager --conf=/etc/masterha/app.cnf &           %自动切换
发现vip又切换到了server2上,然后master为server2,想要将server1加入集群则change master为server2并start slave即可

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值