目录
2、修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf
3、在 Master、Slave1、Slave2 节点上都创建两个软链接
MySQL 服务器中,单台服务器无法承载服务量就配置多台MySQL服务器,多台 MySQL 服务器或者MySQL 服务器无冗余的情况下,配置主从复制。 MySQL服务器的读和写的压力不均衡可使用 MySQL 的读写分离,MySQL的读写分离中 Msater 存在单点故障,就得用到 MHA。
MHA(Master High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。在MySQL故障切换的过程中,MHA能做到0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能够最大程度上保证数据库的一致性,以达到真正意义上的高可用。MHA由perl语言编写,该工具仅仅使用于MySQLReplication环境,目的在于维持Master主库的高可用性
MHA Node(数据节点)
MHA Manager(管理节点)
MHA :为了解决的是故障切换、数据尽可能的保存,以及所有节点日志的一致性
总共有三种:同步、半同步、异步
异步: 在主从架构中加入当客户端发送了一条update语句,主服务器上I/O 线程将二进制日志写入到binlog文件之后就返回客户端结构,不管从服务器是否已经同步到了自己的relay-log(中继日志中)。
同步: 也称全同步,当主服务器完成更新,并且同步到所有从服务器才会返回成功结果。
半同步: 将两个方法折中,当主服务器完成更新,至少有一个从服务器接收到并完成更新,主服务器就返回成功。
MHA Manger管理多组主从复制。
MHA工作原理总结如下:
MHA高可用是基于主从复制的基础上进行安装部署一台新的MHKmanager服务器,该服务器用来监控master服务器,当master服务器出现故障时,它可以自动将最新的数据的slave提升为master(或者可指定直接新的master)。然后其它的slave重新指向新的master。
MHA manager:192.168.62.10
master服务器:192.168.62.50
slave1服务器:192.168.62.60
slave2服务器:192.168.62.70
所有机器均关闭防火墙和核心防护
- systemctl stop firewalld
- 关闭防火墙
- systemctl disable firewalld
- 关闭开机自启防火墙
- setenforce 0
- 关闭核心防护
-
- netstat -natp | grep 3306
- 查看mysql是否开启



- #Master 节点##
- #修改master的主配置文件
- #开启二进制日志log_bin,允许从服务器同步log-slave-updates 22行之后
-
- vim /etc/my.cnf
- [mysqld]
- server-id = 1
- log_bin = master-bin
- log-slave-updates = true
-
- systemctl restart mysqld
-
-
- ##Slave1 节点##
- #在/etc/my.cnf 中修改或者增加下面内容
- #开启中继日志,创建索引,同步主服务器
-
- vim /etc/my.cnf
- server-id = 2 #三台服务器的 server-id 不能一样
- log_bin = master-bin #以防单点故障的时候切换
- relay-log = relay-log-bin
- relay-log-index = slave-relay-bin.index
-
- systemctl restart mysqld
-
-
- ###Slave2 节点##
- vim /etc/my.cnf
- server-id = 3 #三台服务器的 server-id 不能一样
- relay-log = relay-log-bin
- relay-log-index = slave-relay-bin.index
-
- systemctl restart mysqld



注:三台mysql配置好之后,要重启服务 systemctl restart mysql
将mysql命令和日志软链接到/usr/sbin,便于系统识别
- ln -s /usr/local/mysql/bin/mysql /usr/sbin/
- #mysql命令
- ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
- #mysqlbinlog是节点恢复

- mysql -uroot -p密码
-
- grant replication slave on *.* to 'myslave'@'192.168.62.%' identified by '123456';
- #从数据库同步使用
-
- grant all privileges on *.* to 'mha'@'192.168.62.%' identified by 'manager';
- #manager 使用
-
- #下面三条授权理论上不用添加,但是实验环境通过MHA检查MySQL主从报错,
- 报两个从库通过主机名连接不上主库,所以所有数据库都需要添加以下授权
- 通过mha检查的时候,是通过主机名的形式进行监控,这种情况会容易报错
- 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';
-
- #所有从库开启只读功能(不会对超级管理员super生效,普通用户)
- set global read_only=1;
-
- flush privileges;
- #刷新



扩展(报错):给从服务器授权时,可能会出现密码不符合当前策略要求
- ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
- 您的密码不符合当前策略要求
解决方法:
在数据库配置文件中添加一行,关闭密码策略
validate_password=off

show master status;

- change master to master_host='192.168.162.50',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1745;
-
- start slave;
- show slave status\G


在 Master 主库插入条数据,测试是否同步
- create database test;
- use test;
- create table test(id int,name char(10));
- insert into test values (1,'zhangsan');



- #在所有服务器上安装MHA依赖环境,首先安装epel源,只有安装了源 perl才会有
- #安装epel源,并且不进行gph检查
- yum install epel-release --nogpgcheck -y
-
- #perl针对于mysql数据库
- #从配置文件中提拿其中的值
- #log-日志
- #多线程管理
- #扩展工具CBuilder MakeMaker
- #cpan perl中的数据库
- yum install -y perl-DBD-MySQL \
- perl-Config-Tiny \
- perl-Log-Dispatch \
- perl-Parallel-ForkManager \
- perl-ExtUtils-CBuilder \
- perl-ExtUtils-MakeMaker \
- perl-CPAN


PS:所有服务器都要安装依赖环境,包括MHA manager服务器
MHA 软件包对于每个操作系统版本不一样,这里Centos7.4必须选择0.57版本
在所有服务器上必须先安装node组件,最后在MHA-manager节点上安装manager组件
因为manager依赖node组件。
以下操作所有服务器都要进行
- 以下操作所有服务器都要进行
-
- #同步阿里云时间服务器
- ntpdate ntp.aliyun.com
-
- tar zxvf mha4mysql-node-0.57.tar.gz
- cd mha4mysql-node-0.57
- perl Makefile.PL
- make && make install





在MHA节点上安装manager组件(必须先安装node才能安装manager组件)
- #在MHA节点上安装manager组件(必须先安装node才能安装manager组件)
- tar zxvf /mnt/mha/mha4mysql-manager-0.57.tar.gz
- cd mha4mysql-manager-0.57
- perl Makefile.PL
- make && make install


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线程)

所有服务器都要进行操作
- ssh-keygen -t rsa #一路按回车键
- ssh-copy-id 192.168.62.10
- ssh-copy-id 192.168.62.50
- ssh-copy-id 192.168.62.60
- ssh-copy-id 192.168.62.70





在MHA节点上复制相关脚本到/usr/local/bin目录
- cp -ra /root/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin
-
- #-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容
- #-r: 递归
-
-
- 拷贝后会有四个执行文件
- ll /usr/local/bin/scripts/
-
- master_ip_failover #自动切换时 VIP管理的脚本⭐⭐⭐
- master_ip_online_change #在线切换时 VIP的管理
- power_manager #故障发生后关闭主机的脚本
- send_report #因故障切换后发送报警的脚本
-


- #复制上述的master_ip_failover 到/usr/local/bin目录 这里使用脚本管理VIP
- cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

- #修改master_ip_failover内容(删除原有内容,直接复制)
- vim 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.62.100'; #浮动IP
- my $brdc = '192.168.62.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 ( $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";
- }
-
去除#开头的部分
% s/^#//
PS:第一行添加#

创建MHA软件目录并拷贝配置文件
- mkdir /etc/masterha
- cp /opt/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
- #在线切换VIP工具管理
-
- #以下是密码账号的管理配置
- password=manager
- #设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
- ping_interval=1
- #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
- remote_workdir=/tmp
- #抢救二进制日志保存在/tmp,设置远端mysql在发生切换时binlog的保存位置
- repl_password=123456
- #从节点密码
- repl_user=myslave
- secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.62.60 -s 192.168.62.70
- #指定检查的从服务器IP地址
- shutdown_script=""
- #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
- ssh_user=root
- #设置ssh的登录用户名
- user=mha
- #设置监控用户root
-
- [server1]
- hostname=192.168.62.50
- port=3306
-
- [server2]
- candidate_master=1
- #手动指定 主-备服务器
- hostname=192.168.62.60
- check_repl_delay=0
- #默认情况下如果一个slave落后master 超过100M的relay logs的话,MHA将不会选择该slave作为一个新的master, 因为对于这个slave的恢复需要花费很长时间;通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
- port=3306
-
- [server3]
- hostname=192.168.62.70
- port=3306


- /sbin/ifconfig ens33:1 192.168.62.100/24
- #手动开启虚拟ip

- #测试无密码认证,如果正常会输出successfully
- masterha_check_ssh -conf=/etc/masterha/app1.cnf

错误可能
1、在 manager 节点上配置到所有数据库节点的无密码认证
2、/etc/masterha/app1.cnf文件配置中区域名称错误
- 测试主从复制
- masterha_check_repl -conf=/etc/masterha/app1.cnf


- #启动时会进行日志记录(在后台开启)
- 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 &
-
- 解释:
- ohup //选项
-
- masterha_manager //开启
-
- --conf=/etc/masterha/app1.cnf //指定配置文件
-
- --remove_dead_master_conf //当master服务器失效时,发生主从切换后,会把旧的master的ip从主配置文件删
-
- --ignore_last_failover//忽略故障转移,忽略掉总是宕机不够可靠的服务器
- 在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failove之所以这样限制是为了避免ping-pong效应。该参数代表忽略桑次MHA出发切换产生的文件,默认情况 MHA发生切换后会在日志记录下,也就是上面设置的日志app1.failover.complete文件,
- 下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件:为了方便,这里设为为--ianore_last_failover
- < /dev/null> //生成的所有信息会导到nul1下或者/var/log/masterha/app1/manager.log日志文件中
- 2>&1& //把2错误性的输山从定向为标准性输山,"&"开启后台运行

查看 MHA 状态,可以看到当前的 master 是 master 节点
masterha_check_status --conf=/etc/masterha/app1.cnf

查看 MHA 日志
cat /var/log/masterha/app1/manager.log | grep "current master"

查看master的VIP地址
ifconfig

若要关闭 manager 服务,可以使用如下命令
- masterha_stop --conf=/etc/masterha/app1.cnf
- 或者可以直接采用 kill 进程 ID 的方式关闭
tail -f /var/log/masterha/app1/manager.log

- systemctl stop mysql
-
- #正常自动切换一次后,MHA 进程会退出。HMA 会自动修改 app1.cnf 文件内容,将宕机的 master 节点删除。



- 故障切换备选主库的算法:
- 1、一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主。
-
- 2、数据一致的情况下,按照配置文件顺序,选择备选主库。
-
- 3、设定有权重(candidate_master=1),按照权重强制指定备选主。
- 默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。
- 如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。
-
systemctl restart mysqld

在现主库服务器 slave1(192.168.62.60) 查看二进制文件和同步点

在原主库服务器master(192.168.62.50)执行同步操作
- mysql -uroot -p123456 -e "change master to master_host='192.168.62.60',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=4241;"
- #添加同步新的master
-
- mysql -uroot -p123456 -e "start slave;"
- #开启同步

在 manager 节点上修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)

在manager节点上重启MHA
- masterha_stop --conf=/etc/masterha/app1.cnf
- 停止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
-
- masterha_check_status --conf=/etc/masterha/app1.cnf
- 查看MHAmaster节点


① 作用:mysql的高可用 + 故障切换
② 核心部分:
MHA组件:
③ MHA需要配置的文件(2个):
④ 故障切换mha会做哪些动作:
① 软件连接必须要做
② mysql配置文件,/etc/my.cnf中的建议将中文字符集注释掉
③ 免交互必须得做
③ 五个账号授权(其中三个账号是测试环境需要做的)
④ 初次运行MHA功能是,需要临时添加虚拟IP
⑤ 配置文件–效验 (master_ip_failover 1个故障切换的脚本,app1.cnf mha的主配置文件)
⑥ 先安装node节点 再安装主节点。
⑦ app1.cnf 配置文件中,mysql的二进制文件位置,一定要指对。
⑧ mha的内存,建议4G以上,否则可能导致VIP地址无法漂移
----->新的 master)
④ 故障切换mha会做哪些动作: