一、基于普通主从复制的弊端;MHA能做到在10~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
二、架构
三、软件介绍
MHA软件由两部分组成,Manager工具包和Node工具包
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
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都支持
五、环境说明
db01主机(master)
[root@db01 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@db01 ~]# uname -r
2.6.32-696.el6.x86_64
[root@db01 ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@db01 ~]# getenforce
Disabled
[root@db01 ~]# hostname -I
10.0.0.51 172.16.1.51
db02主机(slave1)
[root@db02 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@db02 ~]# uname -r
2.6.32-696.el6.x86_64
[root@db02 ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@db02 ~]# getenforce
Disabled
[root@db02 ~]# hostname -I
10.0.0.52 172.16.1.52
db03主机(slave1,MHA Manages、Atlas节点)
[root@db03 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@db03 ~]# uname -r
2.6.32-696.el6.x86_64
[root@db03 ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@db03 ~]# getenforce
Disabled
[root@db03 ~]# hostname -I
10.0.0.53 172.16.1.53
三台服务器上都全新安装mysql 5.6.38 :
[root@db01 ~]# mysql --version
mysql Ver 14.14 Distrib 5.6.38, for Linux (x86_64) using EditLine wrapper
五、基于GTID的主从复制配置
主库和从库都要开启binlog
主库和从库server-id必须不同
要有主从复制用户
5.1、配置主从复制
db01 my.cnf文件
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
socket=/tmp/mysql.sock
log-error=/var/log/mysql.log
log-bin=/application/mysql/mysql-bin
binlog_format=row
secure-file-priv=/tmp
server-id=51
skip-name-resolve # 跳过域名解析
gtid-mode=on # 启用gtid类型,否则就是普通的复制架构
enforce-gtid-consistency=true #强制GTID的一致性
log-slave-updates=1 # slave更新是否记入日志(5.6必须的)
relay_log_purge = 0
[mysql]
socket=/tmp/mysql.sock
db02 my.cnf文件
[root@db02 ~]# cat /etc/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
socket=/tmp/mysql.sock
log-error=/var/log/mysql.log
log-bin=/application/mysql/mysql-bin
binlog_format=row
secure-file-priv=/tmp
server-id=52
skip-name-resolve
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
relay_log_purge = 0
[mysql]
socket=/tmp/mysql.sock
db03 my.cnf文件
[root@db03 ~]# cat /etc/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
socket=/tmp/mysql.sock
log-error=/var/log/mysql.log
log-bin=/application/mysql/mysql-bin
binlog_format=row
secure-file-priv=/tmp
server-id=53
skip-name-resolve
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
relay_log_purge = 0
skip-name-resolve
[mysql]
socket=/tmp/mysql.sock
创建复制用户 (51作为主节点,52、53为从)
GRANT REPLICATION SLAVE ON *.* TO repl@'172.16.1.%' IDENTIFIED BY '123';
从库开启复制
change master to
master_host='172.16.1.51',
master_user='repl',
master_password='123',
MASTER_AUTO_POSITION=1;
启动从库复制
start slave;