目录
3.1、master、slave1、slave2安装mysql服务,之前博客有编译安装教程
3.2、master、slave1、slave2上配置my.cnf
3.3、在master、slave1、slave2上分别做两个软链接
一、MHA概述
1、简介
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,MHA是由
日本人开发,是一套优秀的MySQL故障切换和主从复制的高可用软件。
在MySQL故障切换的过程中,MHA能做到0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能够最大程度上保证数据库的一致性,以达到真正意义上的高可用。
MHA里有 两个角色一个是MHA Node(数据节点)另一个是MHA Manager(管理节点)。MHA Manager可以单独部署 在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台 MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新 数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
2、MHA特点
自动故障切换过程中,MHA总会试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失。
但这并不总是可行,例如如果主服务器硬件故障或者无法通过ssh访问,MHA则无法保存二进制日志,只能进行故障转移而丢失了最新的数据。此时,使用MySQL5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性,有时候可故意设置从节点慢于主节点,当发生意外删除数据库倒是数据丢失时可从从节点二进制日志中恢复。
3、何为高可用
高可用就是可用性强,在一定条件下(某个服务器出错或宕机)可以保证服务器可以正常运行,在一定程度上不会影响业务的运行。
4、故障切换过程
当主服务器出现错误时,被manager服务器监控到主库mysqld服务停止后,首先对主库进行SSH登录检查(save_binary_logs -command=test),然后对mysqld服务进行健康检查(PING(SELECT)每个3秒检查一次,持续3次),最后作出Master is down!的判断,master failover开始进行对应的处理
二、MHA高可用架构部署
安装包下载:
https://download.csdn.net/download/m0_62948770/86724795
1、架构图
2、 实验环境:需要四台Centos7服务器
①一台作为mha服务器(manager)来监控管理下面的MySQL服务器
②三台:一主两从MySQL服务器
主机 | IP |
---|---|
manager | 192.168.159.13 |
master | 192.168.159.68 |
slave1 | 192.168.159.11 |
slave2 | 192.168.159.10 |
实验流程:
安装编译环境——> 安装MySQL5.6.36数据库——>配置时间同步——>配置主从复制与储备MySQL服务器——>安装node工具——>配置mha服务器——>测试验证
3、实验部署
3.1、master、slave1、slave2安装mysql服务,之前博客有编译安装教程
3.2、master、slave1、slave2上配置my.cnf
修改master的配置文件my.cnf
[root@master ~]# vim /etc/my.cnf
[client]
port = 3306
#default-character-set=utf8 ## 注销字符集
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
#default-character-set=utf8 ## 注销字符集
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
#character_set_server=utf8 ## 注销字符集
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
##增加内容
log_bin = master-bin
log-slave-update = true
修改slave1的配置文件my.cnf
[root@slave1 ~]# vim /etc/my.cnf
[client]
port = 3306
#default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
#default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
#character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id =2 ## 修改为2
log_bin = master-bin ## 开启二进制日志
relay-log = relay-log-bin ## 使用中继日志进行同步
relay-log-index = slave-relay-bin.index ## 索引
修改slave2的配置文件my.cnf
[root@zew_slave2 ~]# vim /etc/my.cnf
[client]
[mysql]
port = 3306
#default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
#character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 3
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
3.3、在master、slave1、slave2上分别做两个软链接
############ 只做master上的配置演示了 ###########################
[root@master ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin
[root@master ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin
3.4、重启3台MySQL服务,再查看端口,是否启动成功
[root@master ~]# systemctl restart mysqld.service ## 只演示master节点了
[root@master ~]# netstat -natp | grep 3306
tcp6 0 0 :::3306 :::* LISTEN 10503/mysqld
3.5、配置主从复制
在所有数据库节点上授权两个用户,一个是从数据库同步使用用户myslave,另一个是manager 使用用户mha
grant replication slave on *.* to 'myslave'@'192.168.159.%' identified by '123456';
grant all privileges on *.* to 'mha'@'192.168.159.%' identified by 'manager';
下面三条授权理论上不用添加,但是实验环境通过MHA检查MySQL主从报错,报两个从库通过主机名连接不上主库,所以所有数据库都需要添加以下授权,通过mha检查的时候,是通过主机名的形式进行监控,这种情况会容易报错。
grant all privileges on *.* to 'mha'@'master' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
把从库均设为只读功能:set global read_only=1;
master
[root@master ~]# mysql -uroot -pabc123
mysql> grant replication slave on *.* to 'myslave'@'192.168.159.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> grant all privileges on *.* to 'mha'@'192.168.159.%' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'master' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
slave1