Mysql 高可用之MHA原理及使用

原理图:


高可用:

最擅长的是为我们解决物理损坏

MHA Failover 原理

0.启动Manager 

调用 masterha_manager 脚本启动manager程序

1.监控?

通过 masterha_master_monitor  心跳检测脚本,数据库节点,主要监控主库。

默认探测4次,每隔(ping interval=2)秒,如果主库还没有心跳,认为主库宕机,进入failover过程。(故障转移)

2 选主?

#1.优先级(主观) 如果在节点配置时(/etc/mha/app1.cnf 对应的[server2]此类节点下),加入了candidate_master=1 参数。

如果备选主,日志量落后master太多(默认是落后100M的日志量),也不会选择新主。

可以通过check_repl_delay=0,不检查日志落后的情况。

#2 日志量最接近主库 

#3 日志量一样。配置文件顺序。

3.日志补偿

#情况1:ssh能连上,通过save_binary_logs 

立即保存部分缺失部分的日志到从库并恢复

#情况2:ssh不能连,对比从库之间的relaylog的差异(apply_diff_relay_logs)

两个从库进行日志diff差异补偿。

4.主从身份切换,所有从库取消原有主库的复制关系(stop slave,reset slave all)

新主库和剩余从库从新构建主从关系。

5.故障库自动被剔除集群(master_conf_host配置信息去掉)

6.MHA是一次性高可用,Failover后,Manger自动退出.

以上是,MHA的基础环境所有具备的功能。

不足的地方有哪些?

0.应用透明

1.数据补偿

2.自动提醒

3.自愈功能

      1) MHA + K8s + Operator 

      2) 8.0版本 MGR + mysqlsh 

无状态服务: 没有数据的服务

4.应用透明vip功能  

说明:只能同机房使用,无法跨机房网络

4.1配置参数(db03)

master_ip_failover_script=/usr/local/bin/master_ip_failover

注意:/usr/local/bin/master_ip_failover,必须事先准备好

修改脚本内容

vi  /usr/local/bin/master_ip_failover

my $vip = '10.0.0.55/24';

my $key = '1';

my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";   (eth0 三个节点网卡名称)

my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";

master_ip_failover脚本里有中文字符,需要转换

安装工具:yum -y install dos2unix

进行转换:[root@later03/usr/local/bin]# dos2unix master_ip_failover 

dos2unix: converting file master_ip_failover to Unix format ...

更改manager配置文件:

vi  /etc/mha/app1.cnf添加:master_ip_failover_script=/usr/local/bin/master_ip_failover

加入执行权限 [root@db03~]# chmod +x /usr/local/bin/master_ip_failover

主库上,手工生成第一个vip地址

手工在主库上绑定vip,注意一定要和配置文件中的ethN一致,我的是eth0:1(1是key指定的值)   

ifconfig eth0:1 10.0.0.55/24

重启mha

masterha_stop --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

注意:

keeplive 的话,需要candidate_master=1和check_repl_delay=0进行配合,

防止vip飘逸不再一个节点上。

5.数据补偿:

解决办法:找一台机器实时拉取主库的binlog日志,如果主库损坏,

那么也保证了主库完整的binlog用于进行从库的日志补偿。

binlogserver配置:找一台额外的机器,必须要有5.6以上的版本,支持gtid并开启,我们直接用的第二个slave(db03)

vim/etc/mha/app1.cnf

[binlog1]

no_master=1  --不参与选主

hostname=39.101.204.8

master_binlog_dir=/binlog/3306 

创建必要目录

mkdir -p /data/mysql/binlog  

chown -R mysql.mysql /data/*

修改完成后,将主库binlog拉过来(从000001开始拉,之后的binlog会自动按顺序过来)

拉取主库binlog日志

cd /data/mysql/binlog    -----》必须进入到自己创建好的目录

mysqlbinlog  -R --host=39.101.199.159  --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &

生产中:

show master status; 查看主库正在使用的binlog日志位置点

查看为:mysql-bin.000003

也可以先 flush logs;然后在进行拉取

直接拉取正在用的日志点以及以后的:

mysqlbinlog  -R --host=39.101.199.159  --user=mha --password=mha --raw  --stop-never mysql-bin.000003 &

注意:拉取日志的起点,需要按照目前从库的已经获取到的二进制日志点为起点

重启mha:

masterha_stop --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


6.邮件提醒

1.参数:report_script=/usr/local/bin/send

2.准备邮件脚本send_report

(1)准备发邮件的脚本(上传 email_2019-最新.zip中的脚本,拷贝到/usr/local/bin/中)

cp -a * /usr/local/bin/

 赋予执行权限:

chmod +x *  

修改脚本,邮箱信息

注意:这里因为阿里云屏蔽了邮箱的25端口,导致不能使用linux自带的工具,所以没能用上老师提供的脚本,这里自己写了一个python脚本  test.py 然后集成到 send 脚本 进行调用.

[root@later03/data/mysql/binlog]# cat /usr/local/bin/send

#! /usr/bin/perl -w

system ("python3 /usr/local/bin/test.py")

(2)将准备好的脚本添加到mha配置文件中,让其调用

3.修改manager配置文件,调用邮件脚本

  vi/etc/mha/app1.cnf

 report_script=/usr/local/bin/send

(3)停止MHA  masterha_stop  --conf=/etc/mha/app1.cnf

(4)开启MHA   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 &

(5)关闭主库,看警告邮件


7.测试MHA的功能

宕机主库测试

测试查看vip

查看邮件

切换日志

故障库是否剔除


8.故障修复思路 

# 1.排查进程状态



 故障修复:

1.恢复故障节点

(1)实例宕掉/etc/init.d/mysqld start 

(2)主机损坏,有可能数据也损坏了备份并恢复故障节点。

2.恢复主从环境看日志文件:CHANGEMASTERTOMASTER_HOST='10.0.0.52',MASTER_PORT=3306,MASTER_AUTO_POSITION=1,MASTER_USER='repl',MASTER_PASSWORD='123';

start slave;

3.恢复manager

3.1修好的故障节点配置信息,加入到配置文件

[server1]hostname=10.0.0.51

port=3306

3.2启动

manager:    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 &

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容