MHA高可用配置理论加实验

MHA概述:

什么是MHA?
●日本DeNA公司 youshimaton(现就职于 Facebook公司)开发

●一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件
支持故障切换

●在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用

●MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为主库),大概0.5-2秒内即可完成

MHA的组成

●MHA Manager(管理节点)

  • 用来接收外部信号,监控下方数据节点的工作状态

●MHA Node(数据节点)

  • 工作的单位,负责具体的工作

MHA特点

●自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失
●使用 MySQL55的半同步复制,可以大大降低数据丢失的风险
●目前MHA支持一主多从架构,最少三台服务器,即一主两从

MHA形成的原因

在这里插入图片描述
●传统架构中,只有一个mysql主服务器,所以当出现单点故障的时候,整个服务器群集就会瘫痪掉

●为了解决这种情况,我们需要在主服务器宕机的时候,重新建立一台主服务器,负责监控等工作

MHA实验

实验环境

这边服务器安装的是Mysql5.6版本的
主服务器IP地址:192.168.148.135
主/备服务器IP地址:192.168.148.136
从服务器IP地址:192.168.148.137
manager服务器IP地址:192.168.148.131
在这里插入图片描述

推荐步骤

手工编译安装mysql5.6这边三个mysql服务器都是一样的步骤,编译安装
1.先用xftp将mysql5.6版本工具和MHA工具拷贝到/root家目录下
在这里插入图片描述
2.修改主机名为mysql1(主);mysql2(主/备);mysql3(从) manager方便区分
在这里插入图片描述
3.安装mysql5.6版本的环境包

[root@mysql1 opt]# yum -y install ncurses-devel gcc-c++ perl-Module-Install

在这里插入图片描述
4.安装gmake编译工具

[root@mysql1 opt]# tar zxvf cmake-2.8.6.tar.gz             ##解压cmake安装包
[root@mysql1 opt]# cd cmake-2.8.6
[root@mysql1 cmake-2.8.6]# ./configure             
[root@mysql1 cmake-2.8.6]# gmake&&gmake install         ##编译;编译安装

在这里插入图片描述
5.安装mysql数据库

[root@mysql1 ~]# tar zxvf mysql-5.6.36.tar.gz             ##解压工具包
[root@mysql1 ~]# cd mysql-5.6.36/
[root@mysql1 mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
> -DDEFAULT_CHARSET=utf8 \               ##字符集
> -DDEFAULT_COLLATION=utf8_general_ci \
> -DWITH_EXTRA_CHARSETS=all \
> -DSYSCONFDIR=/etc                           ##配置文件放的位置

在这里插入图片描述

[root@mysql1 mysql-5.6.36]# make && make install      ##编译安装
[root@mysql1 mysql-5.6.36]# cp support-files/my-default.cnf  /etc/my.cnf
cp:是否覆盖"/etc/my.cnf"? yes           ##覆盖原文件,将启动脚本放入;便于server管理
[root@mysql1 mysql-5.6.36]# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld
[root@mysql1 mysql-5.6.36]# chmod +x /etc/rc.d/init.d/mysqld      ##添加执行权限
[root@mysql1 mysql-5.6.36]# chkconfig --add mysqld
[root@mysql1 mysql-5.6.36]# echo "PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile    ##声明环境变量;让命令能够被识别
[root@mysql1 mysql-5.6.36]# source /etc/profile
[root@mysql1 mysql-5.6.36]# groupadd mysql        ##创建mysql组
[root@mysql1 mysql-5.6.36]# useradd -M -s /sbin/nologin mysql -g mysql   ##创建Mysql用户
[root@mysql1 mysql-5.6.36]# chown -R mysql.mysql /usr/local/mysql     ##给安装目录执行权限
[root@mysql1 mysql-5.6.36]# mkdir -p /data/mysql          ##创建数据文件存放的位置
[root@mysql1 mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db \     ##初始化数据库
> --basedir=/usr/local/mysql \
> --datadir=/usr/local/mysql/data \
> --user=mysql

在这里插入图片描述
到此数据库已经安装好了;这边举了一个主的mysql服务器的编译过程;其他两台步骤都是一样的
6.修改Master的主配置文件/etc/my.cnf文件,三台服务器的server-id不能一样

[root@mysql1 mysql-5.6.36]# vim /etc/my.cnf
server-id = 1    
log_bin = master-bin     ##开启二进制日志
log-slave-updates = true

在这里插入图片描述
配置从服务器
主/备服务器:mysql2

[root@mysql2 mysql-5.6.36]# vim /etc/my.cnf
server-id = 2
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

从服务器:mysql3

[root@mysql3 mysql-5.6.36]# vim /etc/my.cnf
server-id = 3
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

7.Mysql1 ;2; 3分别做两个软链接(这边举了主服务器的例子)

[root@mysql1 mysql-5.6.36]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/      ##命令建立软链接
[root@mysql1 mysql-5.6.36]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/     ##日志文件命令,建立软链接

8.Mysql1 ;2; 3都启动mysql;查看端口是否开启;
主服务器:
在这里插入图片描述
主/备服务器:
在这里插入图片描述
从服务器:
在这里插入图片描述
9.配置mysql(三个都要配置)一主两从,在所有数据库节点上授权两个用户,一个从库同步使用,另一个是manager使用

[root@mysql1 mysql-5.6.36]# mysql -uroot -p      ##登录数据库
mysql> grant replication slave on *.* TO 'myslave'@'192.168.148.%' IDENTIFIED BY '123456';    ##主从同步使用
mysql> grant all privileges on *.* to 'mha'@'192.168.148.%' identified by 'manager';  ##给MHA权限让对方监管mysql
mysql> flush privileges;        ##刷新

注意:下面三条授权按理论是不用添加的,但是做案例实验环境时候通过MHA检查MySQL主从有报错,会报两个从库通过主机名连接不上主库,所以所有数据库加上下面的授权。

mysql> grant all privileges on *.* to 'mha'@'mysql1' identified by 'manager';    ##主服务器主机名
mysql> grant all privileges on *.* to 'mha'@'mysql2' identified by 'manager';    ##主从服务器主机名
mysql> grant all privileges on *.* to 'mha'@'mysql3' identified by 'manager';      ##从服务器主机名
mysql> flush privileges;

10.在主服务器上查看二进制文件和同步位置点;并且在从服务器上执行同步
在这里插入图片描述
接下来在Mysql2和Mysql3分别执行同步(举里一个例子)

mysql> change master to master_host='192.168.148.135',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1294;
mysql> flush privileges;
mysql> start slave;   ##开启同步功能
mysql> show slave status\G;    ##查看是否开启

在这里插入图片描述
从服务器:
在这里插入图片描述
注意:必须设置两个从库为只读模式

mysql> set global read_only=1;          ##设置为只读
mysql> flush privileges;

这时可以创建一个库去验证主从同步是否有问题;
主服务器创建一个库

mysql> create database shcool;
Query OK, 1 row affected (0.00 sec)

从服务器mysql1
在这里插入图片描述
从服务器mysql2
在这里插入图片描述
验证成功

安装MHA软件:
1.所有服务器都需要安装MHA的依赖环境包

[root@mysql3 mysql-5.6.36]# yum -y install epel-release --nogpgcheck  
安装perl环境包
[root@master mysql-5.6.36]# yum install -y perl-DBD-MySQL \     ##连接数据库包
    perl-Config-Tiny \       ##配置文件         
    perl-Log-Dispatch \       ##日志文件
    perl-Parallel-ForkManager \      ##管理框架
    perl-ExtUtils-CBuilder \          ##构建包
    perl-ExtUtils-MakeMaker \          ##make包
perl-CPAN              ##函数库

2.MHA 软件包对于每个操作系统版本不一样,这里CentOS7.4必须选择0.57版本,在<注意:所有服务器>上必须先安装node组件,最后在MHA-manager节点上安装manager组件,因为manager依赖node组件,下面都是在Mysql1上操作演示安装node组件。

[root@mysql1 ~]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@mysql1 ~]# cd mha4mysql-node-0.57/
[root@mysql1 mha4mysql-node-0.57]# perl Makefile.PL    ##用perl去配置
[root@mysql1 mha4mysql-node-0.57]# make
[root@mysql1 mha4mysql-node-0.57]# make install
这边操作所有服务器都需要安装的

3.在manager服务器上安装manager组件

[root@manager ~]# tar zxvf mha4mysql-manager-0.57.tar.gz
[root@manager ~]# cd mha4mysql-manager-0.57/
[root@manager mha4mysql-manager-0.57]# perl Makefile.PL
[root@manager mha4mysql-manager-0.57]# make&&make install

4.检查生成的配置文件
在这里插入图片描述

masterha_check_ssh检查MHA 的SSH 配置状况
masterha_check_repl检查MySQL复制状况
masterha_manger启动manager的脚本
masterha_check_status检测当前MHA运行状态
masterha master_monitor检测master是否宕机
masterha_master_switch控制故障转移(自动或者手动)
masterha_conf_host添加或删除配置的server信息
masterha stop 关闭manager
node安装后也会在/usr/local/bin下面会生成几个脚本(这些工具通常由MHA
Manager的脚本触发,无需人为操作)主要如下:
save_binary_logs保存和复制master的二进制日志
apply_diff_relay_logs识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs清除中继日志(不会阻塞SQL线程)

5.配置无密码认证
1.在manager上配置到所有数据库节点的无密码认证

[root@manager mha4mysql-manager-0.57]# ssh-keygen -t rsa   ##一路回车

在这里插入图片描述
[root@manager mha4mysql-manager-0.57]# ssh-copy-id 192.168.148.135 ##推给主服务器
在这里插入图片描述

[root@manager mha4mysql-manager-0.57]# ssh-copy-id 192.168.148.136    ##推给主/从服务器
[root@manager mha4mysql-manager-0.57]# ssh-copy-id 192.168.148.137    ##推给从服务器

2.在主服务器mysql1上配置到数据库节点主/备服务器和从服务器的无密码认证

[root@mysql1 ~]# ssh-keygen -t rsa  
[root@mysql1 ~]# ssh-copy-id 192.168.148.136         ##给主/备服务器的
[root@mysql1 ~]# ssh-copy-id 192.168.148.137         ##给从服务器的

3.在主/备服务器mysql2上配置到数据库节点主服务器和从服务器的无密码认证

[root@mysql2 ~]# ssh-keygen -t rsa
[root@mysql2 ~]# ssh-copy-id 192.168.148.135        ##给主服务器的
[root@mysql2 ~]# ssh-copy-id 192.168.148.137        ##给从服务器的

4.在从服务器mysql3上配置到数据库节点主服务器和主/备服务器的无密码认证

[root@mysql3 ~]# ssh-copy-id 192.168.148.135        ##给主服务器的
[root@mysql3 ~]# ssh-copy-id 192.168.148.136        ##给主/备服务器的

5.配置MHA
1.在manager节点上复制相关脚本到/usr/local/bin目录

[root@manager ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin/
[root@manager ~]# ls /usr/local/bin/

在这里插入图片描述
[root@manager ~]# cd /usr/local/bin/scripts/
在这里插入图片描述
2.复制上述的自动切换时VIР管理的脚本到/usr/local/bin目录,这里使用脚本管理VIP

[root@manager scripts]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

3.修改内容如下:(删除原有内容,直接复制)

[root@manager scripts]# vim /usr/local/bin/master_ip_failover
#!/usr/bin/env perl
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.148.200';   //这里改成你同网段的一个未使用的ip作为虚拟ip
my $brdc = '192.168.148.255';   //虚拟ip的广播地址
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
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";
}

4.创建MHA软件目录并拷贝配置文件

[root@manager scripts]# mkdir /etc/masterha
[root@manager scripts]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha
[root@manager scripts]# cp master_ip_online_change /usr/local/bin/
[root@manager scripts]# cp send_report /usr/local/
[root@manager scripts]# vim /etc/masterha/app1.cnf
[server default]
'#manager配置文件'
manager_log=/var/log/masterha/app1/manager.log
'#manager日志'
manager_workdir=/var/log/masterha/app1
'#master保存binlog的位置,这里的路径要与master里配置的bilog的相同'
master_binlog_dir=/usr/local/mysql/data
'#设置自动failover时候的切换脚本。也就是上边的那个脚本'
master_ip_failover_script=/usr/local/bin/master_ip_failover
'#设置手动切换时候的切换脚本'
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
'#这个密码是前文中创建监控用户的那个密码'
password=manager
ping_interval=1
remote_workdir=/tmp
'#设置复制用户密码'
repl_password=123456
'#设置复制用户的用户'
repl_user=myslave
'#设置发生切换后发生报警的脚本'
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.148.136 -s 192.168.148.137
'#指向两个从服务器的IP地址'
#shutdown script=""
ssh_user=root
user=mha
[server1]
hostname=192.168.148.135
port=3306

[server2]
hostname=192.168.148.136
port=3306
candidate_master=1
check_repl_delay=0

[server3]
hostname=192.168.148.137
port=3306

添加这段内容
5.测试ssh无密码认证,如果正常最后会输出successfully

[root@manager scripts]# masterha_check_ssh -conf=/etc/masterha/app1.cnf

在这里插入图片描述
验证主从复制
在这里插入图片描述
6.在主服务器上启动虚拟IP

[root@mysql1 ~]# /sbin/ifconfig ens33:1 192.168.148.200/24

7.在manager上启动MHA,将宕机的master移除,并且忽略掉,将信息导入到null当中

[root@manager bin]# 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 &
[1]13286

验证:
1.查看当前master的节点

[root@manager bin]# masterha_check_status --conf=/etc/masterha/app1.cnf

在这里插入图片描述
查看浮动IP是否在
在这里插入图片描述
2.模拟故障,将主服务器的mysql服务断掉

[root@mysql1 ~]# pkill -9 mysql

在这里插入图片描述
3.这时再次查看地址,发现虚拟IP地址不见了
在这里插入图片描述
4.IP地址飘到了主备服务器上;主备服务器变成了主的服务器
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Cpureman/article/details/108297604