1、简介node
MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover (自动化主故障转移)功能。MHA 在监控到 master 节点故障时,会提高其中拥有最新数据的 slave 节点成为新的master 节点,在此期间,MHA 会经过于其它从节点获取额外信息来避免一致性方面的问题。MHA 还提供了 master 节点的在线切换功能,即按需切换 master/slave 节点。 python
MHA 是由日本人 yoshinorim(原就任于DeNA现就任于FaceBook)开发的比较成熟的 MySQL 高可用方案。MHA 可以在30秒内实现故障切换,并能在故障切换中,最大可能的保证数据一致性。目前淘宝也正在开发类似产品 TMHA, 目前已支持一主一从。mysql
2、MHA服务linux
2.一、服务角色sql
MHA 服务有两种角色, MHA Manager(管理节点)和 MHA Node(数据节点):数据库
MHA Manager:一般单独部署在一台独立机器上管理多个 master/slave 集群(组),每一个 master/slave 集群称做一个 application,用来管理统筹整个集群;vim
MHA node:运行在每台 MySQL 服务器上(master/slave/manager),它经过监控具有解析和清理 logs 功能的脚原本加快故障转移。 centos
主要是接收管理节点所发出指令的代理,代理须要运行在每个 mysql 节点上。简单讲 node 就是用来收集从节点服务器上所生成的 bin-log 。对比打算提高为新的主节点之上的从节点的是否拥有并完成操做,若是没有发给新主节点在本地应用后提高为主节点。服务器
由上图咱们能够看出,每一个复制组内部和 Manager 之间都须要ssh实现无密码互连,只有这样,在 Master 出故障时, Manager 才能顺利的链接进去,实现主从切换功能。网络
2.二、提供的工具
MHA会提供诸多工具程序, 其常见的以下所示:
Manager节点:
masterha_check_ssh:MHA 依赖的 ssh 环境监测工具;
masterha_check_repl:MYSQL 复制环境检测工具;
masterga_manager:MHA 服务主程序;
masterha_check_status:MHA 运行状态探测工具;
masterha_master_monitor:MYSQL master 节点可用性监测工具;
masterha_master_swith:master:节点切换工具;
masterha_conf_host:添加或删除配置的节点;
masterha_stop:关闭 MHA 服务的工具。
Node节点:(这些工具一般由MHA Manager的脚本触发,无需人为操做)
save_binary_logs:保存和复制 master 的二进制日志;
apply_diff_relay_logs:识别差别的中继日志事件并应用于其余 slave;
purge_relay_logs:清除中继日志(不会阻塞 SQL 线程);
自定义扩展:
secondary_check_script:经过多条网络路由检测master的可用性;
master_ip_failover_script:更新application使用的masterip;
report_script:发送报告;
init_conf_load_script:加载初始配置参数;
master_ip_online_change_script;更新master节点ip地址
2.三、工做原理
MHA工做原理总结为如下几条:
(1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);
(2) 识别含有最新更新的 slave ;
(3) 应用差别的中继日志(relay log) 到其余 slave ;
(4) 应用从 master 保存的二进制日志事件(binlog events);
(5) 提高一个 slave 为新 master ;
3、实现过程
环境准备:
主机名称 | IP | 服务角色 | 备注 |
manager | 192.168.11.11 | manager控制器 | 用于监控管理 |
master | 192.168.11.22 | 数据库主服务器 | 开启bin-log,relay-log,关闭relay-log-purge |
slave1 | 192.168.11.23 | 数据库从服务器 | 开启bin-log,relay-log,关闭relay-log-purge |
slave2 | 192.168.11.24 | 数据库从服务器 | 开启bin-log,relay-log,关闭relay-log-purge |
全部节点进行初始化关闭防火墙,关闭selinux
更改主机名:
hostnamectl --static set-hostname manager
hostnamectl --static set-hostname master
hostnamectl --static set-hostname slave1
hostnamectl --static set-hostname slave2
----------部署过程----------
一、配置本地解析hosts文件,便于以后操做
四台节点机器同时作:
vim /etc/hosts
192.168.11.11 manager.hj.com manager
192.168.11.22 master.hj.com master
192.168.11.23 slave1.hj.com slave1
192.168.11.24 slave2.hj.com slave2
wq退出保存
二、安装mariadb源,装mariadb,初始化数据库
四台节点机器同时作:
vim /etc/yum.repos.d/mariadb.repo
[mariadb] name = MariaDB baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.4/centos7-amd64 gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck=1
wq退出保存
安装mariadb-client和mariadb-server:
yum -y install MariaDB-server MariaDB-client
三台节点机器作:
开启mariadb服务:systemctl start mariadb
初始化数据库:mysql_secure_installation
直接回车-->n-->y-->设置你的密码(我设置为0)-->y-->y-->y-->y
三、修改数据库配置文件对其进行初始化配置
192.168.11.22上面作:
vim /etc/my.cnf.d/server.cnf
[mysqld] server-id = 1 //复制集群中的各节点的id均必须惟一 log-bin = master-log //开启二进制日志 relay-log = relay-log //开启中继日志 skip_name_resolve //关闭名称解析(非必须)
wq保存退出
重启mariadb服务:systemctl restart mariadb
192.168.11.23上面作:
vim /etc/my.cnf.d/server.cnf
[mysqld] server-id = 2 //复制集群中的各节点的id均必须惟一; relay-log = relay-log //开启中继日志 log-bin = master-log //开启二进制日志 read_only = ON //启用只读属性 relay_log_purge = 0 //是否自动清空再也不须要中继日志 skip_name_resolve //关闭名称解析(非必须) log_slave_updates = 1 //使得更新的数据写进二进制日志中
wq保存退出
重启mariadb服务:systemctl restart mariadb
192.168.11.24上面作:
vim /etc/my.cnf.d/server.cnf
[mysqld] server-id = 3 //复制集群中的各节点的id均必须惟一; relay-log = relay-log //开启中继日志 log-bin = master-log //开启二进制日志 read_only = ON //启用只读属性 relay_log_purge = 0 //是否自动清空再也不须要中继日志 skip_name_resolve //关闭名称解析(非必须) log_slave_updates = 1 //使得更新的数据写进二进制日志中
wq保存退出
重启mariadb服务:systemctl restart mariadb
四、配置一主多从复制架构
master节点上:
[root@master ~]# mysql -uroot -p #输入你设置的密码登陆
MariaDB [(none)]> grant replication slave,replication client on *.* to 'slave'@'192.168.%.%' identified by 'keer'; #受权主从帐号
MariaDB [(none)]> flush privileges; #刷新权限表,使设置生效
[root@master ~]# mysqldump -uroot -p --all-databases > `date +%F`-mysql-all.sql #备份数据保存到从库
[root@master ~]# scp 2019-04-25-mysql-all.sql 192.168.11.23:/root/ #传数据到两个从上面
[root@master ~]# scp 2019-04-25-mysql-all.sql 192.168.11.24:/root/
MariaDB [(none)]> show master status;
slave节点上(两台slave都要作):
[root@slave1 ~]# mysql -uroot -p < 2019-04-25-mysql-all.sql #导入数据
[root@slave1 ~]# mysql -uroot -p #输入密码登陆mysql
MariaDB [(none)]> help change master to; #得到帮助配置主从复制
修改完成后粘贴进mariadb:
MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.11.22', -> MASTER_USER='slave', -> MASTER_PASSWORD='keer', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='master-log.000001', -> MASTER_LOG_POS=666;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G
五、安装配置MHA
在全部 Mysql 节点受权拥有管理权限的用户可在本地网络中有其余节点上远程访问。 固然, 此时仅须要且只能在 master 节点运行相似以下 SQL 语句便可。
在master节点上面进行受权:
MariaDB [(none)]> grant all on *.* to 'mhaadmin'@'192.168.%.%' identified by 'mhapass';
MariaDB [(none)]> flush privileges;
准备ssh互通环境:
四台节点机器同时作:
ssh-keygen #一路回车
manager上面作:ssh-copy-id 192.168.11.11 #将公钥传给本身
master上面作:ssh-copy-id 192.168.11.11 #将公钥传给manager
slave上面作:ssh-copy-id 192.168.11.11 #将公钥传给manager
slave上面作:ssh-copy-id 192.168.11.11 #将公钥传给manager
manager上面作:scp .ssh/authorized_keys 192.168.11.22:/root/.ssh #传公钥给其余节点,作双机互信
manager上面作:scp .ssh/authorized_keys 192.168.11.23:/root/.ssh
manager上面作:scp .ssh/authorized_keys 192.168.11.24:/root/.ssh
安装mha包:
个人mha网盘分享安装包,你们能够本身访问下载 连接:https://pan.baidu.com/s/1royHPWKgWBtWeBDYAHqKug 提取码:hf3q
复制这段内容后打开百度网盘手机App,操做更方便哦
四个节点都需安装:mha4mysql-node-0.56-0.el6.norch.rpm
Manager 节点另须要安装:mha4mysql-manager-0.56-0.el6.noarch.rpm
四台节点机器同时安装:yum -y install mha4mysql-node
manager节点还需安装:yum -y install mha4mysql-manager
在全部节点上执行以下命令
[root@centos7-01 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
[root@centos7-01 ~]# ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
[root@centos7-02 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
[root@centos7-02 ~]# ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
初始化MHA:
Manager 节点须要为每一个监控的 master/slave 集群提供一个专用的配置文件,而全部的 master/slave 集群也可共享全局配置。全局配置文件默认为/etc/masterha_default.cnf,其为可选配置。若是仅监控一组 master/slave 集群,也可直接经过 application 的配置来提供各服务器的默认配置信息。而每一个 application 的配置文件路径为自定义。具体操做见下一步骤。
定义MHA管理配置文件:
为MHA专门建立一个管理用户, 方便之后使用, 在mysql的主节点上, 三个节点自动同步:
[root@manager ~]# mkdir /etc/mha_master
[root@manager ~]# vim /etc/mha_master/mha.cnf
[server default] //适用于server1,2,3个server的配置 user=mhaadmin //mha管理用户 password=mhapass //mha管理密码 manager_workdir=/etc/mha_master/app1 //mha_master本身的工做路径 manager_log=/etc/mha_master/manager.log // mha_master本身的日志文件 remote_workdir=/mydata/mha_master/app1 //每一个远程主机的工做目录在何处 ssh_user=root // 基于ssh的密钥认证 repl_user=slave //数据库用户名 repl_password=keer //数据库密码 ping_interval=1 //ping间隔时长 [server1] //节点2 hostname=192.168.11.22 //节点2主机地址 ssh_port=22 //节点2的ssh端口 candidate_master=1 //未来可不能够成为master候选节点/主节点 [server2] hostname=192.168.11.23 ssh_port=22 candidate_master=1 [server3] hostname=192.168.11.24 ssh_port=22 candidate_master=1
六、对四个节点进行检测
[root@manager ~]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf #检测ssh互信是否ok
若是最后一行显示为[info]All SSH connection tests passed successfully.则表示成功。
[root@manager ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf #检测mysql的主从复制是否ok
若是检测主从复制没法经过,则从新受权一下主从复制帐号:
MariaDB [(none)]> grant replication slave,replication client on *.* to 'slave'@'192.168.%.%' identified by 'keer'; #受权主从帐号
MariaDB [(none)]> flush privileges; #刷新权限表,使设置生效
七、启动MHA
[root@manager ~]# nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &
[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf #查看master节点的状态
#中止MHA的命令:
[root@manager ~]# masterha_stop -conf=/etc/mha_master/mha.cnf
我就没有执行了,由于我后面还有操做
八、测试MHA故障转移
去master上面关闭mariadb服务:
[root@master ~]# systemctl stop mariadb
在manager节点查看日志:
[root@manager ~]# tail -200 /etc/mha_master/manager.log
九、恢复原来拓机的master到新的主从集群中
#在slave1[新的master]上面,备份库传给旧的master
[root@slave1 ~]# mkdir /backup
[root@slave1 ~]# mysqldump --all-databases > /backup/`date +%F-%T`-myql-all.sql
[root@slave1 ~]# scp /backup/2019-04-25-22\:57\:13-myql-all.sql 192.168.11.22:/root/
#在master节点进行数据恢复
[root@master ~]# systemctl restart mariadb #启动mariadb数据库服务
[root@master ~]# mysql_secure_installation #从新初始化数据库
[root@master ~]# mysql < 2019-04-25-22\:57\:13-myql-all.sql #还原数据
#从新配置主从,照例查看如今的主的二进制日志和位置
[root@slave1 ~]# mysql -uroot -p #输入密码登陆
[root@master ~]# mysql -uroot -p #输入密码登陆
CHANGE MASTER TO MASTER_HOST='192.168.11.23', MASTER_USER='slave', MASTER_PASSWORD='keer', MASTER_PORT=3306, MASTER_LOG_FILE='master-log.000001', MASTER_LOG_POS=483331;
MariaDB [(none)]> start slave; #开启从功能
MariaDB [(none)]> show slave status\G #显示从状态
到此,旧master已经从新加入到mysql主从集群中了
十、新节点提供后再次进行检测操做
[root@manager ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf
#启动MHA
[root@manager ~]# masterha_manager -conf=/etc/mha_master/mha.cnf > /etc/mha_master/manager.log 2>&1 &
#再次查看master节点的状态
[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
十一、新节点上线,故障转换恢复注意事项
1)在生产环境中, 当你的主节点挂了后, 必定要在从节点上作一个备份, 拿着备份文件把主节点手动提高为从节点, 并指明从哪个日志文件的位置开始复制
2)每一次自动完成转换后, 每一次的(replication health )检测不ok始终都是启动不了必须手动修复主节点, 除非你改配置文件
3)手动修复主节点提高为从节点后, 再次运行检测命令
4)再次运行起来就恢复成功了
检测主master节点:masterha_check_status -conf=/etc/mha_master/mha.cnf