MHA实验和架构

发布时间:2023年12月18日

MHA:

Masterhight availabulity:基于主库的高可用环境下:主从复制 故障切换

MHA主从的架构:最少要一主两从

Mysql的单点故障问题,一旦主库崩溃,MHA可以在0-30秒内自动完成故障切换

MHA使用的是半同步复制,只要有一台从服务器写入数据,就会自动提交给客户端。

原理:如果master崩溃,slave就会从主的二进制日志保存文件

Slave会识别最新更新的日志

差异部分同步到slave

提升一个新的slave作为master

其他的slave继续和新的master同步

实验准备:

1.MHA架构搭建

2.模拟故障

3.故障恢复

MHA manger 192.168.120.110

Master 192.168.120.80

Slave1 192.168.120.90

slave2 192.168.120.100

node组件------>需要部署在所有服务器上,manger组件依赖于node组件,node组件监控mysql的状态。

node组件靠ssh来进行通信

实验过程

1、 搭建MHA架构

2、 模拟故障

3、 故障恢复

实验准备:

MHA manger 192.168.120.110

Master 192.168.120.80

Slave1 192.168.120.90

slave2 192.168.120.100

node组件:需要部署在所有服务器上。因为manager组件依赖于node组件。node组件就是用来监控MySQL的状态的。

node组件靠ssh远程连接服务来进行通信。

开始实验

修改从主机名192.168.120.90

hostnamectl set-hostname slave1

修改从主机名192.168.120.100

hostnamectl set-hostname slave2

修改主主机名192.168.120.80

hostnamectl set-hostname master

su一下让他们都生效

修改完成后ping一下主机名看一下能不能通

先实现主从复制

配置主MySQL

vim /etc/my.conf

server-id=1

log_bin=master-bin

log-slave-updates=ture

配置从MySQL1

server-id=2

log_bin=master-bin

relay-log=relay-log-bin

relay-log-index=slave-relay-bin.index

配置从MySQL2

server-id=3

relay-log=relay-log-bin

relay-log-index=slave-relay-bin.index

重启三台MySQL

在主和从服务器上创建软连接

ln -s /usr/local/mysql/bin/mysql /usr/sbin/

ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin

三台主机上都要创建软连接

mysql -u root -p123456

#进入数据库

三台服务器同时操作

从数据库同步使用

grant replication slave on *.* to 'myslave'@'192.168.120.%' identified by '123456'; 给mha权限能访问主从的权限

#manager 使用

grant all privileges on *.* to 'mha'@'192.168.120.%' identified by 'manager';

#防止从库通过主机名连接不上主库

grant all privileges on *.* to 'mha'@'master' identified by 'manager';

grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';

grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';

flush privileges;

#刷新其权限

在 Master 节点查看二进制文件和同步点

show master status;

在 Slave1、Slave2 节点执行同步操作

change master to master_host='192.168.120.80',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1747;

start slave;

#打开两个从的slave

show slave status\G;

#查看两个从的slave的状态都是yes表示成功

必须要把两个从库都设为只读模式

set global read only=1

#把两个从库都设为只读模式

打开工具测试一下主从复制是否成功

create database kgc;

#创建一个库

进入MHA的配置

所有的服务器都需要安装MHA的依赖环境必须要有epel源

开始安装

yum install epel-release --nogpgcheck -y

#epel源

yum install -y perl-DBD-MySQL \

perl-Config-Tiny \

perl-Log-Dispatch \

perl-Parallel-ForkManager \

perl-ExtUtils-CBuilder \

perl-ExtUtils-MakeMaker \

perl-CPAN

#MHA依赖环境

先安装node组件,再安装manager组件

每台服务器上都需要部署node节点

cd /opt

tar -xf mha4mysql-node-0.57.tar.gz

#解压文件

perl Makefile.PL

#编译

make $$ make install

回到mha服务器

解压高可用节点

tar -xf mha4mysql-manager-0.57.tar.gz

#解压

cd mhamanager

perl Makefile.PL

make $$ make install

cd /usr/local/bin/

#查看一下重要组件

ll -h

master的组件:

masterha_check_ssh

#检查MHA的ssh的配置情况

masterha_check_repl

#检查MySQL的复制情况

masterha_manager

#启动manger的脚本

masterha_check_status

#检测MHA的运行状态

masterhaha_master_monitor

#检测master主机的情况,masters是否宕机

masterha_master_switch

#控制故障转移

masterha_conf_host

#添加或者删除配置的server信息

masterha_stp

#停止MHA的脚本

重要的node组件:

save_binary_logs

#保存和复制master的二进制日志

apply_diff_relay_logs

#识别二进制日志当中的差异事件,然后发送给其他的slave

filter_mysqlbinlog

#去除不必要的回滚(MHA已经不用了)

purge_relay_logs

#同步之后清除中继日志(不会阻塞sql的限制)

开始实现ssh免密登录

在MHA主机上操作

ssh-keygen -t rsa

#选择加密方式

一路回车

ssh-copy-id 192.168.120.80

输入密码和yes

ssh-copy-id 192.168.120.90

输入密码和yes

ssh-copy-id 192.168.120.100

输入密码和yes

回到master主机

ssh-keygen -t rsa

#选择加密方式

ssh-copy-id 192.168.120.90

输入密码和yes

ssh-copy-id192.168.120.100

输入密码和yes

回到slave1主机

ssh-keygen -t rsa

#选择加密方式

ssh-copy-id 192.168.120.80

输入密码和yes

ssh-copy-id 192.168.120.100

输入密码和yes

回到slave2主机

ssh-keygen -t rsa

#选择加密方式

ssh-copy-id 192.168.120.80

输入密码和yes

ssh-copy-id 192.168.120.90

输入密码和yes

在 manager 节点上配置 MHAcd /usr/loacl/bin

cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

复制上述的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录,

这里使用master_ip_failover脚本来管理 VIP 和故障切换

cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

?拷贝后会有四个执行文件

master_ip_failover

#自动切换时管理VIP的脚本

master_ip_online_change

#在线切换时的vip管理脚本

power_manger

#如果故障发生之后关闭master脚本

send_report

#发送故障时的告警脚本

vim master_ip_failover

除了第一行全部删除

添加控制脚本

use strict;

use warnings FATAL => 'all';

use Getopt::Long;

my (

$command, $ssh_user, $orig_master_host, $orig_master_ip,

$orig_master_port, $new_master_host, $new_master_ip, $new_master_port

);

my $vip = '192.168.120.120';

#设定vip地址

my $brdc = '192.168.120.255';

#设定VIP的广播地址

my $ifdev = 'ens33';

#VIP绑定的网卡

my $key = '1';

#ifcong ens33:1 192.168.120.120/24 key是1,网卡的编号就是1

my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";

#key:ens33:1 192.168.120.120 up

my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";

#ens33:1 192.168.120.120?down

my $exit_code = 0;

GetOptions(

'command=s' => \$command,

'ssh_user=s' => \$ssh_user,

'orig_master_host=s' => \$orig_master_host,

'orig_master_ip=s' => \$orig_master_ip,

'orig_master_port=i' => \$orig_master_port,

'new_master_host=s' => \$new_master_host,

'new_master_ip=s' => \$new_master_ip,

'new_master_port=i' => \$new_master_port,

);

exit &main();

sub main {

print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

if ( $command eq "stop" || $command eq "stopssh" ) {

my $exit_code = 1;

eval {

print "Disabling the VIP on old master: $orig_master_host \n";

&stop_vip();

$exit_code = 0;

};

if ($@) {

warn "Got Error: $@\n";

exit $exit_code;

}

exit $exit_code;

}

elsif ( $command eq "start" ) {

my $exit_code = 10;

eval {

print "Enabling the VIP - $vip on the new master - $new_master_host \n";

&start_vip();

$exit_code = 0;

};

if ($@) {

warn $@;

exit $exit_code;

}

exit $exit_code;

}

elsif ( $command eq "status" ) {

print "Checking the Status of the script.. OK \n";

exit 0;

}

else {

&usage();

exit 1;

}

}

sub start_vip() {

`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;

}

### A simple system call that disable the VIP on the old_master

sub stop_vip() {

`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;

}

sub usage {

print

"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";

}

#master宕机之后,VIP地址切换到新的主库

创建 MHA 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理 mysql 节点服务器

mkdir /etc/masterha

cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha

vim /etc/masterha/app1.cnf

全部删除内部的配置重新配置

[server default]

manager_log=/var/log/masterha/app1/manager.log

#manager的管理日志

manager_workdir=/var/log/masterha/app1

#manager的工作目录

master_binlog_dir=/usr/local/mysql/data

#保存master的二进制的位置,必须要和master保存的路径一致

master_ip_failover_script=/usr/local/bin/master_ip_failover

#设置自动切换脚本

master_ip_online_change_script=/usr/local/bin/master_ip_onli

ne_change

#手动切换脚本

password=manager

ping_interval=1

#监控主库发送ping包的时间间隔 1代表1秒 工作中一般3-6秒。会尝试3次之后会切换到failover脚本进行自动切换

remote_workdir=/tmp

#mysql在发生切换时,binlog的保存位置

repl_password=123456

#登录主库和从库的用户密码

repl_user=myslave

#用户名

secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.120.90?-s 192.168.120.100

#从和主之间互相监听,主服务器无需声明,但是从服务器需要在check之后声明

#从对主监听

shutdown_script=""

#设置切换时告警的脚本

ssh_user=root

#远程登录的用户名

user=mha

[server1]

hostname=192.168.120.80

#主服务器

port=3306

[server2]

candidate_master=1

#设置后选的master主库崩溃会切换到server2

check_repl_delay=0

#即使设置了权重,但是从服务器的relay_logs落后master100M,即使设置了权重也不会切换。通过设置0会忽略设置延迟复制,直接升为主.强制切换到设定为候选master的服务器。

hostname=192.168.120.90

#备用主服务器

port=3306

[server3]

hostname=192.168.120.100

#从服务器2

port=3306

测试ssh通信是否正常

masterha_check_ssh -conf=/etc/masterha/app1.cnf

#测试ssh通信主从之间免密登录是否正常

测试主从连接情况是否正常

masterha_check_repl-conf=/etc/masterha/app1.cnf

#测试主从连接情况是否正常

都显示ok表示MHA搭建完成!

模拟故障

nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

remove_dead_master_conf

#如果发生组从切换,老的主库的ip地址会从文件中删除

/var/log/masterha/app1/manager.log

#MHA的管理日志

-ignore_last_failover

#如果检测到连续发生宕机,而且宕机的事件间隔不足8小时,不会进行自动切换。忽略时间间隔只要发生故障,就会切换

cat /var/log/masterha/app1/manager.log | grep "current master"

在开一个20主机监控一下管理日志

tail -f /var/log/masterha/app1/manager.log

这时候停掉主MySQL

systemctl stop mysqld

然后到20查看日志

查看一下vip地址还在不在主库192.168.120.80上如果已经转移到主库192.168.120.90上代表切换成功。

开始故障恢复

进入MySQL1的my.cnf文件进行配置

vim /etc/my.conf

log_bin = master-bin

relay-log = relay-log-bin

relay-log-index = slave-relay-bin.index

#将MySQL1设为从

再进入MySQL2的my.cnf文件进行配置

vim /etc/my.conf

log_bin = master-bin

log-slave-updates=ture

#将MySQL2设置为新的主

进入manager主机

配置文件进行配置

vim /etc/masterha/app1.cnf

secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.120.80?-s 192.168.120.100

#声明从库的ip将192.168.120.90修改为192.168.120.80

[server1]

hostname=192.168.120.80

port=3306

#server1的ip改为80

[server2]

candidate_master=1

check_repl_delay=0

hostname=192.168.120.90

port=3306

#复制一个server2出来将ip改为90

修改完成后重启启动一下manager

nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

然后回到新的主MySQL192.168.12.90

重启MySQL服务

systemctl restart mysqld

进入MySQL

mysql -u root -p

查看一下偏移点

show master status;

再回到MySQL1

启动MySQL服务

进入MySQL

先停止slave服务

stop slave

进行配置

change master to master_host='192.168.120.90',

master_user='myslave',master_password='123456',

master_log_file='master-bin.000002',

master_log_pos=154;

#绑定新的主MySQL的ip和日志文件和偏移点

配置完成后

reset slave

start slave

#启动slave服务

查看一下slave的状态

show slave status\G

此时出现两个yes代表实验成功

进入新的主MySQL192.168.120.90

创建一个库

create database kgc2;

三台MySQL都能查看到代表实验成功

故障修复步骤:

1.修复mysql

systemctl restart mysqld

2.修复主从

#在现主库服务器 Mysql2 查看二进制文件和同步点

show master status;

#在原主库服务器 mysql1 执行同步操作

change master to master_host='192.168.120.90',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1747;

stop slave;

reset slave;

#一定要重置服务。

start slave;

修改原主的配置文件和新主的配置文件:

原主库修改:

server-id = 1

log_bin=master-bin

relay-log = relay-log_bin

relay-log-index = slave-relay_bin.index

新主库:

server-id = 2

log_bin=master-bin

log-slave-updates=true

systemctl restart mysqld

3.在 manager 节点上修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)

vim /etc/masterha/app1.cnf

......

secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.120.80?-s 192.168.120.100

......

[server1]

hostname=192.168.120.80

port=3306

[server2]

candidate_master=1

check_repl_delay=0

hostname=192.168.120.90

port=3306

[server3]

hostname=192.168.120.100

port=3306

4. 重启manager:

masterha_stop --conf=/etc/masterha/app1.cnf

nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

文章来源:https://blog.csdn.net/DDYYmmm/article/details/135046368
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。