一、MHA
1.1.简介:
MHA(Master High Availability)在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用. 该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
1.2.MHA优点
1:主从切换非常迅速,通常10-30s
2:最大程度上解决数据一致性的问题
3:不需要修改当前已有的MySQL架构和配置
4:不需要另外多余的服务器
5:没有性能损耗
6:没有存储引擎限制
7:默认有异步复制和半同步复制
1.3MHA故障切换流程:
(1)从宕机崩溃的master保存二进制日志事件(binlog events);
(2)识别含有最新更新的slave;
(3)应用差异的中继日志(relay log)到其他的slave;
(4)应用从master保存的二进制日志事件(binlog events);
(5)提升一个slave为新的master;
(6)使其他的slave连接新的master进行复制;
1.4.MHA组成
(1)Manager工具:
– masterha_check_ssh : 检查MHA的SSH配置。
– masterha_check_repl : 检查MySQL复制。
– masterha_manager : 启动MHA。
– masterha_check_status : 检测当前MHA运行状态。
– masterha_master_monitor : 监测master是否宕机。
– masterha_master_switch : 控制故障转移(自动或手动)。
– masterha_conf_host : 添加或删除配置的server信息。
(2)Node工具(这些工具通常由MHAManager的脚本触发,无需人手操作)。
– save_binary_logs : 保存和复制master的二进制日志。
– apply_diffff_relay_logs : 识别差异的中继日志事件并应用于其它slave。
– fifilter_mysqlbinlog : 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)。
– purge_relay_logs : 清除中继日志(不会阻塞SQL线程)。
(3)自定义扩展:
-secondary_check_script:通过多条网络路由检测master的可用性;
-master_ip_failover_script:更新application使用的masterip;(需要修改)
-shutdown_script:强制关闭master节点;
-report_script:发送报告;
-init_conf_load_script:加载初始配置参数;
-master_ip_online_change:更新master节点ip地址;(需要修改)
二、MySQL&MHA环境准备及步骤
主机名 | ip | server_id | 角色 |
---|---|---|---|
mha-master | 192.168.200.101 | 1 | mha-node&mysql-master |
mha-slave1 | 192.168.200.102 | 2 | mha-node&mysql-slave |
mha-slave2 | 192.168.200.103 | 3 | mha-node&mysql-slave |
mha-manager | 192.168.200.104 | 无 | mha-manager&mha-node |
1.配置基础环境
//四台环境一致
cat /etc/redhat-release
ping -c 4 baidu.com
[root@localhost ~]# sestatus
SELinux status: disabled
iptables -nvL
[root@localhost ~]# ulimit -n
65535
[root@localhost ~]# hostname --all-ip
192.168.200.101
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 113M 1.5G 9.6M 217M 1.5G
Swap: 3.9G 0B 3.9G
#关闭防火墙&安全机制
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
2.修改主机名&生成密钥
//host1-host4
hostnamectl set-hostname mha-master && bash
hostnamectl set-hostname mha-slave1 && bash
hostnamectl set-hostname mha-slave2 && bash
hostnamectl set-hostname mha-manager && bash
ssh-keygen -t rsa
ssh-copy-id mha-master
ssh-copy-id mha-slave1
ssh-copy-id mha-slave2
ssh-copy-id mha-manager
3.修改四台主机hosts同步
[root@mha-manager ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.200.101 mha-master
192.168.200.102 mha-slave1
192.168.200.103 mha-slave2
192.168.200.104 mha-manager
//ping测试
[root@mha-manager ~]# for i in {master,slave1,slave2,manager}; do ping -c 1 mha-$i; done
4.安装MySQL host1~host3
yum install -y http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install --nogpgcheck mysql-community-server
5.修改配置文件启动 host1~host3
[root@mha-master ~]# cp /etc/my.cnf{,.back}
[root@mha-master ~]# mkdir -pv /data/mysql/logs
mkdir: 已创建目录 "/data"
mkdir: 已创建目录 "/data/mysql"
mkdir: 已创建目录 "/data/mysql/logs"
[root@mha-master ~]# chown -R mysql:mysql /data/mysql/
//这条命令很长,注意到最后 修改server-id=1 主从顺序
[root@mha-master ~]# cat >> /etc/my.cnf << EOF
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysql]
port=3306
bind-address=0.0.0.0
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
character_set_server=utf8
init_connect='SET NAMES utf8'
user = mysql
datadir=/data/mysql/data
socket=/var/lib/mysql/mysql.sock
max_connections = 2000
relay-log=/data/mysql/data/relay-log
log-bin=/data/mysql/data/mysql-bin
max_binlog_size = 500M
binlog_cache_size = 128K
binlog-ignore-db = mysql
expire_logs_days = 7
binlog_format=