MySQL-MHA

一、MHA

1、解压mysql包到/opt目录

[root@localhost opt]# tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz

2、创建关键程序软连接

ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog

ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql

3、节点间配置互信

###db1:

rm -rf /root/.ssh

ssh-keygen

cd /root/.ssh

mv id_rsa.pub authorized_keys

scp -r /root/.ssh root@192.168.1.70:/root

scp -r /root/.ssh root@192.168.1.71:/root

4、验证

###db1:

ssh 192.168.1.61 date

ssh 192.168.1.70 date

ssh 192.168.1.71 date

###db2:

ssh 192.168.1.61 date

ssh 192.168.1.70 date

ssh 192.168.1.71 date

###db3:

ssh 192.168.1.61 date

ssh 192.168.1.70 date

ssh 192.168.1.71 date

5、所有节点(数据库)安装node软件依赖

yum install perl-DBD-MySQL -y

###上传并安装

rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

6、在主库创建mha需要的用户

grant all privileges on *.* to mha@'%' identified by 'Mha@123';

flush privileges;

7、Manager安装

###db4单独的节点

yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

###上传并安装

rpm -ivh mha4mysql-manager-0.56-0.e16.noarch.rpm

8、Manager配置文件准备(db4)

###创建配置文件目录

[root@localhost etc]# mkdir mha

###创建日志目录

[root@localhost log]# pwd

/data/mha/log

###编辑mha配置文件

vim /etc/mha/mha.cnf

[server default]

#工作日志

manager_log=/data/mha/log/manager.log

manager_workdir=/data/mha/log

#主库的binlog日志位置

master_binlog_dir=/data/mysql/3306/log

#manger监控用户

user=mha

password=Mha@123

#探测心跳的监控时间

ping_interval=2

repl_password=123

repl_user=repl

ssh_user=root

#如果主库宕机,根据排列顺序切换新主

[server1]

hostname=192.168.1.61

port=3306

#candidiate_master=1  强制选主

#check_repl_delay=0   不检查日志落后

[server2]

hostname=192.168.1.70

port=3306

[server3]

hostname=192.168.1.71

port=3306

9、配置状态检查(db4)

masterha_check_ssh --conf=/etc/mha/mha.cnf

masterha_check_repl --conf=/etc/mha/mha.cnf

10、开启MHA-manager(db3)

nohup masterha_manager --conf=/etc/mha/mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /data/mha/log/manager.log 2>&1 &

11、查看MHA状态

masterha_check_status --conf=/etc/mha/mha.cnf

二、应用透明

1、配置参数(db4)

#添加以下参数:

vim /etc/mha/mha.cnf

[server default]

master_ip_failover_script=/usr/local/bin/master_ip_failover

2、修改脚本(db4)

vim /usr/local/bin/master_ip_failover

#!/usr/bin/env perl

use strict;

use warnings FATAL => 'all';

use Getopt::Long;

my (

   $command,          $ssh_user,        $orig_master_host, $orig_master_ip,

   $orig_master_port, $new_master_host, $new_master_ip,    $new_master_port

);

my $vip = '192.168.1.74/24';

my $key = "1";

my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";

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

GetOptions(

   'command=s'          => \$command,

   'ssh_user=s'         => \$ssh_user,

   'orig_master_host=s' => \$orig_master_host,

   'orig_master_ip=s'   => \$orig_master_ip,

   'orig_master_port=i' => \$orig_master_port,

   'new_master_host=s'  => \$new_master_host,

   'new_master_ip=s'    => \$new_master_ip,

   'new_master_port=i'  => \$new_master_port,

);

exit &main();

sub main {

   print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

   if ( $command eq "stop" || $command eq "stopssh" ) {

       # $orig_master_host, $orig_master_ip, $orig_master_port are passed.

       # If you manage master ip address at global catalog database,

       # invalidate orig_master_ip here.

       my $exit_code = 1;

       eval {

           print "Disabling the VIP on old master: $orig_master_host \n";

           &stop_vip();

           $exit_code = 0;

       };

       if ($@) {

           warn "Got Error: $@\n";

           exit $exit_code;

       }

       exit $exit_code;

   }

   elsif ( $command eq "start" ) {

       # all arguments are passed.

       # If you manage master ip address at global catalog database,

       # activate new_master_ip here.

       # You can also grant write access (create user, set read_only=0, etc) here.

       my $exit_code = 10;

       eval {

           print "Enabling the VIP - $vip on the new master - $new_master_host \n";

           &start_vip();

           $exit_code = 0;

       };

       if ($@) {

           warn $@;

           exit $exit_code;

       }

       exit $exit_code;

   }

   elsif ( $command eq "status" ) {

       print "Checking the Status of the script.. OK \n";

       `ssh $ssh_user\@$orig_master_host \" $ssh_start_vip \"`;

       exit 0;

   }

   else {

       &usage();

       exit 1;

   }

}

# A simple system call that enable the VIP on the new master

sub start_vip() {

   `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;

}

# A simple system call that disable the VIP on the old_master

sub stop_vip() {

   `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;

}

sub usage {

   print

   "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";

}

3、修改权限

chmod +x /usr/local/bin/master_ip_failover

4、主库(db1)上手工生成第一个vip地址

ifconfig ens33:1 192.168.1.74/24

5、重启mha(db4)

masterha_stop --conf=/etc/mha/mha.cnf

nohup masterha_manager --conf=/etc/mha/mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /data/mha/log/manager.log 2>&1 &

6、检查状态

masterha_check_status --conf=/etc/mha/mha.cnf

三、通过binlog server(db3)实现数据补偿

1、修改配置文件

(db4)

vim /etc/mha/mha.cnf

[binlog1]

#no_master=1   #不参与选主

hostname=192.168.1.72

master_binlog_dir=/data/mysql/binlog  ###不能与原来日志目录相同

2、创建目录并授权

[root@localhost mysql]# mkdir binlog

[root@localhost binlog]# pwd

###/data/mysql/binlog

chown -R mysql.mysql binlog

3、拉取主库binlog日志

###db3

cd /data/mysql/binlog

mysqlbinlog -R --host=192.168.1.61 --user=mha --password=Mha@123 --raw --stop-never mysql-bin.000001 &

###注意:

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

可以在主库查看

mysql> show master status;

4、重启mha

masterha_stop --conf=/etc/mha/mha.cnf

nohup masterha_manager --conf=/etc/mha/mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /data/mha/log/manager.log 2>&1 &

5、检查状态

masterha_check_status --conf=/etc/mha/mha.cnf

四、邮件提醒(db4)

1、上传并解压sendEmail

[root@localhost opt]# tar -zxvf sendEmail-v1.56.tar.gz

2、拷贝执行文件

mv sendEmail /usr/local/bin/

3、编辑发送邮件脚本

cd /usr/local/bin

vim send

#!/bin/bash

/usr/local/bin/sendEmail -o tls=no -f xxxxxxx@qq.com -t xxxxxx@qq.com -s smtp.qq.com:25 -xu xxxxxx@qq.com -xp mgsufeiukzvibach -u "MHA Waring" -m "YOUR MHA MAY BE FAILOVER" &>/tmp/sendmail.log

4、授权

chmod +x send

5、测试发送邮件

./send

6、修改manager配置文件

vim /etc/mha/mha.cnf

report_script=/usr/local/bin/send

7、重启mha

masterha_stop --conf=/etc/mha/mha.cnf

nohup masterha_manager --conf=/etc/mha/mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /data/mha/log/manager.log 2>&1 &

8、检查状态

masterha_check_status --conf=/etc/mha/mha.cnf

五、测试MHA功能

1、宕掉主库

查看vip飘逸

查看邮件

查看日志

故障库是否剔除

主从状态

六、修复思路

1、排查进程状态(db4)

ps -ef|grep manager

masterha_check_status --conf=/etc/mha/mha.cnf

2、检查配置文件

###查看故障节点是否存在

如果被移除说明切换过程大部分已经成功

如果节点还在,证明切换过程有问题

3、查看日志

vim /data/mha/manager.log

5、修复故障库

6、修复主从

将故障库修好后手工加入集群

###

mysql> change master to

   -> master_host='192.168.1.70',

   -> master_user='repl',

   -> master_password='Repl@123',

   -> master_auto_position=1;

Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

7、修复配置文件(db4)

vim /etc/mha/mha.cnf

###

恢复原样

8、检查ssh互信和rely的状态

masterha_check_ssh --conf=/etc/mha/mha.cnf

masterha_check_repl --conf=/etc/mha/mha.cnf

9、修复binlogserver

###db3

cd /data/mysql/binlog

rm -rf *

###拉取新主库的binlog

mysqlbinlog -R --host=192.168.1.70 --user=mha --password=Mha@123 --raw --stop-never mysql-bin.000001 &

10、检查vip是否在主节点上

IP a

###如果不在手动添加

11、启动MHA(db4)

nohup masterha_manager --conf=/etc/mha/mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /data/mha/log/manager.log 2>&1 &

12、检查状态

masterha_check_status --conf=/etc/mha/mha.cnf

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

推荐阅读更多精彩内容