使用KeepAlived搭建MySQL的高可用环境。

首先搭建MySQL的主从复制

在Master开启binlog,创建复制帐号,

然后在Slave输入命令

change master to

master_host='192.168.1.70',

master_port=3306,

master_user='xx',

master_password='xx';

然后使用start slave开启复制。

然后编译安装KeepAlived

进入keepalived-1.2.12目录

然后使用

./configure
make && make install

然后在Master服务器编辑KeepAlived的配置文件

vim /etc/keepalived/keepalived.conf


! Configuration File for keepalived



global_defs {

    router_id HA_MySQL

}



vrrp_instance VI_1 {

     state BACKUP

     interface eth0

     virtual_router_id 51

     priority 100

     advert_int 1

     nopreempt

     authentication {

         auth_type PASS

         auth_pass 1111

     }

     virtual_ipaddress {

         192.168.1.199

     }

}



virtual_server 192.168.1.199 3306 {

     delay_loop 2

     lb_algo wrr

     lb_kind DR

     persistence_timeout 60

     protocol TCP

     real_server 192.168.1.70 3306 {

         weight 3

         notify_down /root/shutdown.sh

         TCP_CHECK {

             connect_timeout 10

             nb_get_retry 3

             delay_before_retry 3

             connect_port 3306

         } 

     }

}

然后编辑Slave的配置文件

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

     router_id HA_MySQL

}



vrrp_instance VI_1 {

     state BACKUP

     interface eth0

     virtual_router_id 51

     priority 90

     advert_int 1

     nopreempt

     authentication {

         auth_type PASS

         auth_pass 1111

     }

     virtual_ipaddress {

         192.168.1.199

     }

}



virtual_server 192.168.1.199 3306 {

     delay_loop 2

     lb_algo wrr

     lb_kind DR

     persistence_timeout 60

     protocol TCP

     real_server 192.168.1.80 3306 {

         weight 3

         notify_down /root/shutdown.sh

         TCP_CHECK {

             connect_timeout 10

             nb_get_retry 3

             delay_before_retry 3

             connect_port 3306

         }

     }

}

其中

priority 表示优先级

virtual_ipaddress 虚拟的IP地址(VIP)

delay_loop 每个2秒检查一次real_server状态

notify_down 检测到服务down后执行的脚本

connect_timeout 连接超时时间

nb_get_retry 重连次数

delay_before_retry 重连间隔时间

connect_port 健康检查端口

 

shutdown.sh 可以考虑加入邮件告警的功能。

#!/bin/bash

pkill keepalived

在两个服务器上启动MySQL和KeepAlived服务

service mysql start
service keepalived start

Master的server_id为1

Slave的server_id为2

然后 连接VIP的MySQL,可以看到已经连接到了Master服务器(server_id为1)

如果kill掉Master的MySQL,KeepAlived会自动转移到Slave

在Master服务器上执行

killall mysqld

然后再次查看server_id,

短暂的失去连接之后,再次连接上VIP,server_id已经变为2,说明VIP已经指向了Slave

 

nopreempt参数表示Master恢复正常之后,是否将VIP继续指向Master

这样的话,会再次引发切换。


两台服务器的KeepAlived会有心跳检测,

如果Master的MySQL服务挂了(3306端口挂了),那么他会选择自杀.

Slave的KeepAlived通过心跳检测发现这个情况,就会将VIP的请求接管。

 

KeepAlived还有很多参数没有明白是什么意思

生产环境的切换脚本,在Slave提升为Master之后,应该等待所有的中继日志应用完毕,否则可能丢失数据