使用keepalived和mysql的主从复制功能实现mysql的高可用

keepalived可以实现两台机器的相互备份,mysql主从复制可以实现两个mysql实例之间的相互备份,把这两个功能结合起来,就可以实现mysql的HA方案。

keepalived的搭建已经在文章 keepalived双机热备中介绍过,mysql的主从复制在文章mysql源码安装和主从复制的配置介绍过。在这两篇文章的基础上,本文章介绍如何使用keepalived和mysql的主从复制功能实现mysql的高可用。

mysql的双机互备

mysql的双机互备也叫master-master模式,如果已经知道如何配置master-slave模式,做master-master很简单,只需要按照主从复制的方式,让从作为主,主作为从再配置一遍就可以了。

可以参考文章mysql源码安装和主从复制的配置完成配置。

有以下几点要注意:

  • 有很多文章介绍可以在my.cnf设置master-host等配置,在5.1.7版本以后,这些配置都是不支持的,需要使用change master to完成对应的设置;
  • 为有数据的master做master-master配置时,请注意拷贝数据文件以保持两个mysql的数据保持同样的状态,并锁住mysql,具体操作请参考文章mysql源码安装和主从复制的配置的最后。

笔者已经按照上述方法在两台机器(192.168.19.63和192.168.19.65)两台机器上配置了mysql的master-master模式。

keepalived实现mysql的监控并进行ip漂移

读者可以参考keepalived双机热备安装keepalived并进行基本的测试。

由于keepalived只有在keepalived的进程不存在时,才会进行ip的迁移,所以要实现mysql的高可用,就需要在mysql进程不存在时杀掉keepalived进程,这需要对mysql进行监控。

keepalived提供了LVS的功能,我们可以在每个机器上创建建一个LVS实例,VIP为待漂移的ip,该实例只有一个真实节点,本机的ip。然后添加监控规则,监测本机3306端口是否可以连通,如果不可以,则认为mysql实例出现问题,启动脚本关闭keepalived进程,实现ip漂移。具体的配置如下。

192.168.19.63为keepalived的MASTER,192.168.19.65为BACKUP

1.修改63的keepalived配置为如下:

global_defs {
   notification_email {
        xxx@qq.com      
   }
   notification_email_from pub@easymobi.cn
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth1
    virtual_router_id 50
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111222
    }
    virtual_ipaddress {
       192.168.19.150/24
    }
}
virtual_server 192.168.19.150 3306 { 
        delay_loop 2
        lb_algo wrr
        lb_kind DR
        persistence_timeout 60
        protocol TCP
        real_server 192.168.19.63 3306 {
                weight 3
                notify_down /u/services/keeplived/bin/MySQL.sh
                TCP_CHECK {     
                        connect_timeout 10
                        nb_get_retry 3          
                        connect_port 3306       
                }               
        }
}
  • virtual_server定义了一个LVS虚拟服务,
  • delay_loop表示每2秒检查一次真实服务状态;
  • lb_algo和lb_kind分别为LVS的算法和模式,
  • persistencen_timeout是会话保持时间,
  • real_server配置了该服务的一个真实服务,
  • nofify_down指定了当检测到该服务不存在时执行的脚本,脚本内容如下:

    #!/bin/sh
    pkill keepalived

很简单:杀掉keepalived进程;

  • connect_timeout表示当连接失败时的重连超时时间
  • nb_get_retry表示重连次数
  • connect_port表示健康检查的端口

此时,启动63机器上的keepalived,可以通过ip addr看到192.168.19.150已经绑定到了该机器上,使用mysql客户端通过该vip访问mysql实例可以访问到。

master状态

2.在BACKUP服务器上设置keepalived,配置如下:

global_defs {
   notification_email {
        xxx@qq.com
   }
   notification_email_from pub@easymobi.cn
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth1
    virtual_router_id 50
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111222
    }
    virtual_ipaddress {
       192.168.19.150/24
    }
}
virtual_server 192.168.19.150 3306 {
        delay_loop 2
        lb_algo wrr
        lb_kind DR
        persistence_timeout 60
        protocol TCP
        real_server 192.168.19.65 3306 {
                weight 3
                notify_down /u/services/keepalived/bin/MySQL.sh
                TCP_CHECK {
                        connect_timeout 10
                        nb_get_retry 3
                        connect_port 3306
                }
        }
}

当然也要在有MySql.sh脚本。

然后启动keepalived。

此时分别在在MASTER和BACKUP上通过ipvsadm -L -n查看LVS路由信息,可以看到对应的规则:

MASTER:

master上的LVS规则

BACKUP:

backup上的LVS规则

测试效果

1.关闭MASTER(192.168.19.63)上的mysql,检查是否执行notify_down脚本,keepalived是否被关闭,虚拟ip是否迁移。

使用kill -9方式杀掉mysql进程,然后ps auxf | grep keepalived发现已经没有进程,说明notify_down已经执行,使用ip addr查看ip绑定情况,使用ipvsadm -L -n查看LVS规则。

master测试

master上已经没有keepalived进程,虚拟Vip也没有绑定了,LVS规则也没有了。

此时在BACKUP查看ip绑定情况,LVS规则,并且使用mysql客户端登陆。

slave测试

虚拟IP已经“漂移”到BACKUP上,此时通过该虚拟IP访问mysql,通过show slave status\G;查看到master为192.168.19.63说明访问到的机器为192.168.19.65,也就是BACKUP机器。

2.启动MASTER上的mysql和keepalived,看是否虚拟IP重新漂移回192.168.19.63,通过虚拟IP访问MYSQL是否到达192.168.19.63。

master测试

此时192.168.19、150已经重新绑定回了MASTER,LVS规则也重新生效了,通过虚拟ip访问mysql显示的Master_Host为192.168.19.65,说明当前访问到的机器为192.168.19.63。

至此,MASTER发生故障后可以无缝迁移到BACKUP上,当MASTER故障恢复时,可以自动访问回MASTER,达到了热备的效果。

总结

keepalived提供的功能很简单,但是很实用。了解它的功能和搭建方式后,可以很方便的为其他的软件提供HA方案。