这里写目录标题

  • MHA概述
    • 安装MySQL数据库
    • 配置MySQL一主两从
    • 安装MHA软件
    • 配置无密码认证
    • 配置MySQL-MHA高可用
    • 六、模拟 master 故障切换

MHA概述

传统的MySQL主从架构存在的问题

MySQL主服务器出故障后就无法写入数据了

●MHA简介
一套优秀的MySQL高可用环境下故障切换和主从复制的软件
MySQL故障过程中,MHA能做到0-30秒内自动完成故障切换

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

●MHA特点(优势)
在 MHA 自动故障切换过程中,MHA 试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过 SSH 访问,MHA 没法保存二进制日志,就会出现只进行故障转移但丢失了最新的数据的情况。
使用 MySQL 5.5 的半同步复制,可以大大降低数据丢失的风险。MHA 可以与半同步复 制结合起来。如果只有一个 slave 已经收到了最新的二进制日志,MHA 可以将最新的二进 制日志应用于其他所有的 slave 服务器上,因此可以保证所有节点的数据一致性。

●MHA架构
目前MHA支持一主多从架构,最少三台服务,即一主两从

MHA高可用图解

manage : 192.168.136.88

master : 192.168.136.40

slave/master : 192.168.136.10

slave: 192.168.136.20

案例需求
1)安装mysql 5.6.36版本
2)配置mysql 一主俩从
3)安装MHA软件
4)配置无密码认证
5)配置mysql MHA 高可用
6)模拟master故障切换
实验台数
4台服务器3台安装mysql5.6,一台安装MHA

安装MySQL数据库

安装依赖环境

yum -y install ncurses-devel gcc-c++ perl-Module-Install

导入安装包
安装gmake 编译软件

[root@mysql1 ~]# tar zxvf cmake-2.8.6.tar.gz[root@mysql1 ~]# cd cmake-2.8.6/[root@mysql2 cmake-2.8.6]# ./configure [root@mysql1 cmake-2.8.6]# gmake && gmake install

安装mysql数据库

[root@mysql3 ~]# tar zxvf mysql-5.6.36.tar.gz [root@mysql2 ~]# cd 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@mysql2 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

启动脚本

[root@mysql1 mysql-5.6.36]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@mysql3 mysql-5.6.36]# chmod +x /etc/rc.d/init.d/mysqld
[root@mysql3 mysql-5.6.36]# chkconfig --add mysqld

申明环境变量

echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile[root@mysql3 mysql-5.6.36]# source /etc/profile   刷新生效

建立程序用户

[root@mysql3 sbin]# groupadd mysql[root@mysql3 sbin]# useradd -M -s /sbin/nologin mysql -g mysql

给他权限

[root@mysql3 sbin]# chown -R mysql.mysql /usr/local/mysql

创建数据存放位置

/usr/local/mysql/scripts/mysql_install_db \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data \
--user=mysql

配置MySQL一主两从

修改master的主配置文件 三台服务器id不一样

主服务器:
vim /etc/my.cnfserver-id=1        ## 特别注意三台服务器id不能相同
log_bin=master-bin
log-slave-updates=true主备从服务器:
server-id=2
log_bin=master-bin
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index从服务器:
server-id=3
log_bin=master-bin
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index

重启mysql服务

systemctl restart mysqld

mysql1 msyql2 mysql3 分别在3台主机上做软连接

[root@mysql1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@mysql1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

3台主机启动mysql(不要暂停重新开启)

[root@mysql1 ~]# /usr/local/mysql/bin/mysqld_safe --user=mysql &

查看是否开启

[root@mysql1 ~]# netstat -ntap | grep 3306

systemctl stop firewalld
iptables -F
setenforce 0

在这里插入代码片

配置MySQL、一主两从

  • MySQL主从配置相对比较简单.需要注意的是授权.步骤如下
  • 在所有数据库节点上授权两个用户,一个是从库同步使用,另外一个是manager使用.
grant replication slave on *.* to 'myslave'@'192.168.136.%' identified by '123';
grant all privileges on *.* to 'mha'@'192.168.136.%' identified by 'manager';
flush privileges;

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

grant all privileges on *.* to 'mha'@'master' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave-master' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave' identified by 'manager';
flush privileges;

在master主机上查看二进制文件和同步点

show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |     1294 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

-接下来在mysql2和mysql3分别执行同步

  change master to master_host='192.168.136.20',master_user='myslave',master_password='123',master_log_file='master-bin.000001', master_log_pos=1294;

开启从服务

start slave;
  • 查看I/O和SQL线程都是yes 代表同步是否正常
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

必须设置两个从库为只读模式

mysql> set global read_only=1;
mysql> flush privileges;

安装MHA软件

所有服务器上都安装MHA依赖的环境,首先安装epel源

yum -y install epel-release --nogpgcheck[root@localhost ~]# cd /opt/mysql-5.6.36/
yum -y install perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

解释

  • yum -y install perl-DBD-MySQL \ 连接数据库
  • perl-Config-Tiny \ 配置文件
  • perl-Log-Dispatch \ 日志
  • perl-Parallel-ForkManager \ 管理框架
  • perl-ExtUtils-CBuilder \ 构建包
  • perl-ExtUtils-MakeMaker \
  • perl-CPAN 函数库

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

部署安装node组件

cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz

perl语言进行配置

cd mha4mysql-node-0.57
perl Makefile.PL
make&&make install

在mha-manager上安装manager组件(!注意:一定要先安装node组件才能安装manager组件)

cd /opt
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make&&make install
查看
[root@mha mha4mysql-manager-0.57]# ls /usr/local/bin/
//mha-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下面会生成几个脚本(这些工具通常由 MHA Manager的脚本除法,无需人为操作)主要如下//
save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs 清除中继日志 (不会紫塞SQL线程)

配置无密码认证

 ssh-keygen -t rsa
推送密钥对给3台的服务器(密码123123)
ssh-copy-id 192.168.136.88ssh-copy-id 192.168.136.88ssh-copy-id 192.168.136.882:mysql1上配置数据库节点mysql2和mysql3的无密码登录ssh-keygen -t rsa
推送密钥对给其他2台的服务器
ssh-copy-id 192.168.136.40
密钥123123ssh-copy-id 192.168.136.103:mysql2上配置数据库节点mysql1和mysql3的无密码登录ssh-keygen -t rsa
推送密钥对给其他2台的服务器ssh-copy-id 192.168.136.88
密钥123123ssh-copy-id 192.168.136.104:mysql3上配置数据库节点mysql1和mysql2的无密码登录ssh-keygen -t rsa
推送密钥对给其他2台的服务器ssh-copy-id 192.168.136.88
密钥123123ssh-copy-id 192.168.136.40

配置MySQL-MHA高可用

在mha-manager节点上复制相关脚本到/usr/local/bin 目录.

cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
//拷贝后有四个执行文件
ls /usr/local/bin/scripts/
master_ip_failover  master_ip_online_change  power_manager  send_report

复制上述的自动切换时VIP管理的脚本到/usr/local/bin 目录,这里使用脚本管理 VIP

cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

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

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.136.200';
my $brdc = '192.168.136.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软件目录并拷贝配置文件

mkdir /etc/masterha
cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
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=123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.136.100 -s 192.168.136.200
shutdown_script=""
ssh_user=root
user=mha[server1]
hostname=192.168.136.88
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.136.40
port=3306[server3]
hostname=192.168.136.10
port=3306

修改路径

[root@mha-manager scripts]# cp /usr/local/bin/scripts/master_ip_online_change /usr/local/bin/[root@mha-manager scripts]# cp /usr/local/bin/scripts/send_report /usr/local/

测试无密码认证,如果正常最后会输出successfully接检查是OK即可

masterha_check_ssh --conf=/etc/masterha/app1.cnfmasterha_check_repl --conf=/etc/masterha/app1.cnf

在主服务器上

[root@master ~]# /sbin/ifconfig ens33:1 192.168.136.200/24

在mha服务上启动MHA

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 &
  • 查看MHA状态,可以看到当前的master是master节点
masterha_check_status --conf=/etc/masterha/app1.cnf
  • 查看MHA日志,也可以看到当前的master是192.168.136.88
cat /var/log/masterha/app1/manager.log
  • 查看master的VIP地址192.168.136.200 是否存在?,这个VIP地址不会因为manager节点停止MHA服务而消失.
[root@master ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.136.20 netmask 255.255.255.0  broadcast 192.168.136.255inet6 fe80::f3d9:2d42:9596:bfb9  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:81:28:de  txqueuelen 1000  (Ethernet)RX packets 610896  bytes 855719895 (816.0 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 205699  bytes 16844848 (16.0 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.136.200  netmask 255.255.255.0  broadcast 192.168.136.255ether 00:0c:29:81:28:de  txqueuelen 1000  (Ethernet)

六、模拟 master 故障切换

//mha-manager服务器操作//
[root@mha-manager ~]# tailf /var/log/masterha/app1/manager.logIN SCRIPT TEST====/sbin/ifconfig ens33:1 down==/sbin/ifconfig ens33:1 20.0.0.200===Checking the Status of the script.. OK
Sat Aug 29 20:13:33 2020 - [info]  OK.
Sat Aug 29 20:13:33 2020 - [warning] shutdown_script is not defined.
Sat Aug 29 20:13:33 2020 - [info] Set master ping interval 1 seconds.
Sat Aug 29 20:13:33 2020 - [info] Set secondary check script: /usr/local/bin/masterha_secondary_check -s 20.0.0.19 -s 20.0.0.18
Sat Aug 29 20:13:33 2020 - [info] Starting ping health check on 20.0.0.20(20.0.0.20:3306)..
Sat Aug 29 20:13:33 2020 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..
^[[A^[[B^[[B^[[C^[[D^[[D^[[D^[[D^[[D^[[D^[[D^[[D^[[D^[[D^[[D^[[D^[[D^[[D^[[D^[[D^[[D^[[D^C
[root@localhost scripts]# tailf /var/log/masterha/app1/manager.logIN SCRIPT TEST====/sbin/ifconfig ens33:1 down==/sbin/ifconfig ens33:1 20.0.0.200===Checking the Status of the script.. OK
Sat Aug 29 20:13:33 2020 - [info]  OK.
Sat Aug 29 20:13:33 2020 - [warning] shutdown_script is not defined.
Sat Aug 29 20:13:33 2020 - [info] Set master ping interval 1 seconds.
Sat Aug 29 20:13:33 2020 - [info] Set secondary check script: /usr/local/bin/masterha_secondary_check -s 20.0.0.19 -s 20.0.0.18
Sat Aug 29 20:13:33 2020 - [info] Starting ping health check on 20.0.0.20(20.0.0.20:3306)..
Sat Aug 29 20:13:33 2020 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..//master服务器操作//
[root@master ~]# pkill -9 mysql切换到mysql2(主备从服务器上)
[root@slave-master ~]# ifconfigens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 20.0.0.200  netmask 255.0.0.0  broadcast 20.255.255.255ether 00:0c:29:55:a0:0c  txqueuelen 1000  (Ethernet)

理论+实验·MHA高可用配置及故障切换相关推荐

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

    文章目录 一.MHA介绍 1.1 概述 1.2:MHA的组成 1.3 MHA特点 二.实验 2.1 原因 2.2 实验目的 2.3 实验环境 2.4 拓扑图 2.5 实验过程 一.MHA介绍 1.1 ...

  2. MySQL之MHA高可用配置及故障切换(理论加实战详细部署步骤)

    MySQL之MHA高可用配置及故障切换(理论加实战详细部署步骤) 文章目录 一.MHA介绍 (一).什么是MHA (二).MHA 的组成 (三).MHA 的特点 二.搭建 MySQL MHA (一). ...

  3. MySQL的MHA高可用配置及故障切换

    MySQL的MHA高可用配置及故障切换 一.MHA概述 1.MHA简介 2.MHA的组成 3.MHA特点 二.MHA实验 1.实验环境准备 2.实验目的 3.实验步骤 一.MHA概述 1.MHA简介 ...

  4. MySQL之MHA高可用配置及故障切换实例

    MySQL之MHA高可用配置及故障切换实例 前言 一.MHA概述 (1)MHA是什么 (2)MHA的组成 (3)MHA的特点 二.部署MHA (1)配置主从服务 ①环境初始化 ③修改master.sl ...

  5. 案例:MHA高可用配置及故障切换

    文章目录 案例:MHA高可用配置及故障切换 一.前置知识点 1.1 MHA(MasterHigh Availability)概述 1.2 MHA的组成 1.3 MHA特点 二.搭建MySQL+MHA ...

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

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

  7. MySQL之MHA高可用配置及故障切换——超详细的理论+实验!

    MHA高可用配置 一.案例知识点 1.1.什么是MHA 1.2.MHA的组成 1.3.为什么使用MHA? 1.4.MHA特点 二.MHA案例 2.1.实验拓扑 2.2.实验环境 2.3.实验目的 2. ...

  8. 理论+实验:MHA高可用配置及故障切换(实验超详细版)

    目录 一.案例概述 1.1 案例概述 1.2 案例前置知识点-1 1.3 案例前置知识点-2 1.4 案例环境 二.案例实施 2.1 实验思路 2.2 案例环境 2.3 案例环境案例需求 2.4 案例 ...

  9. 理论+实操:MHA高可用配置及故障切换

    文章目录 一:案例概述 1.1 传统的mysql主从架构存在的问题 二:案例前置知识点 2.1 MHA概述 2.2 MHA的组成 2.3 MHA特点 三:案例环境--拓扑图 四:案例实施 4.1 搭建 ...

最新文章

  1. 【NOIP2016】愤怒的小鸟
  2. caffe学习(六):使用python调用训练好的模型来分类(Ubuntu)
  3. linux两个网段默认网关_Linux下配置多网卡多网关
  4. python垃圾回收机制(GC)相关问题
  5. oracle某用户历史sql语句,查看oracle 用户执行的sql语句历史记录
  6. 有一种无耻叫 “我是为你着想”
  7. 四川大学计算机科学与技术专业分数线,2015年四川大学计算机科学与技术硕士考研复试分数线是290分...
  8. 专题导读:空天大数据
  9. Redis学习总结(16)——Redis 集群的5种使用方式,及各自优缺点对比分析
  10. spring 事务案例--转账
  11. vue前端项目打包并且在服务器上部署过程
  12. UG1969软件详细安装教程
  13. Mac Air USB接口 失效/不起作用 的修复方式
  14. 软件-浏览器-GoogleChrome:Google Chrome
  15. 计算机网络无法连接共享打印机驱动,Windows 10 安装网络共享打印机失败,提示0x00009c4a 无法连接到打印机解决办法...
  16. 织梦后台模块管理空白不显示的解决方法
  17. 暑假假期训练总结-26
  18. cesium面积计算_GitHub - BulletYuan/bulletCesium: GIS可视化——基于Cesiumjs的一些工具类,测量距离、测量面积。持续更新......
  19. 字节跳动校招编程题——特征提取 python
  20. python采用强制缩进的方式使得代码具有极佳的可读性_python3的优势有哪些

热门文章

  1. 腾讯云低延时直播系统架构设计与弱网优化实践
  2. LiveVideoStack线上分享第五季(四):基于Nginx的媒体服务器技术
  3. HTTP-FLV的两种方式
  4. cmake学习(五) 系统默认变量和内置变量
  5. ST新一代烧写工具 STM32CubeProgrammer
  6. mysql打开sql语句日志
  7. Boost在Linux和windows下的编译 32位 64位
  8. 每日两SQL(8),欢迎交流~
  9. javaSE各阶段练习题--面向对象-static-String-StringBuilder
  10. 324. Wiggle Sort II | 324. 摆动排序 II(降序穿插)