前言
MySQL高可用,顾名思义就是当MySQL主机或服务发生任何故障时能够立马有其他主机顶替其工作,并且最低要求是要保证数据一致性。简单点说MHA就是为了保证MySQL的主从复制功能,不会因为主节点宕机而需要手工切换主从,MHA会自动切换主从。
环境搭建
前提:
1. GTID主从(一主N从)搭建:https://www.cnblogs.com/jssj/p/13546087.html
2. 设置软链接:ln -s /usr/local/mysql/mysql-5.7.22-linux-glibc2.12-x86_64/bin/mysqlbinlog /usr/bin/mysqlbinlog
3. 设置免密登入(manage节点操作):
ssh-keygen -t rsa 生成秘钥,按多次回车直到秘钥生成
ssh-copy-id 149.225.47.23 连接远程机器,第一次需要输入密码, 再次使用命令(ssh -l root 149.225.47.23) 就可以直接登录,不需要密码了
各个服务器之间都设置免密登入,一定要测试个节点之间是否已经可以免密登录,包含自身节点。
还可以使用一下方式配置免密登录
rm -rf /root/.ssh ssh-keygen cd /root/.ssh mv id_rsa.pub authorized_keys scp -r /root/.ssh 127.0.0.1:/root scp -r /root/.ssh 127.0.0.2:/root
软件安装:
1. 安装MHA需要的依赖包(各节点都需要)
yum install perl-DBD-MySQL -y
2. MHA服务端需要安装的依赖包(一般从库中选一个当成服务端)
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y
3. MHA下载和安装
GitHub下载地址 :https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
百度网盘:链接: https://pan.baidu.com/s/1R45S6hxyj_T6gPsil3QuDQ 提取码: yctx
各个节点安装:
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
manage节点安装:
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
4. 主库(主从的主库)设置用户
grant all privileges on *.* to mha@'%' identified by 'mha';
5. 设置配置文件
manage 节点
mkdir -p /etc/mha -- 创建目录 mkdir -p /var/log/mha/app1 -- 创建日志目录
编写配置文件:
vim /etc/mha/app1.cnf
文件内容
[server default] manager_log=/var/log/mha/app1/manager manager_workdir=/var/log/mha/app1 master_binlog_dir=/data/binlog -- 主库binlog 位置点 user=mha password=mha ping_interval=2 -- 监控间隔时间 repl_password=repl repl_user=repl ssh_user=root [server1] hostname=127.0.0.51 port=3306 [server2] hostname=127.0.0.52 port=3306
在验证一下环境是否正常:
masterha_check_ssh --conf=/etc/mha/app1.cnf masterha_check_repl --conf=/etc/mha/app1.cnf
一切准备就绪启动:
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
检查启动状态:
masterha_check_status --conf=/etc/mha/app1.cnf
环境搭建初步完成,以上环境已经是一个可以使用的单次高可用的环境。下面补充几点增强功能。
1. 保证日志完整:
前提:找一台机器部署了MySQL应用的,开启GTID,作为保存主库binlog日志的地方。
mkdir main_binlog_bak -- 创建文件并且赋权 chown -R mysql.mysql /usr/local/mysql/main_binlog_bak
然后再master节点的配置文件上面配置一下信息:
[binlog1] no_master=1 -- 该台机器不能作为备用主库 hostname=127.0.0.4 -- 配置存在binlog的ip地址 master_binlog_dir=/usr/local/mysql/main_binlog_bak -- 该路径存放binlog日志文件
cd /usr/local/mysql/main_binlog_bak -- 必须进入到自己创建好的目录然后执行下面命令:
mysqlbinlog -R --host=127.0.0.51 --user=mha --password=mha --raw --stop-never mysql-bin.000001 & -- ip数主库的, 用户密码就直接使用mha, mysql-bin.000001 现有主库使用的binlog 就可以了
可以通过主库 flush logs; 命令验证该功能。
2. 主库宕机发送邮件功能
前提:linux支持发送邮件
在配置文件 /etc/mha/app1.cnf 里面配置:
report_script=/usr/local/bin/send -- 发送邮箱的目录
3. VIP漂移实现,略。
重启MHA服务。
模拟故障:主动停掉主库服务。
查看日志:/var/log/mha/app1/manager的切换信息。
通过:查看配置配置文件可以检查主从情况
vim /etc/mha/app1.cnf
原主库配置已经被删除。ok
故障之后如何选择主库:
1. 有指定走指定
2. 没有指定,看日志情况,日志最接近主库的。 日志量一样,根据配置的先后顺序。
原理
MHA如何工作呢?
1. 监控主库运行情况。
通过:masterha_master_monitor 心跳检测脚本,默认检查4次,都失败,就认为主库宕机,进行故障转移。
2. 主库宕机后,恢复数据和重新设置主库。
2.1 主库宕机后,选择哪个从库为主库的逻辑为: 1. 优先级(人为设置)candidate_master = 1但是如果选择的备库日志与主库差距太大,也不会被选择,check_repl_delay=0 开启就不检查日志,一定是选择的是主库,参数设置都可以设置在app1.cnf 的[server1] 节点里面 2.日志量最接近的,3. 日志量一样,按照配置顺序。
2.2 恢复日志:1.能够连接SSH ,可以从主库获取日志恢复(GTID)通过save_binary_logs脚本,保存到从库的/var/tmp 目录下,2. SSH连不上了,只能保证从库一致 通过脚本apply_diff_relay_logs 恢复。
3. 主从身份切换,新主库和剩余从库构建新的主从环境。 并且通过脚本:masterha_conf_host 将原主库的配置清除。
4. 只能处理一次。