Mysql之mha高可用切换

主机如下:

192.168.209.131---主

192.168.209.132---从 (可切换为主)

192.168.209.128---从(不可以切换为主) 和 mha管理服务器



1.在三台数据库服务器安装好mysql,三台数据库开启gtid,都开启了bin-log和log_slave_updates = 1 实现主从同步

2.三台服务器之间需要实现无需密码ssh登陆

(三台服务器都要执行下面四条命令)

ssh-keygen   #生产私钥

ssh-copy-id -i /root/.ssh/id_rsa '-p 22 root@192.168.209.128'

ssh-copy-id -i /root/.ssh/id_rsa '-p 22 root@192.168.209.131'

ssh-copy-id -i /root/.ssh/id_rsa '-p 22 root@192.168.209.132'

3.三台服务器安装epel源

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

4.安装依赖组件和安装mha客户端

(三台服务器都要)

yum -y  install perl-DBD-MySQL  ncftp  perl-DBI

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

5.在mha管理服务器安装相关依赖组件和mha管理端

192.168.209.128

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

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

mkdir -p /etc/mha #配置目录,存储mha配置文件

mkdir -p /home/mysql_mha  #工作目录,存储mha日志文件和其他文件

6.在非mha管理服务器,创建工作目录

mkdir -p /home/mysql_mha

7.在master数据库创建mha管理用户

#在主服务器上执行,然后同步到其他slave服务器,mha用户管理主从

grant all privileges on *.* to mha@'192.168.209.%' identified by '123456';

8.在mha服务器创建配置文件

cd /etc/mha

vim mysql_mha.cnf

----------------------

[server default]

#mha管理端日志目录

manager_log=/home/mysql_mha/manager.log

#mha管理端工作目录

manager_workdir=/home/mysql_mha

#主数据库binlog存储目录(建议所有数据库的bin-log目录一致)

master_binlog_dir=/data/mysql/datanode1

#其他从服务器的工作目录,需要在其他从服务器手动创建这个目录

remote_workdir=/home/mysql_mha

#mha为管理主从的管理用户

user=mha

password=123456

#mha检测master服务器是否可以通的,1s一次

ping_interval=1

#主从同步的账号和密码

repl_user=rep

repl_password=123456

#ssh的账号,密码不需要,有私钥了

ssh_user=root

#通过脚本对vip进行切换,脚本放在mha服务器

master_ip_failover_script=/etc/mha/master_ip_failover

#表示mha通过-s指定的三个ip服务器,对master进行ping。当mha服务器ping不通master,此时mha服务断就ssh到slave服务器上去ping主数据库服务器,如果都不可以,那么确定master挂了

secondary_check_script=/usr/bin/masterha_secondary_check  -s  192.168.209.128 -s 192.168.209.131 -s 192.168.209.132

[server1]

hostname=192.168.209.132

port=33061

#可选举为主

candidate_master=1

[server2]

hostname=192.168.209.131

port=33061

candidate_master=1

check_repl_delay=0 #默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主机在切换的过程中一定是新的master

[server3]

hostname=192.168.209.128

port=33061

#不可选举为主

no_master=1

--------------------------------------------------

9.对ssh和数据库主从配置进行检测

#管理服务器执行,检查ssh是否可用

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

#管理服务器执行,检测主从是否ok

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

#查看当前的master是否在运行种

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

10.启动mha

先在master服务器手动添加一个vip

ifconfig eth0:0 192.168.209.199/24

启动mha

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

--remove_dead_master_conf #该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。

--manger_log #日志存放位置

--ignore_last_failover #在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件。默认情况下,MHA发生切换后会在日志目录,也就是上面我设置的/data产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。

/home/mysql_mha/mha.log  存放mha启动日志

/home/mysql_mha/manager.log  存放mha业务日志,比如对主从进行切换的日志


11.模拟master挂了,然后mha自动把vip切换到slave,并且把slave提升为master,其他slave更改master源

192.168.209.131关闭数据库

/usr/local/mysql/bin/mysqladmin -uroot -p123456 shutdown

1.数据库关闭完毕后,去192.168.209.128这个mha服务器

ps -ef|grep mha  查看mha是否已经关闭(master切换完成后,mha是会自动关闭的)

2.192.168.209.128 进入数据库查看master是否已经切换

mysql -uroot -p123456

show slave status\G

3.192.168.209.132 查看vip是否已经切换过来,查看自己是否为主

ip  a     #查看vip是否有了

mysql -uroot -p123456

show slave status\G



主从新起起来,此时这个主要作为从,从原来的从同步数据过来

192.168.209.131 起来后,手动切换为192.168.209.132的从,开始同步数据

当192.168.209.131成为192.168.209.132的从后,我们才可以再次启动mha,而且这次启动要加一个参数

-------------------------

nohup masterha_manager -ignore_last_failover --conf=/etc/mha/mysql_mha.cnf > /home/mysql_mha/manager.log 2>&1 &

-ignore_last_failover  #忽略上一次的切换,如果不加这个参数,再次发送切换,mha就会出现问题,要你手动进行切换

--------------------------------



vip切换脚本(/etc/mha/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.209.199';

my $brdc = '192.168.209.255';

my $ifdev = 'eth0';

my $key = '0';

my $ssh_start_vip = "/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";

my $ssh_stop_vip = "/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";

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" ) {

        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" ) {

        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";

        exit 0;

    }

    else {

        &usage();

        exit 1;

    }

}

sub start_vip() {

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

}

sub stop_vip() {

    return 0  unless  ($ssh_user);

    `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";

}

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