MHA高可用

MHA简介

MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。
在MySQL故障切换过程中,MHA能做到在10~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。

MHA功能

MHA能够在较短的时间内实现自动故障检测和故障转移,通常在10-30秒以内;
在复制框架中,MHA能够很好地解决复制过程中的数据一致性问题,由于不需要在现有的 replication中添加额外的服务器,仅需要一个manager节点,而一个Manager能管理多套复制,所以能大大地节约服务器的数量
另外,安装简单,无性能损耗,以及不需要修改现 有的复制部署也是它的优势之处。
MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中 (通过将从库提升为主库),大概0.5-2秒内即可完成。
MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

MHA工作原理

工作原理说明:
1、保存master上的所有binlog事件
2、找到含有最新binlog位置点的slave
3、通过中继日志将数据恢复到其他的slave
4、将包含最新binlog位置点的slave提升为master
5、将其他从库slave指向新的master原slave01 并开启主从复制
6、将保存下来的binlog恢复到新的master上

MHA工具介绍

MHA软件由两部分组成,Manager工具包和Node工具包

masterha_check_ssh               #检査 MHA 的 ssh-key
masterha_check_repl              #检査主从复制情况
masterha_manger                  #启动MHA
masterha_check_status            #检测MHA的运行状态^
masterha_mast er_monitor         #检测master是否宕机
masterha_mast er_switch          #手动故障转移—
masterha_conf_host               #手动添加server倍息
masterha_secondary_check         #建立TCP连接从远程服务器v
masterha_stop                    #停止MHA 

Node工具包主要包括以下几个工具:

save_binary_1ogs                 #保存宕机的master的binlog
apply_diff_relay_logs            #识别relay log的差异
filter_mysqlbinlog               #防止回滚事件一MHA已不再使用这个工具
purge_relay_logs                 #清除中继曰志一不会阻塞SQL线程 

MHA的优点

1、自动故障转移
2、主库崩溃不存在数据不一致的情况
3、不需要对当前的mysql环境做重大修改
4、不需要添加额外的服务器
5、性能优秀,可以工作再半同步和异步复制框架
6、只要replication支持的存储引擎mha都支持

MHA部署

本次部署包括 mysql主从同步+MHA高可用+keepalived
mha版本0.56
数据库5.7

机器名 IP地址 功能划分
db01 172.16.1.51 主 keepalived node
db02 172.16.1.52 从 keepalived node
db03 172.16.1.53 从 manager node

基础环境部署

基础内容

关闭防火墙和selinux

systemctl stop firewalld && setenforce 0

下载数据库
安装mysql, 默认5.7版本, 使用本地yum源下载

yum install mysql-community-server -y

修改配置文件

修改配置文件/etc/my.cnf server-id 以IP最后一段命名
db01的内容

[root@db01 ~]# vi /etc/my.cnf   #使用vi打开
[mysqld]
server-id=51
log-bin = master-log
relay-log = relay-log
skip_name_resolve  

db02的内容

[root@db02 ~]# vi /etc/my.cnf
server-id=52
relay-log = relay-log
log-bin = master-log
read_only = ON
relay_log_purge = 0
skip_name_resolve
log_slave_updates = 1

db03的内容

[root@db03 ~]# vi /etc/my.cnf
[mysqld]
server-id = 53
relay-log = relay-log
log-bin = master-log
read_only = ON
relay_log_purge = 0
skip_name_resolve
log_slave_updates = 1

启动数据库, 并加入开机自启动

systemctl start mysqld && systemctl enable mysqld

修改密码及导入数据
修改密码

登陆mysql数据库  [password中填写上一步过滤的密码]
mysql -uroot -p$(awk '/temporary password/{print $NF}' /var/log/mysqld.log)
修改数据库密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Bgx123.com';
mysql> exit

导入原先的数据(三台机器都要操作)

mysql -uroot -pBgx123.com < /tmp/db-all.sql  #导入原有的数据库即可

然后重启mysql

systemctl restart mysqld

增加用户

db01主库的操作

[root@db01 ~]# mysql -uroot -pBgx123.com
mysql> grant all on *.* to 'all'@'%' identified by 'Bgx123.com';   #这个是配置远程连接规则
mysql> grant replication slave, replication client  on *.*
to 'rep'@'172.16.1.%' identified by 'Rep123.com';  #授权, 允许能够远程连接的主机(replicaiton)
mysql> flush privileges;

在 master 上进行授权
在所有 Mysql进行授权
拥有管理权限的用户可在本地网络中有其他节点上远程访问。 mha为manager管理用户

mysql> grant all on *.* to 'mha'@'172.16.%.%' identified by 'Bgx123.com';  #所有数据库都要进行授权
mysql> flush privileges;
#mysql 新设置用户或更改密码后需用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问

安装MHA软件

(在三个节点上都装mha的node软件)
在db03(manager监控端)安装manager

[root@db01 ~]# ll
-rw-r--r--  1 root root 36326 Oct 24 20:11 mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db02 ~]# ll
-rw-r--r--  1 root root 36326 Oct 24 20:11 mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db03 ~]# ll
-rw-r--r--  1 root root 87119 Oct 24 20:11 mha4mysql-manager-0.56-0.el6.noarch.rpm
-rw-r--r--  1 root root 36326 Oct 24 20:11 mha4mysql-node-0.56-0.el6.noarch.rpm

首先要确保yum源有base源和epel源而且可以上网
因为mha安装会安装依赖

[root@db02 ~]# ll /etc/yum.repos.d/
-rw-r--r-- 1 root root 2523 Sep  4 17:06 CentOS-Base.repo
-rw-r--r-- 1 root root  664 Sep  4 17:06 epel.repo

然后直接使用yum install 安装
db03 manager node都要安装 其他两台只安装node

 [root@db01 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@db02 ~]# yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db03 ~]# yum install mha4mysql-manager-0.56-0.el6.noarch.rpm
[root@db03 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm

配置manager

mha配置文件内容

[root@db03 ~]# mkdir /etc/mha_master/
[root@db03 ~]# cat /etc/mha_master/mha.cnf
[server default]
user=mha
password=Bgx123.com
manager_workdir=/etc/mha_master/app1
manager_log=/etc/mha_master/manager.log
remote_workdir=/mydata/mha_master/app1
ssh_user=root
repl_user=rep
repl_password=Rep123.com
ping_interval=1
[server1]
hostname=172.16.1.51
port=3306
candidate_master=1
[server2]
hostname=172.16.1.52
port=3306
candidate_master=1
#[server3]
#hostname=172.16.1.53
#port=3306
#candidate_master=1

配置三台机器的ssh互信(三台都要操作)在配置MHA会要求三台数据库无密码通信

ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.51
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.52
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.31
#测试是否成功
ssh 172.16.1.52   不用输入密码就证明成功

指向Master 只在db02 db03操作
在两个salve节点(从库)上执行,只读限制(防止意外被写数据,很重要)

mysql> set global read_only=1;
mysql> change master to-> master_host='172.16.1.51',-> master_user='rep',-> master_password='Rep123.com';
mysql> start slave;
mysql> show slave status\G; #查看slave IO和slave sql是否都正常 Yes就是正常的Slave_IO_Running: YesSlave_SQL_Running: Yes

测试配置

测试连通性

[root@db03 ~]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf  #最后一行如下图即为成功

确认上一步连通性没问题后开始下一步检查
检查管理的MySQL复制集群的连接配置参数是否OK

[root@db03 ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf

底部显示OK即为正常

配置VIP漂移

配置Keepalived

使用keepalived做VIP转移
keepalived只在 db01 db02上安装

[root@db01 ~]# yum install keepalived -y
[root@db02 ~]# yum install keepalived -y

keepalived db01的配置文件内容

[root@db01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {     router_id db01
}
vrrp_instance VI_1 {state MASTERinterface eth1virtual_router_id 50priority 150advert_int 1authentication {auth_type PASSauth_pass 1111
}virtual_ipaddress {172.16.1.66/24 dev eth1}
}

启动keepalived

systemctl start keepalived.service

keepalived db02的配置文件内容

[root@db02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {router_id db02
}
vrrp_instance VI_1 {state BACKUPinterface eth1virtual_router_id 50priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.16.1.66/24 dev eth1}
}

配置完不要忘记启动

systemctl start keepalived.service

配置脚本内容

写入脚本内容(我们使用的yum安装 没有自带的脚本 所以自己写)见文件包内

[root@db03 ~]# cat /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 = '172.16.1.66';
my $ssh_start_vip = "systemctl start keepalived";
my $ssh_stop_vip = "systemctl stop keepalived";
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";
}

给脚本增加执行权限不然会报错

[root@db03 ~]# chmod +x /usr/local/bin/master_ip_failover

在db03的配置文件内加入一行(在原有内容的基础上增加)

[root@db03 ~]# vim /etc/mha_master/mha.cnf
master_ip_failover_script= /usr/local/bin/master_ip_failover

测试连通性

[root@db03 ~]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf

测试配置

[root@db03 ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf

启动mha (在db03上执行)

nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &
[1] 13530  #这个号码每次都会不一样
[root@db03 ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:13530) is running(0:PING_OK), master:172.16.1.51

上面的信息中“mha (pid:13530) is running(0:PING_OK)”表示MHA服务运行OK,否则, 则会显示为类似“mha is stopped(1:NOT_RUNNING).”

如果,我们想要停止 MHA ,则需要使用 stop 命令:
[root@manager ~]# masterha_stop -conf=/etc/mha_master/mha.cnf

测试 MHA 故障转移

先在db03打开日志

[root@db03 ~]# tail -f /etc/mha_master/manager.log

主库 db01 关闭 mariadb 服务,模拟主节点数据崩溃

[root@db01 ~]# systemctl stop mysqld

转移后的恢复

重新启动主库后
db01的操作(不要忘记重启)

[root@db01 ~]# systemctl start mysqld
[root@db01 ~]# systemctl start keepalived.service 

在从库上执行以下命令(重新设置从库)

mysql> stop slave;
mysql> reset slave;
mysql> CHANGE MASTER TOMASTER_HOST=' 172.16.1.51',MASTER_USER='rep',MASTER_PASSWORD=' Rep123.com',MASTER_PORT=3306,MASTER_LOG_FILE='master-log.000005',MASTER_LOG_POS=154;
mysql> start slave;
mysql> show slave status\G;

db03的操作 (重新启动mha之前一定要删除这个目录下的文件 不然下次转移报错)

[root@db03 ~]# rm -f  /etc/mha_master/app1/*

检查

[root@db03 ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf

重新启动

nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &

转载于:https://www.cnblogs.com/wenrulaogou/p/9880925.html

MHA高可用 MHA+Keepalive相关推荐

  1. GTID主从复制 MHA高可用 binlogserver实时备份 Atlas中间件读写分离

    GTID主从复制 什么是GTID 从MySQL 5.6.2 开始新增了一种基于 GTID 的复制方式,用以替代以前传统的复制方式,到MySQL5.6.10后逐渐完善. 通过 GTID 保证了每个在主库 ...

  2. mysql(三)路由器读写分离、MHA高可用

    1 mysql 路由器实现读写分离 简介: MySQL 路由器是 InnoDB 集群的一部分,是轻量级中间件,可在应用程序和后端 MySQL 服务器之间提供透明路由.它可用于各种用例,例如通过有效地将 ...

  3. mysql高可用MHA

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

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

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

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

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

  6. 基于CentOS7,MySQL5.7的高可用MHA架构搭建实战

    基于CentOS7,MySQL5.7的高可用MHA架构搭建实战 MHA 架构搭建 一 .MHA架构 MHA(Master High Availability)是一套比较成熟的 MySQL 高可用方案, ...

  7. mysql主主复制和mha_MySQL第二章主从复制MHA高可用

    1.主从复制架构演变介绍 1.1基础结构 1)一主一从 2)一主多从 3)多级主从 4)双主 5)循环复制 1.2高级应用架构演变 1.2.1高性能架构 1)读写分离架构(读性能较高) 代码级别 My ...

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

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

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

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

最新文章

  1. php采集 纠正一下
  2. Sequelize框架
  3. Python中按值来获取指定键的两种方法
  4. arm的存储保护单元MPU
  5. C# 实现一个基于值相等性比较的字典
  6. Orleans解决并发之痛(一):单线程
  7. centos mount 用法_linux screen的用法 - mouseleo
  8. axure,购物车数量递增或递减
  9. 用python画圣诞树-圣诞节!教你用 Python 画棵圣诞树
  10. 关于点击button按钮自动刷新页面导致ajax来不及执行的原因
  11. java字符串反转异或_字符串反转总结】Java中七种方法实现
  12. CASS10.1软件在windows10中细等线等字体显示不出来的解决方案
  13. Java基础 - 易错知识点整理(待更新)
  14. 【IDEA】IDEA怎么汉化汉化后怎么转回英文
  15. Linux操作系统中常用软件包的下载命令
  16. 系统研发类项目标书制作流程--标书该怎么做?
  17. html清除图层,ps按delete不能删除图层怎么办?
  18. My IDEA Keymap
  19. Python中的while循环
  20. 【网络科普】宽带电缆 vs DSL vs 光纤

热门文章

  1. ubuntu测量机器的温度
  2. VIOS 的一些常用命令
  3. agent python实现 建模_零基础三天学会Python爬虫(第二天)
  4. 入门教程:.NET开源OpenID Connect 和OAuth解决方案IdentityServer v3 介绍 (一)
  5. Oracle中wm_concat函数报错解决方法
  6. 通过手动抛自定义异常实现spring事务回滚
  7. spark集群搭建整理之解决亿级人群标签问题
  8. 使用Idea部署SSM项目后,访问路径为url:8080/项目名_war_exploded的解决方案
  9. IDEA Debug 无法进入断点的解决方法
  10. 将PHP对象转换为关联数组