MySQL高可用架构之MHA(理论+部署+故障模拟)

Posted TaKe___Easy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL高可用架构之MHA(理论+部署+故障模拟)相关的知识,希望对你有一定的参考价值。

MHA高可用配置及故障切换

一、MHA概述

  • MHA(Master HA)是一款开源的 mysql 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。
  • MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的master 节点,在此期间,MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题。
  • MHA 还提供了 master 节点的在线切换功能,即按需切换 master/slave 节点。
  • MHA 能够在30秒内实现故障切换,并能在故障切换中,最大可能的保证数据一致性。

二、MHA服务组成

2.1 MHA Manager(管理节点)

  • 通常单独部署在一台独立机器上管理多个 master/slave 集群(组),每个 master/slave 集群称作一个 application,用来管理统筹整个集群。

2.2 MHA Node(数据节点)

  • 运行在每台 MySQL 服务器上(master/slave/manager),通过监控具备解析和清理 logs 功能的脚本来加快故障转移。
  • 主要是接收管理节点所发出指令的代理,代理需要运行在每一个 mysql 节点上。
  • 简单讲 node 就是用来收集从节点服务器上所生成的 bin-log 。
  • 对比打算提升为新的主节点之上的从节点的是否拥有并完成操作,如果没有发给新主节点在本地应用后提升为主节点。

三、MHA工作原理及特点

  • ①从宕机崩溃的 master 保存二进制日志事件(binlog events)
  • ②识别含有最新更新的 slave
  • ③应用差异的中继日志(relay log) 到其他 slave
  • ④应用从 master 保存的二进制日志事件(binlog events)
  • ⑤提升一个 slave 为新 master
  • ⑥使用其他的 slave 连接新的 master 进行复制
  • MHA特点
    • 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,从而最大成都的保证数据不丢失
    • 使用半同步复制,可以大大降低数据丢失的风险
    • 目前MHA支持一主多从架构,最少三台服务器,即一主两从

四、MHA搭建及故障模拟

4.1 搭建环境

主机名IP地址角色所有安装软件包(MHA)
manager192.168.131.14manager管理节点manager组件,MHA node 组件
master192.168.131.9mysql主数据库MHA node 组件
slave1192.168.131.10mysql从数据库MHA node 组件
slave2192.168.131.11mysql从数据库MHA node 组件

4.2 部署思路

  • 安装MySQL数据库
  • 配置MySQL一主两从
  • 安装MHA软件
  • 配置MySQL MHA高可用
  • 模拟master故障切换

4.3 安装MySQL数据库与主从同步

  • 关闭防火墙及修改主机名(master、salve1、salve2、mha)
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# systemctl disable firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su
[root@master ~]# 
  • 编译依赖环境与amake编译工具安装(三台MySQL服务器)
【将安装包分别拖进三台需装MySQL的服务器(一主两从)】
[root@master opt]# ls
cmake-2.8.6.tar.gz  mysql-5.6.36.tar.gz  rh
[root@slave1 opt]# ls
cmake-2.8.6.tar.gz  mysql-5.6.36.tar.gz  rh
[root@slave2 opt]# ls
cmake-2.8.6.tar.gz  mysql-5.6.36.tar.gz  rh

[root@localhost ~]# yum -y install ncurses-devel.x86_64 gcc-c++.x86_64 perl-Module-Install
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
cmake-2.8.6.tar.gz  mysql-5.6.36.tar.gz  rh
[root@localhost opt]# tar zxvf cmake-2.8.6.tar.gz 
[root@localhost opt]# cd cmake-2.8.6/
[root@localhost cmake-2.8.6]# ./configure 
[root@localhost cmake-2.8.6]# gmake && gmake install
  • 安装MySQL5.6
[root@localhost cmake-2.8.6]# cd /opt/
[root@localhost opt]# tar zxvf mysql-5.6.36.tar.gz 
[root@localhost opt]# cd mysql-5.6.36/
[root@localhost mysql-5.6.36]# cmake \\
> -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \\
> -DDEFAULT_CHARSET=utf8 \\
> -DDEFAULT_COLLATION=utf8_general_ci \\
> -DEXTRA_CHARSETS=all \\
> -DSYSCONFIDIR=/etc
[root@localhost mysql-5.6.36]# make -j6 && make install
  • 复制启动脚本与配置文件
/etc/init.d/:各种服务器和程序的二进制文件存放目录】
【/etc/rc.d/:各个启动级别的执行程序连接目录。里面很多文件都是指向init.d/的一些软链接】
[root@localhost mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf
cp:是否覆盖"/etc/my.cnf"? y
[root@localhost mysql-5.6.36]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@localhost mysql-5.6.36]# chmod +755 /etc/rc.d/init.d/mysqld 
[root@localhost mysql-5.6.36]# chkconfig --add /etc/init.d/mysqld 
[root@localhost mysql-5.6.36]# chkconfig mysqld --level 35 on
[root@localhost mysql-5.6.36]# echo 'PATH=$PATH:/usr/local/mysql/bin'>> /etc/profile
[root@localhost mysql-5.6.36]# source /etc/profile
[root@localhost mysql-5.6.36]# useradd -s /sbin/nologin mysql
[root@localhost mysql-5.6.36]# chown -R mysql.mysql /usr/local/mysql/
  • MySQL_install_db初始化(目录文件basedir和数据文件datadir都必须有)
[root@localhost mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db \\
> --basedir=/usr/local/mysql \\
> --datadir=/usr/local/mysql/data/ \\
> --user=mysql

【报错的话则安装autoconf库】
[root@localhost mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
Data::Dumper
[root@localhost mysql-5.6.36]# yum -y install autoconf
  • 修改master的主配置文件
[root@localhost mysql-5.6.36]# vim /etc/my.cnf
 30 server-id=10
 31 log_bin=master-bin
 32 log-slave-updates=true
  • 配置从服务器
[root@localhost mysql-5.6.36]# vim /etc/my.cnf
 30 server-id=20
 31 log_bin=master-bin
 32 relay-log=relay-log-bin
 33 relay-log-index=slave-realy-bin.index


【从服务器2[root@localhost mysql-5.6.36]# vim /etc/my.cnf
 30 server-id=30
 31 log_bin=master-bin
 32 relay-log=relay-log-bin
 33 relay-log-index=slave-realy-bin.index
  • 在master和两台slave上分别做两个软链接
[root@localhost mysql-5.6.36]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@localhost mysql-5.6.36]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
【第一个是mysql命令文件】
【第二个是mysqlbinlog可用于断点恢复】
  • 开启服务并查看端口
[root@localhost mysql-5.6.36]# systemctl start mysqld
[root@localhost mysql-5.6.36]# netstat -natp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      40198/mysqld  
  • 配置MySQL一主两从
[root@localhost mysql-5.6.36]# mysqladmin -uroot -p password '5514'  【设置密码】
[root@localhost mysql-5.6.36]# mysql -uroot -p5514


【在所有数据库节点上授权两个用户,一个是从库同步使用,一个是manager使用】
mysql> grant replication slave on *.* to 'myslave'@'192.168.131.%' identified by '111222';  【从数据库同步使用】
mysql> grant all privileges on *.* to 'mha'@'192.168.131.%' identified by 'manager';        【manager使用】

【下面三条授权是为了实验MHA检查MySQL主从报错才添加,防止从库通过主机名连接不上主库】
mysql> grant all privileges on *.* to 'mha'@'master' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
mysql> flush privileges;



【在Master上查看二进制文件和同步点】
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000002 |     1720 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+



【在两台slave节点服务器进行同步】
mysql> change master to master_host='192.168.131.9',master_user='myslave',master_password='111222',master_log_file='master-bin.000002',master_log_pos=1720;
mysql> start slave;
mysql> show slave status\\G;
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes



【设置两个从库为只读模式(必改项)】
mysql> set global read_only=1;
mysql> flush privileges;

4.4 配置MHA

  • 在所有服务器上安装MHA依赖环境(需先安装epel源)
【安装epel源,并且不进行gph检查】
[root@localhost ~]# yum -y install epel-release --nogpgcheck

[root@localhost /]# yum install -y perl-DBD-MySQL \\   【perl针对于mysql数据库】
> perl-Config-Tiny \\                                  【从配置文件中提拿其中的值】
> perl-Log-Dispatch \\                                 【log-日志】
> perl-Parallel-ForkManager \\                         【多线程管理】
> perl-ExtUtils-CBuilder \\                            【扩展工具CBuilder MakeMaker】
> perl-ExtUtils-MakeMaker \\
> perl-CPAN                                           【cpan perl中的数据库】
  • 所有节点安装node组件
  • 在所有服务器上必须先安装node组件,最后在MHA-manager节点上安装manager组件(因为manager依赖node组件)
[root@localhost opt]# ls
cmake-2.8.6  cmake-2.8.6.tar.gz  mha4mysql-node-0.57.tar.gz  mysql-5.6.36  mysql-5.6.36.tar.gz  rh
[root@localhost opt]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@localhost opt]# cd mha4mysql-node-0.57
[root@localhost mha4mysql-node-0.57]# perl Makefile.PL
[root@localhost mha4mysql-node-0.57]# make && make install
  • 在MHA节点上安装manager组件
  • 必须先安装node才能安装manager组件
[root@localhost opt]# ls
mha4mysql-manager-0.57.tar.gz  mha4mysql-node-0.57  mha4mysql-node-0.57.tar.gz  rh
[root@localhost opt]# tar zxvf mha4mysql-manager-0.57.tar.gz
[root@localhost opt]# cd mha4mysql-manager-0.57
[root@localhost mha4mysql-manager-0.57]# perl Makefile.PL
[root@localhost mha4mysql-manager-0.57]# make && make install

4.5 manager和node安装后生成的常用脚本和工具

[root@localhost mha4mysql-manager-0.57]# ls /usr/local/bin/
apply_diff_relay_logs  json_pp              masterha_check_status  masterha_master_monitor   masterha_stop            purge_relay_logs
config_data            masterha_check_repl  masterha_conf_host     masterha_master_switch    package-stash-conflicts  save_binary_logs
filter_mysqlbinlog     masterha_check_ssh   masterha_manager       masterha_secondary_check  prove
  • manager安装后会在/usr/local/bin目录下生成几个工具,主要包括
工具说名
masterha_check_ssh检查MHA的SSH配置状况
masterha_check_repl检查MySQL复制状况
masterha_manager启动manager脚本
masterha_check_status检查当前MHA运行状态
masterha_master_monitor检查master是否宕机
masterha_master_switch控制故障转移(手动或自动)
masterha_conf_host添加或删除配置的server信息
masterha_stop关闭manager
  • node安装后会在/usr/local/bin目录下生成几个脚本,需要进行检查,主要包括
脚本说明
save_binary_logs保存和复制master的二进制日志
apply_diff_relay_logs识别差异的中继日志事件,并将其差异的事件应用于其他的slave
filter_mysqlbinlog去除不必要的rollback回滚事件(MHA已不适用这个工具)
purge_relay_logs清除中继日志(不会阻塞SQL线程)

4.6 配置无密码认证

  • 在mannager上配置到所有数据库节点的无密码认证
【全部直接回车确认进入下一步】
[root@localhost mha4mysql-manager-0.57]# ssh-keygen -t rsa
[root@localhost mha4mysql-manager-0.57]# ssh-copy-id 192.168.131.9
【按完yes后需输入ssh登录密码5514[root@localhost mha4mysql-manager-0.57]# ssh-copy-id 192.168.131.10
[root@localhost mha4mysql-manager-0.57]# ssh-copy-id 192.168.131.11
  • 在master上配置到slave1和salve2的无密码认证
[root@localhost mha4mysql-node-0.57]# ssh-keygen -t rsa
[root@localhost mha4mysql-node-0.57]# ssh-copy-id 192.168.131.10
[root@localhost mha4mysql-node-0.57]# ssh-copy-id 192.168.131.11
  • 在slave1上配置到master和salve2的无密码认证
[root@localhost mha4mysql-node-0.57]# ssh-keygen -t rsa
[root@localhost mha4mysql-node-0.57]# ssh-copy-id 192.168.131.9
[root@localhost mha4mysql-node-0.57]# ssh-copy-id 192.168.131.11
  • 在slave2上配置到master和salve1的无密码认证
[root@localhost mha4mysql-node-0.57]# ssh-keygen -t rsa
[root@localhost mha4mysql-node-0.57]# ssh-copy-id 192.168.131.9
[root@localhost mha4mysql-node-0.57]# ssh-copy-id 192.168.131.10

4.7 修改MHA相关配置

  • 在mha节点上复制相关脚本到/usr/local/bin目录
[root@localhost mha4mysql-manager-0.57]# cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
【拷贝后查询会有四个执行文件】
[root@localhost mha4mysql-manager-0.57]# ll /usr/local/bin/scripts/
总用量 32
-rwxr-xr-x. 1 1001 1001  3648 531 2015 master_ip_failover          【自动切换时VIP管理的脚本】
-rwxr-xr-x. 1 1001 1001  9870 531 2015 master_ip_online_change     【在线切换时VIP的管理】
-rwxr-xr-x. 1 1001 1001 11867 531 2015 power_manager               【故障发生后关闭主机的脚本】
-rwxr-xr-x. 1 1001 1001  1360 531 2015 send_report                 【因故障切换后发送报警的脚本】

【再将master_ip_failover复制到/usr/local/bin/目录】
[root@localhost mha4mysql-manager-0.57]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
  • 修改master_ip_failover内容(删除原有内容,直接添加)
[root@localhost mha4mysql-manager-0.57]# 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.131.100';                              【浮动IP】
my $brdc = '192.168.131.255';                             【广播地址】
my $ifdev = 'ens33';                                      【使用的网卡为ens33】
my $key = '1';                                            【国际序列号】
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";     【使用ifoconfig命令将其启动,同时设置浮动地址】
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";      【可以使用ifconfig命令将其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 ( 

以上是关于MySQL高可用架构之MHA(理论+部署+故障模拟)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL高可用之MHA理论章节

MySQL高可用之MHA—部署MHA

MySQL 高可用之MHA

MySQL高可用架构之MHA

Linux云计算-MySQL-高可用集群架构-MHA 架构

MHA高可用集群部署