MYSQL-MHA 高可用环境搭建
环境 | 版本 |
---|---|
操作系统:Centos 7 x86_64 | 7 |
虚拟机:VMware | 12.5 |
远程连接:XShell | 5.0 |
数据库:msql | 5.7.28 |
二、整体架构
MHA环境由MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,这里管理一个数据集群。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
主机IP | 角色 | server-id | |
---|---|---|---|
192.168.44.3 | master | 1 | 主库 |
192.168.44.4 | slave1 | 2 | 从库 |
192.168.44.6 | slave2 | 3 | 从库 |
192.168.44.5 | manager | 监控 |
centos01:master
centos02,04:slave
centos03: mha
三、MySQL主从搭建
3.1、环境准备
从官网下载mysql5.7.28:
wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
当然也可以从国内镜像下载各个安装文件。
3.2、绑定主节点
MYSQL切换master:
change master to master_host='192.168.44.3',master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000002',master_log_pos=586;
start slave;
show slave status \G;
重启数据库:
systemctl start mysqld
四、MHA高可用搭建
4.1、环境准备
4.1.1、主机SSH互通
在四台服务器上分别执行下面命令,生成公钥和私钥。
ssh-keygen -t rsa
在三台MySQL服务器分别执行下面命令,将公钥拷贝到MHA Manager服务器上。
ssh-copy-id 192.168.44.5
检查四台机器之间是否ssh互通,各个机器都进行检查,如果不通,则通过ssh-copy-id命令将公钥复制给相应的机器。
ssh 192.168.44.5
4.1.2、MHA下载
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58
下载后将manager和node的安装包分别上传到对应服务器。
三台MySQL服务器需要安装node,MHA Manager服务器需要安装manager和node。
4.2、MHA安装
4.2.1、MHA Node安装
四台服务器上都需要安装mha4mysql-node。MHA的Node依赖于perl-DBD-MySQL,所以要先安装perl-DBD-MySQL。
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
4.2.2、MHA Manager安装
在MHA Manager服务器安装mha4mysql-manager。
mha4mysql-manager又依赖了perl-Config-Tiny、perl-Log-Dispath、perl-Parallel-ForkManager,也分别进行安装,接下来安装epel环境。
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm -y
yum install perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y
4.3、MHA配置
MHA Manager服务器需要为每个监控的Master/Slave集群提供一个专用的配置文件,而所有的Master/Slave集群也可以共享全局配置。
4.3.1、初始化配置目录
#目录说明
#/var/log (Centos目录)
# /mha (MHA监控根目录)
# /app1 (MHA监控实例根目录)
# /manager.log (MHA监控实例日志文件)
mkdir -p /var/log/mha/app1
touch /var/log/mha/manager.log
4.3.2、配置监控全局配置文件
vim /etc/masterha_default.cnf
[server default]
#用户名
user=root
#密码
password=root
#ssh登录账号
ssh_user=root
#主从复制账号
repl_user=root
#主从复制密码
repl_password=root
#设置监控主库,发送ping包的时间间隔
ping_interval=1
#设置发生切换之后发送的报警脚本
#report_script=/usr/local/send_report
#二次检查的主机,实现多路监测master的可用性
secondary_check_script=masterha_secondary_check -s 192.168.44.3 -s 192.168.44.4 -s 192.168.44.5
4.3.3、配置监控实例配置文件
vim /etc/mha/app1.cnf
[server default]
#MHA监控实例根目录
manager_workdir=/var/log/mha/app1
#MHA监控实例日志文件
manager_log=/var/log/mha/app1/manager.log
#[serverx] 服务器编号
#hostname 主机名
#candidate_master 可以做主库
#master_binlog_dir binlog日志文件目录
[server1]
hostname=192.168.44.3
candidate_master=1
master_binlog_dir="/var/lib/mysql"
[server2]
hostname=192.168.44.4
candidate_master=1
master_binlog_dir="/var/lib/mysql"
[server3]
hostname=192.168.44.5
candidate_master=1
master_binlog_dir="/var/lib/mysql"
4.4、MHA配置检测
4.4.1、执行SSH通信检测
在MHA Manager服务器上执行:
masterha_check_ssh --conf=/etc/mha/app1.cnf
4.4.2、检测MySQL主从复制
在MHA Manager服务器上执行:
masterha_check_repl --conf=/etc/mha/app1.cnf
出现了“MySQL Replication Health is OK.”说明集群没有问题。
4.5、启动 MHA manager
在MHA Manager服务器上执行:
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover /var/log/mha/app1/manager.log 2>&1 &
//查看任务是否启动成功
jobs
[1]+ Running nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover /var/log/mha/app1/manager.log 2>&1 &
启动命令参数说明
--remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。
--manger_log 日志存放位置
--ignore_last_failover 在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面我设置的/data产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。
查看监控状态命令:
masterha_check_status --conf=/etc/mha/app1.cnf
查看监控日志命令:
tail -f /var/log/mha/app1/manager.log
4.6、测试MHA故障转移
4.6.1、模拟主节点奔溃
master上停止mysql服务。
systemctl stop mysqld
五、测试SQL脚本
5.1、创建lagou数据库
mysql> create database lagou;
Query OK, 1 row affected (0.01 sec)
mysql> use lagou;
5.2、创建Position表
mysql> create table position ( id int(20) primary key, name varchar(50), salary varchar(20), city varchar(50) ) ENGINE=innodb charset=utf8;
Query OK, 0 rows affected (0.01 sec)
往Position表中插入记录:
mysql> insert into position values(1,'Java',13000,'shanghai');
Query OK, 1 row affected (0.01 sec)
mysql> insert into position values(2,'DBA',20000,'beijing');
Query OK, 1 row affected (0.00 sec)
5.3、创建Position_detail表
create TABLE position_detail (id int(20) primary key,pid int(20),description text) ENGINE=innodb charset=utf8;
Query OK, 0 rows affected (0.01 sec)
往position_detail表中插入数据:
mysql> insert into position_detail values(1,1,'JAVA Developer');
Query OK, 1 row affected (0.00 sec)
mysql> insert into position_detail values(2,2,'Database Administrator');
Query OK, 1 row affected (0.01 sec)