《MySQL数据库》MySQL MHA高可用搭建

前言

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. 只能处理一次。

This moment will nap, you will have a dream; But this moment study,you will interpret a dream.
原文地址:https://www.cnblogs.com/jssj/p/13604640.html