MHA高可用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MHA高可用相关的知识,希望对你有一定的参考价值。

MHA高可用架构

第1章 高级架构演变:

1.1 高性能架构:

读写分离--->mysql-proxy;atlas;

在主从服务器前增加负载均衡服务器,sql语句进行判断,以实现读写都可以分配给不同的mysql服务器

分库分表--->Mycat;cobar

1.2 高可用架构:

1.      MMM               已经过时

2.      MHA                目前推荐

3.      MGR ; InnoDB cluster  未来的趋势,建议学习

4.      MySQL NDB cluster   不够完善

第2章 MHA的引入

2.1 failover  故障转移:

主库宕机后,备几点要做的事情:

1.      自动监控到工作节点宕机

2.      如果是一主多从结构,需要选择一个能替代原有节点的新节点,(数据最接近原工作节点)作为工作节点

3.      数据补偿:对比从库和原主库的数据差异,进行数据补偿,S2先补偿到S1

4.      需要将剩余节点指向新主库,构成新的主从关系

5.      S1补偿到和原主库一致

a)        ssh能连接上原主库,直接截取保存主库缺失部分binlog

b)        连接不上的话,我们企业中一般会配置binlog server1:1保存主库binlog

6.      加入vip功能,让应用透明化,即用户无感知服务器的切换

第3章 MHA简介:

3.1 MHA软件介绍:

MHA目前在mysql高可用方面是一个相对成熟的解决方案,由日本DeNA公司开发,是一套优秀的作为mysql高可用环境下故障切换的主从提升的高可用软件,mysql故障切换过程中,MHA能做到在10-30秒之内自动完成数据的故障切换动作,兵器在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用

MHA能够在较短的时间内实现自动故障检测和故障转移,通常在10-30秒以内,在复制框架中,MHA能够很好的解决复制过程中数据一致性的问题,由于不需要在现有的replication中添加额外的服务器,仅需要一个manageer节点,而一个manager能管理多套复制方案,所以能大大节约服务器的数量,两台,安装简单,没有性能损耗,以及不需要修改现有的复制部署也是他的优点

MHA还提供在线主库切换的功能,能够安全的奇幻当前运行的胡库到一个新的主库中,大概0.5-2秒内即可完成

MHA软件有两部分组成:MHA Manager(管理节点)MHA Node(数据节点),MHA Manager可以单独部署在一台独立的机器上管理多个主从集群,也可以部署在一台slave节点上,MHANode运行在没他mysql服务器上,MHA Manager会定时探测集群中的master节点,master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他slave重新指向新的master,整个故障转移过程对应用程序完全透明

3.2 MHA工作原理:

1.      保存master上的所有binlog事件

2.      找到含有最新binlog位置点的slave

3.      通过中继日志(relay-log)将数据恢复到其他slave

4.      将包含最新binlog位置点的slave提升为master

5.      将其他从库slave指向新的master,slave,开启主从复制

6.      将保存下来的binlog恢复到新的master

3.3 MHA高可用架构图:

技术分享图片

1.1 MHA工具介绍:

MHA软件由两部分组成,Manager工具包和Node工具包,主要包括以下:

1.1.1 Manager包括:

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

1.1.2 Node包括:

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


1.2 MHA的优点:

1.      自动故障转移

2.      主库崩溃不存在数据不一致的情况

3.      不需要对当前的mysql环境做重大修改

4.      不需要添加额外的服务器

5.      性能优秀,可以工作在半同步和一步复制框架

6.      只要relplication支持的存储引擎MHA都支持

第2章 GTID复制技术说明:

2.1 先决条件:

1.      主库和从库要开启binlog

2.      主库和从库server-id必须不同

3.      要有主从复制用户

2.2 GTID复制技术说明:

1.      GTID简介:

GTID的全称为global transaction identifier 即全局事务标识符,是对于一个已提交事务的编号,并且编号全局唯一

GTID=source_id:transaction_id

source_id用于标识源服务器,server_uuid来表示,这个值在第一次启动时生成,并写入到配置文件data/auto.cnf

transaction_id则是根据在源服务器上第几个提交的事务来确定

2.      GTID事件结构:

技术分享图片

1.      GTID在二进制日志中的结构:

技术分享图片

1.      查看uuid

[[email protected] ~]# cd /application/mysql/data/
[[email protected] data]# cat auto.cnf
[auto]
server-uuid=804b7523-3ec6-11e8-b6de-000c297af7c2
[[email protected] data]# cat /application/mysql/data/auto.cnf
[auto]
server-uuid=f4a983f8-3c06-11e8-a4f3-000c297af7c2

1.1 GTID复制的特点:

1.      整个复制范围内,事务的GTID是一致的

2.      GTID复制时,是自动读取最后一个relay-log事务信息,获取到GTID,从库就按照整个GTID开始自动往后复制,如果relay-log中没有GTID信息,那么从库会去找主库从第一个开始,全量的二进制日志

3.      如果从库是备份恢复搭建的环境,那么从库会从备份结束时的事务ID往后自动复制

4.      GTID复制不支持事务断点

1.2 msyql GTID复制配置:

1.2.1 主库配置文件:

# vi /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
server-id=1
log-bin=mysql-bin
socket=/tmp/mysql.sock
binlog-format=ROW
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1


1.2.2 从库配置文件:

# vi /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
server-id=2
binlog-format=ROW
gtid-mode=on
enforce-gtid-consistency=true
log-bin=mysql-bin
log_slave_updates = 1
socket=/tmp/mysql.sock

1.2.3 配置文件解释:

server-id=x                    # 同一个复制拓扑中的所有服务器的id号必须惟一
binlog-format=RO               # 二进制日志格式,强烈建议为ROW
gtid-mode=on                   # 启用gtid类型,否则就是普通的复制架构
enforce-gtid-consistency=true  # 强制GTID的一致性
log-slave-updates=1            # slave更新是否记入日志


1.2.4 复制用户准备:

mysql>GRANT REPLICATION SLAVE ON *.* TO [email protected]
'10.0.0.%'
 IDENTIFIED BY 
'123'
;

从节点开启复制:

mysql>start slave;
mysql>show slave status\G

1.3 模拟从库写入的报错:

1.      从库执行:

create database nihao;

2.      主库也执行相同命令:

create database nihao;

3.      主库再次之执行后,sql线程宕掉,无法写入:

           Retrieved_Gtid_Set: 94ba1856-3ed2-11e8-b72d-000c291cc733:1-2
            Executed_Gtid_Set: 6e445062-3ed2-11e8-b72c-000c297af7c2:1-3,
94ba1856-3ed2-11e8-b72d-000c291cc733:1           正常绿色部分应该相同


解决:

mysql> stop slave;
mysql> set gtid_next='94ba1856-3ed2-11e8-b72d-000c291cc733:6';
mysql> begin;commit;
mysql> set  gtid_next='AUTOMATIC';
mysql> start slave;

跳过出错的gtid

第2章 搭建MHA高可用架构:

本次MHA部署是基于GTID复制成功构建的,普通的主从复制也可以构建MHA架构

2.1 环境准备:

本次测试共三台服务器:

db01    10.0.0.51
db02    10.0.0.52
db03    10.0.0.53

 

系统基本环境如下:

[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[[email protected] ~]# getenforce
Disabled
[[email protected] ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
[[email protected] ~]# hostname -I
10.0.0.51 172.16.1.51

2.2 修改配置文件:

1.      主节点配置文件:

[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
server-id=1
log-bin=mysql-bin
socket=/tmp/mysql.sock
binlog-format=ROW
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
skip-name-resolve

2.      db02:

[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
server-id=2
binlog-format=ROW
gtid-mode=on
enforce-gtid-consistency=true
log-bin=mysql-bin
log_slave_updates = 1
socket=/tmp/mysql.sock
skip-name-resolve
3.      db03:
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
server-id=3
binlog-format=ROW
gtid-mode=on
enforce-gtid-consistency=true
log-bin=mysql-bin
log_slave_updates = 1
socket=/tmp/mysql.sock
skip-name-resolve

2.3 为了纯净的环境,重新进行了初始化,便于搭建

rm –rf * /appliaction/mysql/data/*
/application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data --user=mysql
/etc/init.d/mysqld start

2.4 主库添加复制用户:

mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected]'10.0.0.%' IDENTIFIED BY '123';

2.4.1 两个从库执行:

mysql> change master to
master_host='10.0.0.51',
master_user='repl',
master_password='123',
master_auto_position=1;
mysql> start slave;

2.5 从库关闭自动清除中继日志

MHA架构中,某些从库的数据恢复依赖于其他从库,所以关闭自动清理relay-log功能

mysql> set global relay_log_purge = 0;        关闭自动清除relay-log
mysql> set global read_only=1;                开启只读模式
vim /etc/my.cnf
[mysqld]
relay_log_purge = 0

2.6 mha所需软件下载地址:

下载mha软件,mha官网 : https://code.google.com/archive/p/mysql-master-ha/

github下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads

2.6.1 安装依赖包:

yum  -y install perl-DBD-MySQL perl-Config-Tiny perl-Params-Validate  perl-CPAN perl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

2.7 所有节点安装node软件包:

tar xf mha4mysql-node-0.56.tar.gz
cd mha4mysql-node-0.56
perl Makefile.PL
make && make install

2.8 所有节点创建mha用户,但是开启了主从,只在主节点创建就可以了

mysql> grant all privileges on *.* to [email protected]'10.0.0.%' identified by 'mha';

在从节点检查确认是否已经都存在了

mysql> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| mha  | 10.0.0.%  |
| repl | 10.0.0.%  |
| root | 127.0.0.1 |
| root | ::1       |
|      | db02      |
| root | db02      |
|      | localhost |
| root | localhost |
+------+-----------+

2.9 配置mysqlbinlogmysql命令软连接到/usr/bin,所有节点都要操作:

不创建软连接的话,检测mha复制情况的时候会报错

ln -s /application/mysql/bin/mysqlbinlog  /usr/bin/mysqlbinlog
ln -s /application/mysql/bin/mysql /usr/bin/mysql

2.10 部署manager节点,建议部署在从节点:

1.      安装依赖

yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

2.      安装manager软件

tar xf mha4mysql-manager-0.56.tar.gz
 cd mha4mysql-manager-0.56
 perl 
Makefile.PL
 make && make install

3.      创建必须目录:

mkdir -p /var/log/mha/app1
mkdir -p /etc/mha

4.      编写mha-manager配置文件

[[email protected] mha4mysql-manager-0.56]# vim /etc/mha/app1.cnf
 [server default]                       
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/data/mysql
user=mha
password=mha
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root
 
[server1]                  按照这个顺序进行宕机的切换
hostname=10.0.0.51
port=3306
 
[server2]
hostname=10.0.0.52
port=3306
 
[server3]
hostname=10.0.0.53
port=3306

2.11 配置互信,每台机器上都要做:

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]

 

2.11.1 检测互信:

[[email protected] bin]# ssh 10.0.0.51 date
Fri Apr 13 16:13:26 CST 2018
[[email protected] bin]# ssh 10.0.0.52 date
Fri Apr 13 16:13:28 CST 2018
[[email protected] bin]# ssh 10.0.0.53 date
Fri Apr 13 16:13:26 CST 2018

2.12 MHA启动前检测:

masterha_check_ssh  --conf=/etc/mha/app1.cnf
Fri Apr 13 16:23:33 2018 - [debug]  Connecting via SSH from [email protected](10.0.0.53:22) to [email protected](10.0.0.52:22)..
Fri Apr 13 16:23:33 2018 - [debug]   ok.
Fri Apr 13 16:23:34 2018 - [info] All SSH connection tests passed successfully.

2.13 启动mha:

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
[[email protected] mha]# ps -ef |grep mha
root       4191   2644 11 16:42 pts/1    00:00:00 perl /usr/local/bin/masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover

第3章 故障模拟:

3.1 发生故障

1.      停掉master节点:

[[email protected] .ssh]# /etc/init.d/mysqld stop

2.      db02已经变为主节点:

mysql> show slave status;
Empty set (0.00 sec)
 
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000004 |      440 |              |                  | 6e445062-3ed2-11e8-b72c-000c297af7c2:1-2 |
+------------------+----------+--------------+------------------+------------------------------------------+

3.      MHA Manager节点查看:

MHA 守护进程已经帮我们把主节点切换到db02

Started automated(non-interactive) failover.
Selected 10.0.0.52(10.0.0.52:3306) as a new master.
10.0.0.52(10.0.0.52:3306): OK: Applying all logs succeeded.
10.0.0.53(10.0.0.53:3306): OK: Slave started, replicating from 10.0.0.52(10.0.0.52:3306)
10.0.0.52(10.0.0.52:3306): Resetting slave info succeeded.
Master failover to 10.0.0.52(10.0.0.52:3306) completed successfully.

3.2 故障修复:

1.      修复故障库,并重新启动:

2.      在日志中找出change master to 语句,将修复好的故障库加入主从架构中,作为新主库的从库,MHA将不会切换主库

[[email protected] app1]# cat manager|grep -i 'change master to'
Fri Apr 13 16:49:09 2018 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='xxx';

3.      登录到修复好的故障库,执行change master to

CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';
Query OK, 0 rows affected, 2 warnings (0.09 sec)
 
mysql> start slave;

4.      修改MHA配置文件,server标签重新添加回去,故障库宕机后,mha会自动把server标签删除

vim /etc/mha/app1.cnf
[server1] hostname=10.0.0.51 port=3306

5.      重新启动mha服务


以上是关于MHA高可用的主要内容,如果未能解决你的问题,请参考以下文章

玩转MHA高可用集群

Mha-Atlas-MySQL高可用

MHA高可用集群部署及故障切换

MySQL-高可用架构MHA

MySQL-高可用架构MHA

1.Mysql之MHA高可用(01)