文章目录

  • 前言
  • 一:MHA概述
    • 1.1:什么是MHA?
    • 1.2:MHA的组成
    • 1.3:MHA有什么特点?
    • 1.4:MHA形成的原因
  • 二:MHA实验
    • 2.1:实验环境
    • 2.2:拓扑图
    • 2.3:实验目的
    • 2.4:实验过程
      • 2.4.1:安装gmake编译软件
      • 2.4.2:搭建mysql主从复制环境
      • 2.4.3:所有节点安装环境和Node组件和Manager组件
      • 2.4.4:配置节点间SSH面交互登陆
      • 2.4.5:配置MHA-Manager组件
      • 2.4.6:测试SSH与mysql主从连接
      • 2.4.7:配置虚拟IP,启动MHA
      • 2.4.8:模拟故障
    • 2.5:实验验证
      • 2.5.1:主服务器变更成功
      • 2.5.2:尝试从客户端通过虚拟IP连接上数据库

前言

  • MHA目前在MySQL高可用方面是一个相对成熟的解决方案
  • 但是在搭建的过程中会经常报错,且MHA的构建综合了主从复制,所以MHA的安装要思路清晰才可

一:MHA概述

1.1:什么是MHA?

  • 日本DeNA公司 youshimaton(现就职于 Facebook公司)开发
  • 一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件
  • 支持故障切换
  • 在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用
  • MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为主库),大概0.5-2秒内即可完成

1.2:MHA的组成

  • MHA Manager(管理节点)

    • 用来接收外部信号,监控下方数据节点的工作状态
  • MHA Node(数据节点)
    • 工作的单位,负责具体的工作

1.3:MHA有什么特点?

  • 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失
  • 使用 MySQL55的半同步复制,可以大大降低数据丢失的风险

1.4:MHA形成的原因

  • 传统mysql主从架构存在单点故障的问题
  • 传统架构中,只有一个mysql主服务器,所以当出现单点故障的时候,整个服务器群

集就会瘫痪掉

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

二:MHA实验

2.1:实验环境

  • VMware软件

  • 一台centos7作为MHA

  • 三台centos7作为mysql服务器

  • 搭建好mysql主从复制环境

2.2:拓扑图

2.3:实验目的

  • 通过MHA监控MySQL数据库,在故障时自动进行切换,不影响业务
  • 当主库失效时,备选主库自动成为主库

2.4:实验过程

  • 因为操作系统是centos7,所以要下载MHA 0.57版本

2.4.1:安装gmake编译软件

[root@slave2 ~]# mount.cifs //192.168.11.11/ccc /mnt
Password for root@//192.168.11.11/ccc:
[root@slave2 ~]# cd /mnt/shuju数据库/mha
[root@slave2 mha]#
[root@slave2 mha]# tar zxvf cmake-2.8.6.tar.gz -C /opt
[root@slave2 mha]# cd /opt/cmake-2.8.6/
[root@slave2 cmake-2.8.6]# ./configure
[root@slave1 cmake-2.8.6]# gmake
[root@slave1 cmake-2.8.6]# gmake install

2.4.2:搭建mysql主从复制环境

  • 关闭防火墙

  • 主从复制环境中的mysql同步的用户名为:myslave 密码:123456

  • 额外调整

    • 所有数据库授权mha用户对数据库的操作权限,每一个mysql数据库都要设置
'//下面三条授权按理论是不用添加的,但是做案例实验环境时候诵过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服务器的授权增加一个给mha管理'
mysql> grant all privileges on *.* to 'mha'@'192.168.79.%' identified by 'manager';
'//主备mysql服务器添加用户和权限'
'//192.168.79.0段的从服务器拥有复制权限,可以使用myslave身份123456密码复制所有的库和表'
mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.79.%' IDENTIFIED BY '123456';
  • slave1和slave2两个从数据库设置为只读
mysql> set global read_only=1;
- 所有slave节点配置二进制日志,注释掉client段的默认字符集
[root@slave1 ~]# vim /etc/my.cnf[mysqld]段落添加
log-bin=slave1-bin '//添加二进制日志'
所以slave节点都要配置,我就不一一展示了'//从服务器上都注释掉client段的默认字符集'
[root@slave1 ~]# vim /etc/my.cnf
[client]
#default-character-set=utf8    '//注释掉此'
  • 创建软连接
所有节点创建软连接
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/
创建mysql软连接
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/

2.4.3:所有节点安装环境和Node组件和Manager组件

  • 所有服务器上都要安装mha依赖的环境,此处仅展示mha_manager的安装
[root@mha_manager ~]# yum install epel-release --nogpgcheck -y
[root@mha_manager ~]# yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
  • 所有服务器都安装安装node组件,此处仅展示master服务器的安装
[root@master ~]# tar zxvf /mnt/shuju数据库/mha/mha4mysql-node-0.57.tar.gz
[root@master ~]# cd mha4mysql-node-0.57/
[root@master mha4mysql-node-0.57]# yum install perl-Module-Install -y
[root@master mha4mysql-node-0.57]# perl Makefile.PL
==> Auto-install the 1 mandatory module(s) from CPAN? [y] y    '//输入y'
[root@master mha4mysql-node-0.57]# make
[root@master mha4mysql-node-0.57]# make install
  • 仅mha_manager服务器安装manager组件
[root@mha_manager ~]# tar zxvf /mnt/shuju数据库/mha/mha4mysql-manager-0.57.tar.gz
[root@mha_manager ~]# cd mha4mysql-manager-0.57/
[root@mha_manager mha4mysql-manager-0.57]# perl Makefile.PL
[root@mha_manager mha4mysql-manager-0.57]# make
[root@mha_manager mha4mysql-manager-0.57]# make install

2.4.4:配置节点间SSH面交互登陆

  • mha_manager主机配置到所有数据库节点的密钥对验证
[root@mha_manager ~]# ssh-keygen -t rsa'//创建非对称密钥对''//因为想要免密登陆,所以三个都直接回车就行,不需要设置密码'
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
'//上传秘钥到节点服务器'
[root@mha_manager ~]# ssh-copy-id 192.168.79.134
Are you sure you want to continue connecting (yes/no)? yes
root@192.168.79.134's password:   //输入密码''//相同方法建立其他服务器'
[root@mha_manager ~]# ssh-copy-id 192.168.79.135
[root@mha_manager ~]# ssh-copy-id 192.168.79.136
  • 在master上配置到数据库节点slave1和slave2的免密验证
[root@master mha4mysql-node-0.57]# ssh-keygen -t rsa    '//创建非对称密钥对''//用上述方法建立其他服务器'
[root@master mha4mysql-node-0.57]# ssh-copy-id 192.168.79.135
[root@master mha4mysql-node-0.57]# ssh-copy-id 192.168.79.136
  • 在slave1上配置到数据库节点master和slave2的免密验证
[root@slave1 ~]# ssh-keygen -t rsa
[root@slave1 ~]# ssh-copy-id 192.168.79.134
[root@slave1 ~]# ssh-copy-id 192.168.79.136
  • 在slave2上配置到数据库节点master和slave1的免密验证
[root@slave2 ~]# ssh-keygen -t rsa
[root@slave2 ~]# ssh-copy-id 192.168.79.134
[root@slave2 ~]# ssh-copy-id 192.168.79.135

2.4.5:配置MHA-Manager组件

  • 复制相关脚本到/usr/local/bin目录
[root@mha_manager ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
[root@mha_manager samples]# ls -l /usr/local/bin/scripts/
-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  因故障切换后发送报警的脚本
[root@mha_manager ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin/ '//自动切换时 VIP管理的脚本'
  • 修改master_ip_failover 脚本
[root@mha_manager ~]# 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.79.100';
my $brdc = '192.168.79.255';
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";
}
  • 创建MHA软件目录并拷贝配置文件
[root@mha_manager ~]# mkdir /etc/masterha
[root@mha_manager ~]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
[root@mha_manager ~]# vim /etc/masterha/app1.cnf '//删除内容,重新编写脚本'
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/mysql/data
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.79.135 -s 192.168.79.136
shutdown_script=""
ssh_user=root
user=mha[server1]
hostname=192.168.79.134
port=3306[server2]
candidate_master=1
hostname=192.168.79.135
check_repl_delay=0
port=3306[server3]
hostname=192.168.79.136
port=3306

2.4.6:测试SSH与mysql主从连接

  • 验证密钥对
[root@mha_manager ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
Fri Jan 10 01:14:10 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Jan 10 01:14:10 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Fri Jan 10 01:14:10 2020 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Fri Jan 10 01:14:10 2020 - [info] Starting SSH connection tests..
Fri Jan 10 01:14:11 2020 - [debug]
Fri Jan 10 01:14:10 2020 - [debug]  Connecting via SSH from root@192.168.79.135(192.168.79.135:22) to root@192.168.79.136(192.168.79.136:22)..
Fri Jan 10 01:14:11 2020 - [debug]   ok.
Fri Jan 10 01:14:12 2020 - [debug]
Fri Jan 10 01:14:10 2020 - [debug]  Connecting via SSH from root@192.168.79.136(192.168.79.136:22) to root@192.168.79.135(192.168.79.135:22)..
Fri Jan 10 01:14:11 2020 - [debug]   ok.
Fri Jan 10 01:14:12 2020 - [info] All SSH connection tests passed successfully.
  • 测试mysql主从连接
[root@mha_manager ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf

2.4.7:配置虚拟IP,启动MHA

  • 添加虚拟IP
[root@master ~]# /sbin/ifconfig ens33:1 192.168.79.100/24
  • 启动MHA
[root@mha_manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null >
[root@mha_manager ~]# /var/log/masterha/app1/manager.log 2>&1 &
'//查看到当前的master节点是谁'
[root@mha_manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
'//查看当前日志信息'
[root@mha_manager ~]# cat /var/log/masterha/app1/manager.log

2.4.8:模拟故障

  • 启动监控观察日志记录
[root@mha_manager ~]# tailf /var/log/masterha/app1/manager.log
  • 关掉master服务器
[root@master ~]# pkill -9 mysqld

2.5:实验验证

2.5.1:主服务器变更成功

  • 此时发现主服务器已经变更

    slave1查看

[root@slave1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.79.135  netmask 255.255.255.0  broadcast 192.168.79.255inet6 fe80::159a:a8d1:5769:74d0  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:34:57:c1  txqueuelen 1000  (Ethernet)RX packets 347068  bytes 28229347 (26.9 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 528201  bytes 67755670 (64.6 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.79.100  netmask 255.255.255.0  broadcast 192.168.79.255ether 00:0c:29:34:57:c1  txqueuelen 1000  (Ethernet)
  • mha_manager查看
'//会动态显示后续信息'
Generating relay diff files from the latest slave succeeded.
192.168.79.136(192.168.79.136:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.79.135(192.168.79.135:3306)
192.168.79.135(192.168.79.135:3306): Resetting slave info succeeded.
Master failover to 192.168.79.135(192.168.79.135:3306) completed successfully.

2.5.2:尝试从客户端通过虚拟IP连接上数据库

  • 直接在mha_manager上安装mysql
[root@mha_manager ~]# yum install mysql -y
  • 在vip的数据库服务器上提取
[root@slave1 ~]# mysql -uroot -p
Enter password:
mysql> grant all on *.* to 'root'@'%' identified by 'abc123';
  • 在客户机(mha_manager)上用虚拟IP进行登录
[root@mha_manager ~]# mysql -h 192.168.79.100 -uroot -pabc123
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| yiku               |
| mysql              |
| performance_schema |
| erku              |
| sanku               |
| sys                |
+--------------------+
8 rows in set (0.00 sec)

mysql高可用——MHA详细部署过程相关推荐

  1. 【MySQL高可用】MySQL高可用之MGR部署

    [MySQL高可用]MySQL高可用之MGR部署 参考:https://www.xmmup.com/dbbao45mysqlgaokeyongzhimgrconsuljiagoubushu.html ...

  2. mysql高可用MHA

    目录 主服务器的自动监控和故障转移原理 1.准备环境 2.安装数据库 3.MySQL主从配置 4.MHA高可用搭建 主服务器的自动监控和故障转移原理 MHA监控复制架构的主服务器,一旦检测到主服务器故 ...

  3. Haproxy+Keepalived+MySQL高可用均衡负载部署

    一.安装主从MySQL 1. 按照Linux-rpm安装MySQL步骤完成MySQL安装: 2. 修改启动的配置文件 (1)复制/usr/share/mysql路径下的my-default.cnf文件 ...

  4. k8s集群部署 | 二进制三节点(复用)高可用集群部署过程

    文章目录 1. 二进制部署三节点(复用)高可用 k8s 集群 1.1 环境规划阶段 1.1.1 实验架构图 1.1.2 系统版本说明 1.1.3 环境基本信息 1.1.4 k8s 网段划分 1.2 基 ...

  5. MySQL高可用MHA架构方案

    一.完整的MHA的架构方案 二.MHA故障发现与转移过程 MHA在启动的时候会有前置检查 MHA会每3s向主节点发送一个select 1 的sql语句,看主节点能不能执行成功,并且把1返回,如果能正常 ...

  6. Mysql数据库(十一)——MHA高可用集群部署及故障切换

    Mysql数据库(十一)--MHA高可用集群部署及故障切换 一.MHA概述 二.MHA的组成 三.MHA的特点 四.案例环境 1.服务器配置 2.思路 3.关闭防火墙和安全机制,并进行主从配置 4.配 ...

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

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

  8. Mysql进阶(4)——基于MHA的MySQL高可用架构

    前言 MySQL高可用性大杀器之MHA MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职 ...

  9. mysql 集群切换_完美起航-MySQLMHA高可用集群部署及故障切换(图文详解)

    MySQL MHA 一.MHA概念 MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件. MHA 的出现就是解决MySQL 单点的问题. ...

最新文章

  1. animate用法 js原生_用 原生Javascript 创建带动画的固顶导航菜单
  2. arm汇编指令:ldr和adr的区别
  3. 你提交代码前没有校验?巧用gitHooks解决
  4. 代号“凤凰”,阿里新零售秘密武器,今年要打入100个城市
  5. linux下无法删除文件夹,linux服务器下完美解决无法删除虚拟主机文件或文件夹...
  6. python 浏览器自动化 弹窗控制_selenium 网页自动化 - 在访问一个网页时弹出的浏览器窗口,我该如何处理?...
  7. jquery插件 validation表单的验证的应用的一个例子
  8. Atitit vue.js 把ajax数据 绑定到form表单
  9. Python控制Photoshop(Python+Com)
  10. 【Java篇】 Java小游戏中加入背景音乐
  11. 基于junit4的关于个人所得税计算的等价类与边界值_微服务的未来——从单体服务角度看微服务与云计算DevOps结合的演进...
  12. 号外号外!兹有第一届区块链技术及应用峰会(BTA)·中国热点议题新鲜出炉,首轮盘点先睹为快...
  13. win8虚拟机_老司机教你如何在虚拟机安装win8系统,双系统也可以这样实现
  14. 云通讯 发送短信模板代码
  15. 计算机网络——tcpdump/Wireshark抓包实战
  16. Azkban上传文件报错installation Failed.Error chunking
  17. 推荐21款最佳 HTML5 网页游戏
  18. Mysql中时间格式转换
  19. QQ群龙王快速获得代码以及方法
  20. c#机器人聊天软件_C#winForm 聊天只能机器人(完整版)

热门文章

  1. Vue移动端——隐藏滚动条
  2. 晶体谐振器和晶体振荡器的优缺点分析
  3. [原创]中国象棋翻翻棋,休闲,对战,娱乐,小游戏,jQuery小游戏,下载即用,代码注释全(附源码)
  4. 什么是倾斜摄影测量,目前的主要应用是在哪些方面呢?
  5. hbuilderx如何连接夜神处理器实现模拟安卓的效果
  6. 在前端培训班内该如何学习入门
  7. 解决流只能读一次的问题,getInputStream() has already been called for this request
  8. html div标签空白占位,空白符对HTML结构的影响与解决方案
  9. fixed:error:0308010C:digital envelope routines::unsupported
  10. 读书笔记--Java虚拟机垃圾收集算法