目录:

(一)认识MHA
    (1.1)MHA概述
    (1.2)MHA架构及其工作原理
    (1.3)使用MHA的优势
(二)MHA安装--源码安装
    (2.1)主机配置
    (2.2)MySQL主从复制搭建(1主2从,启用gtid)
    (2.3)安装MHA Node(在所有节点安装)
    (2.4)安装MHA Manager(在监控节点安装)
(三)MHA配置(MHA Manager节点)
    (3.1)SSH节点互信配置
    (3.2)MHA配置文件
    (3.3)VIP切换配置
    (3.4)检查MHA配置是否正确
(四)MHA Manager相关脚本说明
    (4.1)masterha_manager
    (4.2)masterha_master_switch
        (4.2.1)手动故障转移
        (4.2.2)在线主从切换
    (4.3)masterha_secondary_check
(五)MHA使用测试
    (5.1)MHA故障切换测试(主节点服务器运行正常,数据库实例down)
    (5.2)MHA故障切换测试(主节点服务器异常down)
    (5.3)MHA手动故障切换测试
    (5.4)MHA手动在线主从切换测试
(六)故障节点恢复
(七)其它
    (7.1)定期清理日志的脚本
    (7.2)选择哪个主机作为主节点

                                                                                                                                                                                                                                    

 


(一)认识MHA
(1.1)MHA概述
MHA是一套Perl编写的脚本,用来维护MySQL主从复制中Master节点的高可用。官方对其描述:Master High Availability Manager and tools for MySQL (MHA) for automating master failover and fast master switch.
主要功能有:
1.failover:主节点发生故障,将提升从节点为主节点。
2.switchover:主节点进行停机维护,需将主节点切换到新的服务器上。

主节点进行故障转移的难点:以一主多从的MySQL架构为例,如果主服务器崩溃,则需要选择一个最新的从服务器,将其升级为新的主节点。然后让其他从节点服务器从新的主服务器上开始复制。实际上,这是一个较为复杂的过程。即使可以识别到最新的从节点,其它从节点可能尚未收到所有二进制日志事件,如果复制开始后连接到新的主服务器,则这些从服务器将丢失事务,这将导致一致性问题。为避免一致性问题,需要在最新的主服务器启动之前,先识别丢失的binlog事件(尚未到达所有从服务器),并将其依次应用于每一个从服务器,此操作非常复杂,并且难以手动执行。
MHA的目标是在没有任何备用计算机的情况下,尽快使主机故障转移的恢复过程完全自动化。恢复过程包括:确定新的主服务器,识别从属服务器之间的差异中继日志事件,将必要的事件应用于新的主服务器,同步其它从属服务器并使它们从新的主服务器开始复制。根据复制延迟,MHA通常可以在10到30秒的停机事件内进行故障转移。

 

(1.2)MHA架构及其工作原理
MHA组件包含2部分:MHA Manager和MHA Node。其中:
Manager主要用于:监视MySQL主服务器,控制主服务器故障转移。一个Manager可以管理多个MHA集群;
Node主要用于:①保存以故障主节点的binlog;②通过比较relay log,查找从节点的日志差异,确定哪一个是最新节点,应用差异日志;③purge relay log。

一步一步搭建MySQL高可用架构MHA

一步一步搭建MySQL高可用架构MHA

 MHA工作原理为:

1.验证主从复制状态并识别当前的主服务器。确认主从节点的状态,如果主从节点数据库运行正常,则MHA Manager会一直监控主从节点的状态,如果从节点异常,则MHA停止运行;
2.如果MHA Manager连续3次无法连接到主服务器,则认为主服务器出现故障;
3.此时MHA会尝试通过MySQL的从节点连接到主节点,再次确认主节点运行状态,如果从节点也无法连接到主节点,说明MySQL主节点出现故障,启动主节点故障转移;
4.启动故障转移后,MHA Manager首先确认是否可以ssh连接到主节点,如果ssh可以访问,则所有从节点将从主节点拷贝还未执行的binlog日志到节点上执行;如果ssh也无法访问到主节点,则MHA会到从节点执行"show slave status"判断哪个从节点应用到了最新的日志,然后其他节点到该节点拷贝relay log到自己节点应用,最终实现所有从节点应用日志到同一时间;
5.启动选主机制,选择出主节点,启动VIP漂移
6.将其他从接节点指到新的主节点

 

(1.3)使用MHA的优势

使用MHA的主要优势如下:

  • 主节点故障转移和从节点升级快速完成。在从节点复制延迟较小的情况下,通常10~30S即可完成故障转移;
  • 主节点崩溃不会导致数据不一致。从节点之间可以识别relay log的日志事件,并应用于每一个主机,保证所有从节点数据一致;
  • 无需修改当前的MySQL配置;
  • 无性能损失。MHA默认每隔3s向MySQL主节点发送一个简单的查询,不会过多的消耗服务器性能;
  • 适用于任何存储引擎。


(二)MHA安装--源码安装
基础资源信息:

IP地址 主机名称 操作系统 用途
192.168.10.5 monitor centos 7.4  MHA Manager主机
192.168.10.11  node1  centos 7.4  MySQL主从复制,主节点
192.168.10.12  node2  centos 7.4  MySQL主从复制,从节点,候选主节点
192.168.10.13 node3  centos 7.4  MySQL主从复制,从节点
192.168.10.10  /  / 虚拟IP,用来做主节点IP漂移

  

(2.1)主机配置
1.配置/etc/hosts文件

[root@monitor ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.10.5 monitor
192.168.10.11 node1
192.168.10.12 node2
192.168.10.13 node3

 2.配置epel源,MHA依赖于其它包使用默认的centos yum源无法安装全部的依赖包,建议添加epel源

# RHEL/Centos7源
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

# 使新配置的源生效
yum clean
yum makecache

  

(2.2)MySQL主从复制搭建(1主2从,启用gtid)
MySQL版本:MySQL 5.7
MHA本身并不构建复制环境,需要自己搭建MySQL的主从复制环境,这里构建基于GTID的主从复制。
MySQL安装链接:https://www.cnblogs.com/lijiaman/p/10743102.html
MySQL基于GDIT的主从搭建:https://www.cnblogs.com/lijiaman/p/12315379.html

MySQL参数配置如下:

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8

[mysqld]
##### 1.基础参数 #######
# 是禁用dns解析,mysql的授权表中就不能使用主机名了,只能使用IP 
skip-name-resolve

# 设置3306端口
port = 3306 

# 设置mysql的安装目录
basedir=/mysql

# 设置mysql数据库的数据的存放目录
datadir=/mysql/data

# 允许最大连接数
max_connections=1000

# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8

# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB 

# 表名不区分大小写
lower_case_table_names=1

max_allowed_packet=16M

# error log 使用系统时区
log_timestamps = 1

# 使用root用户启动mysql数据库
user = root

##### 2.复制相关参数配置  #####
server_id = 1    # 要求所有节点不相同
binlog_format=ROW
log_bin=/mysql/binlog/node1-bin  
max_binlog_size=1G
sync_binlog=1
innodb_flush_log_at_trx_commit=1

##### 3.启用GTID相关参数  #####
gtid_mode=ON
enforce-gtid-consistency=ON

##### 4.MHA要求参数  #####
# 0表示禁止 SQL 线程在执行完一个 relay log 后自动将其删除,对于MHA场景下,对于某些滞后从库的恢复依赖于其他从库的relay log,因此采取禁用自动删除功能 
relay_log_purge = 0 

# 从节点需设置为只读
# read_only = 1

 备注:3个节点不同的参数为:log_bin、server_id、read_only


(2.3)安装MHA Node(在所有节点安装)
MHA可以使用源码编译安装,也可以使用rpm包直接,这里使用源码编译安装。
STEP1:下载MHA Node源码安装包
进入github网站:https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58,下载最新版本的MHA Node。

STEP2:安装MHA Node的依赖包,需要在所有节点都进行安装

# 官方文档中提示,mha node安装只依赖于该包
yum install -y perl-DBD-MySQL

# 在实际安装过程中,发现还需要该包
yum install -y perl-CPAN

STEP3:安装mha node

# 解压安装包
$ tar -xzvf mha4mysql-node-0.58.tar.gz

# 安装MHA Node
$ perl Makefile.PL
$ make
$ make install

Note:在实际安装过程中,报错
[root@node1 mha4mysql-node-0.58]# perl Makefile.PL
Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/Install/Can.pm line 5.
BEGIN failed--compilation aborted at inc/Module/Install/Can.pm line 5.
Compilation failed in require at inc/Module/Install.pm line 307.
Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/Install/Makefile.pm line 4.
BEGIN failed--compilation aborted at inc/Module/Install/Makefile.pm line 4.
Compilation failed in require at inc/Module/Install.pm line 307.
Can't locate ExtUtils/MM_Unix.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/Install/Metadata.pm line 322.

解决方案:

[root@node1 mha4mysql-node-0.58]# yum install -y perl-CPAN

 STEP4:安装确认

安装完成之后,会在所有节点的/usr/local/bin/目录下生成node相关的脚本

[root@node3 bin]# cd /usr/local/bin/
[root@node3 bin]# ll
-r-xr-xr-x. 1 root root 17639 Mar 29 15:04 apply_diff_relay_logs
-r-xr-xr-x. 1 root root 4807 Mar 29 15:04 filter_mysqlbinlog
-r-xr-xr-x. 1 root root 8337 Mar 29 15:04 purge_relay_logs
-r-xr-xr-x. 1 root root 7525 Mar 29 15:04 save_binary_logs

 

MHA Node整个安装过程操作日志:

  1 [root@monitor ~]# tar -xzvf mha4mysql-node-0.58.tar.gz
  2 mha4mysql-node-0.58/
  3 mha4mysql-node-0.58/inc/
  4 mha4mysql-node-0.58/inc/Module/
  5 mha4mysql-node-0.58/inc/Module/Install/
  6 mha4mysql-node-0.58/inc/Module/Install/Fetch.pm
  7 mha4mysql-node-0.58/inc/Module/Install/Metadata.pm
  8 mha4mysql-node-0.58/inc/Module/Install/AutoInstall.pm
  9 mha4mysql-node-0.58/inc/Module/Install/Win32.pm
 10 mha4mysql-node-0.58/inc/Module/Install/WriteAll.pm
 11 mha4mysql-node-0.58/inc/Module/Install/Can.pm
 12 mha4mysql-node-0.58/inc/Module/Install/Include.pm
 13 mha4mysql-node-0.58/inc/Module/Install/Makefile.pm
 14 mha4mysql-node-0.58/inc/Module/Install/Scripts.pm
 15 mha4mysql-node-0.58/inc/Module/Install/Base.pm
 16 mha4mysql-node-0.58/inc/Module/AutoInstall.pm
 17 mha4mysql-node-0.58/inc/Module/Install.pm
 18 mha4mysql-node-0.58/debian/
 19 mha4mysql-node-0.58/debian/compat
 20 mha4mysql-node-0.58/debian/changelog
 21 mha4mysql-node-0.58/debian/rules
 22 mha4mysql-node-0.58/debian/copyright
 23 mha4mysql-node-0.58/debian/control
 24 mha4mysql-node-0.58/bin/
 25 mha4mysql-node-0.58/bin/purge_relay_logs
 26 mha4mysql-node-0.58/bin/filter_mysqlbinlog
 27 mha4mysql-node-0.58/bin/save_binary_logs
 28 mha4mysql-node-0.58/bin/apply_diff_relay_logs
 29 mha4mysql-node-0.58/AUTHORS
 30 mha4mysql-node-0.58/MANIFEST
 31 mha4mysql-node-0.58/t/
 32 mha4mysql-node-0.58/t/perlcriticrc
 33 mha4mysql-node-0.58/t/99-perlcritic.t
 34 mha4mysql-node-0.58/README
 35 mha4mysql-node-0.58/COPYING
 36 mha4mysql-node-0.58/META.yml
 37 mha4mysql-node-0.58/lib/
 38 mha4mysql-node-0.58/lib/MHA/
 39 mha4mysql-node-0.58/lib/MHA/BinlogPosFinderElp.pm
 40 mha4mysql-node-0.58/lib/MHA/BinlogPosFindManager.pm
 41 mha4mysql-node-0.58/lib/MHA/BinlogPosFinderXid.pm
 42 mha4mysql-node-0.58/lib/MHA/BinlogPosFinder.pm
 43 mha4mysql-node-0.58/lib/MHA/BinlogHeaderParser.pm
 44 mha4mysql-node-0.58/lib/MHA/NodeConst.pm
 45 mha4mysql-node-0.58/lib/MHA/NodeUtil.pm
 46 mha4mysql-node-0.58/lib/MHA/SlaveUtil.pm
 47 mha4mysql-node-0.58/lib/MHA/BinlogManager.pm
 48 mha4mysql-node-0.58/Makefile.PL
 49 mha4mysql-node-0.58/rpm/
 50 mha4mysql-node-0.58/rpm/masterha_node.spec
 51 [root@monitor ~]#
 52 [root@monitor ~]#
 53 [root@monitor ~]# ll
 54 total 697468
 55 -rw-------. 1 root root 1325 Oct 24 2019 anaconda-ks.cfg
 56 -rw-r--r--. 1 root root 119801 Mar 29 15:14 mha4mysql-manager-0.58.tar.gz
 57 drwxr-xr-x. 8 lijiaman lijiaman 168 Mar 23 2018 mha4mysql-node-0.58
 58 -rw-r--r--. 1 root root 56220 Mar 29 15:14 mha4mysql-node-0.58.tar.gz
 59 -rw-r--r--. 1 root root 714022690 Mar 17 16:28 mysql-5.7.27-el7-x86_64.tar.gz
 60 [root@monitor ~]# cd mha4mysql-
 61 -bash: cd: mha4mysql-: No such file or directory
 62 [root@monitor ~]# cd mha4mysql-node-0.58
 63 [root@monitor mha4mysql-node-0.58]# ls
 64 AUTHORS bin COPYING debian inc lib Makefile.PL MANIFEST META.yml README rpm t
 65 [root@monitor mha4mysql-node-0.58]# perl Makefile.PL
 66 Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/Install/Can.pm line 5.
 67 BEGIN failed--compilation aborted at inc/Module/Install/Can.pm line 5.
 68 Compilation failed in require at inc/Module/Install.pm line 307.
 69 Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/Install/Makefile.pm line 4.
 70 BEGIN failed--compilation aborted at inc/Module/Install/Makefile.pm line 4.
 71 Compilation failed in require at inc/Module/Install.pm line 307.
 72 Can't locate ExtUtils/MM_Unix.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/Install/Metadata.pm line 322.
 73 [root@monitor mha4mysql-node-0.58]#
 74 [root@monitor mha4mysql-node-0.58]#
 75 [root@monitor mha4mysql-node-0.58]# yum install -y perl-CPAN
 76 Loaded plugins: fastestmirror
 77 Loading mirror speeds from cached hostfile
 78 * base: mirrors.cqu.edu.cn
 79 * epel: mirrors.bfsu.edu.cn
 80 * extras: mirrors.cqu.edu.cn
 81 ... 略 ...
 82 Installed:
 83 perl-CPAN.noarch 0:1.9800-299.el7_9
 84 
 85 Dependency Installed:
 86 gdbm-devel.x86_64 0:1.10-8.el7 libdb-devel.x86_64 0:5.3.21-25.el7 perl-Digest.noarch 0:1.17-245.el7
 87 perl-Digest-SHA.x86_64 1:5.85-4.el7 perl-ExtUtils-Install.noarch 0:1.58-299.el7_9 perl-ExtUtils-MakeMaker.noarch 0:6.68-3.el7
 88 perl-ExtUtils-Manifest.noarch 0:1.61-244.el7 perl-ExtUtils-ParseXS.noarch 1:3.18-3.el7 perl-Test-Harness.noarch 0:3.28-3.el7
 89 perl-devel.x86_64 4:5.16.3-299.el7_9 perl-local-lib.noarch 0:1.008010-4.el7 pyparsing.noarch 0:1.5.6-9.el7
 90 systemtap-sdt-devel.x86_64 0:4.0-13.el7
 91 
 92 Dependency Updated:
 93 libdb.x86_64 0:5.3.21-25.el7 libdb-utils.x86_64 0:5.3.21-25.el7
 94 
 95 Complete!
 96 [root@monitor mha4mysql-node-0.58]# perl Makefile.PL
 97 *** Module::AutoInstall version 1.06
 98 *** Checking for Perl dependencies...
 99 [Core Features]
100 - DBI ...loaded. (1.627)
101 - DBD::mysql ...loaded. (4.023)
102 *** Module::AutoInstall configuration finished.
103 Checking if your kit is complete...
104 Looks good
105 Writing Makefile for mha4mysql::node
106 [root@monitor mha4mysql-node-0.58]# make
107 cp lib/MHA/BinlogManager.pm blib/lib/MHA/BinlogManager.pm
108 cp lib/MHA/BinlogPosFindManager.pm blib/lib/MHA/BinlogPosFindManager.pm
109 cp lib/MHA/BinlogPosFinderXid.pm blib/lib/MHA/BinlogPosFinderXid.pm
110 cp lib/MHA/BinlogHeaderParser.pm blib/lib/MHA/BinlogHeaderParser.pm
111 cp lib/MHA/BinlogPosFinder.pm blib/lib/MHA/BinlogPosFinder.pm
112 cp lib/MHA/BinlogPosFinderElp.pm blib/lib/MHA/BinlogPosFinderElp.pm
113 cp lib/MHA/NodeUtil.pm blib/lib/MHA/NodeUtil.pm
114 cp lib/MHA/SlaveUtil.pm blib/lib/MHA/SlaveUtil.pm
115 cp lib/MHA/NodeConst.pm blib/lib/MHA/NodeConst.pm
116 cp bin/filter_mysqlbinlog blib/script/filter_mysqlbinlog
117 /usr/bin/perl "-Iinc" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/filter_mysqlbinlog
118 cp bin/apply_diff_relay_logs blib/script/apply_diff_relay_logs
119 /usr/bin/perl "-Iinc" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/apply_diff_relay_logs
120 cp bin/purge_relay_logs blib/script/purge_relay_logs
121 /usr/bin/perl "-Iinc" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/purge_relay_logs
122 cp bin/save_binary_logs blib/script/save_binary_logs
123 /usr/bin/perl "-Iinc" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/save_binary_logs
124 Manifying blib/man1/filter_mysqlbinlog.1
125 Manifying blib/man1/apply_diff_relay_logs.1
126 Manifying blib/man1/purge_relay_logs.1
127 Manifying blib/man1/save_binary_logs.1
128 [root@monitor mha4mysql-node-0.58]# make install
129 Installing /usr/local/share/perl5/MHA/BinlogManager.pm
130 Installing /usr/local/share/perl5/MHA/BinlogPosFindManager.pm
131 Installing /usr/local/share/perl5/MHA/BinlogPosFinderXid.pm
132 Installing /usr/local/share/perl5/MHA/BinlogHeaderParser.pm
133 Installing /usr/local/share/perl5/MHA/BinlogPosFinder.pm
134 Installing /usr/local/share/perl5/MHA/BinlogPosFinderElp.pm
135 Installing /usr/local/share/perl5/MHA/NodeUtil.pm
136 Installing /usr/local/share/perl5/MHA/SlaveUtil.pm
137 Installing /usr/local/share/perl5/MHA/NodeConst.pm
138 Installing /usr/local/share/man/man1/filter_mysqlbinlog.1
139 Installing /usr/local/share/man/man1/apply_diff_relay_logs.1
140 Installing /usr/local/share/man/man1/purge_relay_logs.1
141 Installing /usr/local/share/man/man1/save_binary_logs.1
142 Installing /usr/local/bin/filter_mysqlbinlog
143 Installing /usr/local/bin/apply_diff_relay_logs
144 Installing /usr/local/bin/purge_relay_logs
145 Installing /usr/local/bin/save_binary_logs
146 Appending installation info to /usr/lib64/perl5/perllocal.pod
147 [root@monitor mha4mysql-node-0.58]#
View Code

相关文章: