MySQL高可用配置与MHA集群
一、MHA概述
1、什么是MHA
MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。
MHA 的出现就是解决MySQL 单点故障的问题。
MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。
MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。
2、MHA 的组成
(1)MHA Node(数据节点)
MHA Node 运行在每台 MySQL 服务器上。
(2)MHA Manager(管理节点)
-
MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上。
-
MHA Manager 会定时探测集群中的 master 节点。当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master, 然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。
3、MHA 的特点
自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失。
使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将
最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。
目前MHA支持一主多从架构,最少三台服务器,即一主两从。
二、MHA搭建准备
1、MHA架构:
- 数据库安装
- 一主两从
- MHA搭建
2、故障模拟:
- 主库失效
- 备选主库成为主库
- 原故障主库恢复重新加入到MHA成为从库
实验环境:
Master:192.168.10.130
Slave1:192.168.10.132
Slave2:192.168.10.133
MHA manager:192.168.10.134
实验图示:
三、实战MySQL高可用
1、关闭所有机子的防火墙 核心防护 安装数据库,准备主从复制
[root@Master ~]#systemctl stop firewalld
[root@Master ~]#setenforce 0
[root@Slave1 ~]#systemctl stop firewalld
[root@Slave1 ~]#setenforce 0
[root@Slave2 ~]#systemctl stop firewalld
[root@Slave2 ~]#setenforce 0
[root@MHA ~]#systemctl stop firewalld
[root@MHA ~]#setenforce 0
2、修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf
###########Master节点###########
vim /etc/my.cnf
[mysqld]
server_id=130
log-bin=/data/mysql/mysql-bin
skip_name_resolve=1
general_log
[root@Master ~]#mkdir /data/mysql/ -p #建立文件夹
[root@Master ~]#chown mysql.mysql /data/ -R #修改权限
[root@Master ~]#systemctl restart mysqld #重启服务
[root@Master ~]#mysql -uroot -pAdmin@123 #进入数据库
grant replication slave on *.* to test@'192.168.10.%' identified by 'Admin@123'; #建立复制用户
grant all on *.* to mhauser@'192.168.10.%' identified by 'Admin@123'; #建立mha管理账户
mysql> show master status; #节点查看二进制文件和同步点
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 742 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> select user,host from mysql.user;
############Slave1节点##########
vim /etc/my.cnf
server_id=132
log-bin=/data/mysql/mysql-bin
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
skip_name_resolve=1
general_log
[root@Slave1 ~]#mkdir /data/mysql -p #建立文件夹
[root@Slave1 ~]#chown mysql.mysql /data/ -R #修改权限
[root@Slave1 ~]#systemctl restart mysqld #重启
[root@Slave1 ~]#mysql -uroot -pAdmin@123 #进入数据库
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.10.130',
MASTER_USER='test',
MASTER_PASSWORD='Admin@123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=742;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
grant replication slave on