目录

前言

一、MHA概念

二. MHA 的组成

三. MHA 的特点

四.工作流程

五.MHA 搭建过程

六.MYSQL于MHA的搭建

1.环境需求

2.关闭安全机制

3.mysql服务器配置

4.master、slave1、slave2分别做两个软链接用于恢复节点

5.配置一主两从进行授权

6.查看主节点的二进制配置文件

7.从服务器同步主服务器

8.所有从库开启只读功能

9.验证主从复制

10.安装MHA服务

11.所有服务器上配置无密码认证

12.配置MHA

13.修改配置文件

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

15.修改节点服务器的IP地址

16.测试manager连接情况

17.启动MHA

18.模拟故障

19.故障修复


前言

MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是日本的一位MySQL专家采用Perl语言编写的一个脚本管理工具,该工具仅适用于MySQLReplication(二层)环境,目的在于维持Master主库的高可用性。是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

一、MHA概念

MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。

MHA 的出现就是解决MySQL 单点的问题。

MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。

MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。

二. MHA 的组成

MHA Node(数据节点)
MHA Node 运行在每台 MySQL 服务器上。
MHA Manager(管理节点)
MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上。
MHA Manager 会定时探测集群中的 master 节点。当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master, 然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。

三. MHA 的特点

自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
目前MHA支持一主多从架构,最少三台服务,即一主两从

四.工作流程

首先主体是mysql的主从复制,mha服务核心为manager控制节点和node数据节点,mha会监控mysql的master和集群主从复制状态,如果master故障了,mha会触发“抢救保存”日志和进行VIP故障切换,切换到主-备节点上,并且调整mysql集群主-从之间指向关系,让mysql可以正常运行。

五.MHA 搭建过程

准备主从复制集群(至少是1主3从)
做软连接(mysql和mysqlbinlog)用于mha使用
在数据库内部进行授权(授权的用户角色包含:从服务器角色-用户主从复制 授权mha角色)
安装node数据节点和manager控制节点(node跑在mysql数据库服务器上)
定义VIP、VIP故障漂移脚本master_ip_failover
定义mha主配置:/etc/masterha/app1.conf
①mysql工作位置,例如二进制日志
②定义从服务器IP位置
③定义数据库集群每个节点的IP、端口,也可以手动指定主-备服务器是哪台cadidate_master=1
不做日志中时间的检查:check_rep1_delay=0
检测以下是否ok,然后启动mha

六.MYSQL于MHA的搭建

1.环境需求

master:192.168.10.20
slave1:192.168.10.30
slave2:192.168.10.40
mhamanager:192.168.10.50

2.关闭安全机制

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

3.mysql服务器配置

master:
开启二进制
log_bin = master-bin
允许从服务器同步
log-slave-updates = true

slave1与slave2相同:
开启中继模式
log_bin = master-bin
创建索引
relay-log = relay-log-bin
同步主服务器
relay-log-index = slave-realy-bin.index


重启
systemctl restart mysqld

4.master、slave1、slave2分别做两个软链接用于恢复节点

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



5.配置一主两从进行授权

在所有数据库节点上授权两个用户,一个是从库同步使用,另一个是manager使用
grant replication slave on *.* to 'myslave'@'192.168.10.%' identified by 'abc123'; 
grant all privileges on *.* to 'mha'@'192.168.10.%' identified by 'manager';
通过主机名形式进行监控,以通过mha检查,避免mysql主从报错
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

slave1和slave2

6.查看主节点的二进制配置文件

用于主从同步

7.从服务器同步主服务器

同步主服务器的二进制文件位置
change master to master_host='192.168.10.20',master_user='myslave',master_password='abc123',master_log_file='master-bin.000001',master_log_pos=2053;

开启与查看验证

8.所有从库开启只读功能

可以限定普通用户进行数据修改的操作,但不会限定具有super权限的用户的数据修改操作
set global read_only=1;

9.验证主从复制

master创建库one,从服务器是否同步



10.安装MHA服务

在所有服务器上安装MHA依赖环境
安装epel源,并且不进行gph检查
yum install epel-release --nogpgcheck -y

yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

所有环境安装node包
cd /opt      
tar zxvf /opt/mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install

manager 节点上安装 manager 组件
cd /opt
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install

查看生成的组件(manager和node)
vim /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

save_binary_logs                       保存和复制master的二进制日志
apply_diff_relay_logs                 识别差异的中继日志时间,并将其差异的事件应用于其他的slave
filter_mysqlbinlog                       去除不必要的ROLLBACK回滚事件(MHA 已不适用这个工具)
purge_relay_logs                        清除中继日志(不会阻塞 SQL线程)

11.所有服务器上配置无密码认证

manager与其他服务器配置相同

mannager上配置到所有数据库节点的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.10.20
ssh-copy-id 192.168.10.30
ssh-copy-id 192.168.10.40

master上配置到slave1和salve2的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.10.30
ssh-copy-id 192.168.10.40

slave1上配置到master和salve2的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.10.20
ssh-copy-id 192.168.10.40

slave2上配置到master和salve1的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.10.20
ssh-copy-id 192.168.10.30

12.配置MHA

在MHA节点上复制相关脚本到/usr/local/bin目录
cp -rp /root/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin

查看执行文件
ll /usr/local/bin/scripts/


master_ip_failover                     自动切换时 VIP管理的脚本
master_ip_online_change         在线切换时 VIP的管理
power_manager                          故障发生后关闭主机的脚本
send_report                                 因故障切换后发送报警的脚本

使用master_ip_failover脚本来管理 VIP 和故障切换
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

13.修改配置文件

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.10.100';                           #指定vip的IP地址
my $brdc = '192.168.10.255';                          #指定vip广播地址
my $ifdev = 'ens33';                                  #指定vip绑定的网卡
my $key = '1';                                        #指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; #代表此变量值为ifconfig ens33:1 192.168.10.100            
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";  #代表此变量值为ifconfig ens33:1 192.168.10.100 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,
#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";
}

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

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

15.修改节点服务器的IP地址

echo '' > /etc/masterha/app1.cnf
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=/home/mysql/data                            master保存binlog的位置,这里的路径要与master里配置的binlog的路径一致,以便MHA能找到

master_ip_failover_script=/usr/local/bin/master_ip_failover     故障转移切换的工具#设置自动failover时候的切换脚本,也就是上面的那个脚本

master_ip_online_change_script=/usr/local/bin/master_ip_online_change  设置手动切换时候的切换脚本

password=manager      设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码

ping_interval=1             设置监控主库,发送ping包的时间间隔1秒,默认是3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/tmp         设置远端mysql在发生切换时binlog的保存位置
repl_password=abc123      设置复制用户的密码
repl_user=myslave              设置发生切换后发送的报警的脚本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.10.30 -s 192.168.10.40
shutdown_script=""            设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root                     设置ssh的登录用户名
user=mha                             设置监控用户root

[server1]
hostname=192.168.10.20
port=3306

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

[server3]
hostname=192.168.10.40
port=3306

16.测试manager连接情况

在master节点上手动开启vip的虚拟IP
ifconfig ens33:1 192.168.10.100/24
masterha_check_ssh -conf=/etc/masterha/app1.cnf

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

17.启动MHA

18.模拟故障

master上停止mysql服务
HMA 会自动修改 app1.cnf 文件内容,将宕机的 master 节点删除

查看slave1是否接管master(ip飘逸)

19.故障修复

开启mster
修复主从


源master执行

添加源masterip

在 manager 节点上启动 MHA 
1.masterha_stop --conf=/etc/masterha/app1.cnf
2.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 &
2.masterha_check_status --conf=/etc/masterha/app1.cnf

MySQL MHA高可用相关推荐

  1. mysql mha配置文件详解_十四、MySQL MHA 高可用配置(一)

    MHA 高可用 1.准备三台机器 IP:10.0.0.51 主机名:db01 内存:2G IP:10.0.0.52 主机名:db02 内存:2G IP:10.0.0.53 主机名:db03 内存:2G ...

  2. MySQL MHA 高可用架构

    2019独角兽企业重金招聘Python工程师标准>>> MySQL MHA   项目的地址:https://code.google.com/p/mysql-master-ha/,这个 ...

  3. mysql MHA高可用架构安装

    是什么(是一个软件) MHA(Master High Availability)是MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完 ...

  4. MySQL服务MySQL+MHA高可用服务集群搭建

    MySQL MHA MySQL MHA 一.MHA概念 1.MHA 的组成 2.MHA 的特点 二.搭建MySQL+MHA 1.所有服务器,关闭系统防火墙和安全机制 2.修改 master(192.1 ...

  5. MySQL MHA高可用架构官方文档全文翻译

    目录 MHA项目官方github地址 关于MHA 概述 主故障切换的难点 现有的解决方案和问题 MHA的架构 MHA的优势 使用案例 其他高可用解决方案和问题 纯手动解决 单主单从 一个主节点.一个备 ...

  6. MySQL MHA高可用集群部署及故障切换(图文详解)

    文章目录 MySQL MHA 一.MHA概念 1.MHA 的组成 2.MHA 的特点 二.搭建MySQL+MHA 实验思路 实验环境.安装包 1.所有服务器,关闭系统防火墙和安全机制 2.修改 mas ...

  7. Mysql+MHA高可用集群

    http://www.ttlsa.com/mysql/step-one-by-one-deploy-mysql-mha-cluster/ 转载于:https://www.cnblogs.com/cci ...

  8. 理论+实验·MHA高可用配置及故障切换

    这里写目录标题 MHA概述 安装MySQL数据库 配置MySQL一主两从 安装MHA软件 配置无密码认证 配置MySQL-MHA高可用 六.模拟 master 故障切换 MHA概述 传统的MySQL主 ...

  9. MHA高可用配置及故障切换——实验+理论!!!

    文章目录 一.MHA高可用配置 1.什么是MHA 2.MHA的组成 3.为什么使用MHA? 3.1 问题 3.2 解决办法 4.MHA特点 二.MHA案例 1.案例拓扑图 2.案例思路 3.环境 4. ...

最新文章

  1. 如何避免APK文件的反向工程?
  2. Bootstrap table方法,Bootstrap table事件,配置
  3. 深入场景洞察用户 诸葛io决胜2017国际黑客松大赛
  4. LeetCode 2212. 射箭比赛中的最大得分(状态枚举)
  5. 年轻人如何做好自己的人生规划?
  6. android app启动过程(转)
  7. 知乎:“我们不主动收集数据”;滴滴被打乘客怂了;三星太子归位 | CSDN极客头条...
  8. 蓝牙模块耳机做蓝牙透传_WiFi、蓝牙在工业领域的数据透传应用_SKYLAB 无线模块...
  9. Java简易开发环境搭建
  10. poj3254 状态压缩dp
  11. 漂亮女生应聘华为的真实过程
  12. 全球近百所名校课件网络版
  13. 设计模式(一):代理模式
  14. JAVA压缩/解压ZIP/7Z文件(by Apache Commons Compress)
  15. 删除下拉框只找23火星软件_删除下拉框速来火星下拉,删除下拉框就推92火星软件...
  16. 内存带宽stream测试
  17. 如何使用pr制作视频人物运动残影特效
  18. 如何设置需要密码才能访问的共享文件夹?
  19. 创意设计:带自动喂鱼的鱼缸自动控制系统设计与制作 单片机程序 原理图 源代码
  20. peopleSoft常见错误诊断

热门文章

  1. python中进程间通信方式总结
  2. 品牌如何借助江湖老大“音乐记忆”做宣传?
  3. mycat学习笔记3:分库分表
  4. 无意中发现了一位北大妹子的Java仓库
  5. jQuery常见方法汇总
  6. C# 自定义事件(EventArgs)
  7. C# 函数中(object sender, EventArgs e)参数是什么意思
  8. 重写EventArgs实现数据传递(C#)
  9. Python 强制类型转换
  10. 暑期2020“大咖说开源”之吴晟 | 如何做一个开源玩家