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) |
---|---|---|---|
manager | 192.168.131.14 | manager管理节点 | manager组件,MHA node 组件 |
master | 192.168.131.9 | mysql主数据库 | MHA node 组件 |
slave1 | 192.168.131.10 | mysql从数据库 | MHA node 组件 |
slave2 | 192.168.131.11 | mysql从数据库 | 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 5月 31 2015 master_ip_failover 【自动切换时VIP管理的脚本】
-rwxr-xr-x. 1 1001 1001 9870 5月 31 2015 master_ip_online_change 【在线切换时VIP的管理】
-rwxr-xr-x. 1 1001 1001 11867 5月 31 2015 power_manager 【故障发生后关闭主机的脚本】
-rwxr-xr-x. 1 1001 1001 1360 5月 31 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(理论+部署+故障模拟)的主要内容,如果未能解决你的问题,请参考以下文章