1、背景

Mysql的高可用,有很多的方案,其中上一篇说的主从复制,仅仅是保障了数据有一份副本,当主mysql服务器故障的时候,是不能自动切换的。web服务器需要重新修改jdbc连接的地址为备用mysql服务器的地址,网页才能恢复访问呢。

这样的缺点有:

1、需要人工干预,如果无人值守,而故障发生在深夜,很可能就没有人处理。又或者估算虽然发生在白天,但是故障发现不及时,还是会影响业务。

2、业务会中断,会停机,在主mysql服务器挂掉,到发现,到修改web服务器指向,到业务恢复,中间会停止服务一段时间。

因此,本篇基于主从复制已经实现的基础上,实现mysql主从服务器的自动切换。


2、实验环境

Mysql虚拟IP:10.1.30.30

Mysql主服务器:10.1.30.28

Mysql从服务器:10.1.30.29


3、配置

3.1安装keepalive

yum install -y keepalived


3.2编辑keepalive配置文件

3.2.1主服务器配置文件

cd /etc/keepalived
rm keepalived.conf原有的配置文件
vi keepalived.conf,创建新的配置文件
! Configuration File forkeepalived
global_defs {
notification_email_from  [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MYSQL_HA      #标识,双主相同
 }
vrrp_instance VI_1 {
 state BACKUP           #两台都设置BACKUP
 interface eth1
 virtual_router_id 51       #主备相同
 priority 100   #优先级,另一台改为90
 advert_int 1
 nopreempt  #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 10.1.30.30
 }
}
virtual_server 10.1.30.30 3306 {
     delay_loop 2   #每个2秒检查一次real_server状态
     lb_algo wrr   #LVS算法
     lb_kind DR    #LVS模式
     persistence_timeout 60   #会话保持时间
     protocol TCP
     real_server 10.1.30.28 3306 {
         weight 3
         notify_down /etc/keepalived/mysql.sh  #检测到服务down后执行的脚本
         TCP_CHECK {
             connect_timeout 10    #连接超时时间
             nb_get_retry 3       #重连次数
             delay_before_retry 3   #重连间隔时间
             connect_port 3306   #健康检查端口
         }
     }
}


3.2.2从服务器配置文件

! Configuration File forkeepalived
global_defs {
notification_email_from  [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MYSQL_HA      #标识,双主相同
 }
vrrp_instance VI_1 {
 state BACKUP           #两台都设置BACKUP
 interface eth1
 virtual_router_id 51       #主备相同
 priority 90   #优先级,另一台改为90
 advert_int 1
 nopreempt  #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 10.1.30.30
 }
}
virtual_server 10.1.30.30 3306 {
     delay_loop 2   #每个2秒检查一次real_server状态
     lb_algo wrr   #LVS算法
     lb_kind DR    #LVS模式
     persistence_timeout 60   #会话保持时间
     protocol TCP
     real_server 10.1.30.29 3306 {
         weight 3
         notify_down /etc/keepalived/mysql.sh  #检测到服务down后执行的脚本
         TCP_CHECK {
             connect_timeout 10    #连接超时时间
             nb_get_retry 3       #重连次数
             delay_before_retry 3   #重连间隔时间
             connect_port 3306   #健康检查端口
         }
     }
}


3.2.3创建mysql进程检测脚本

然后在主备都创建如下一个文件。(主备都需要添加)

vim  /etc/keepalived/mysql.sh

内容如下:

#!/bin/bash
pkill keepalived
sleep  10
/etc/init.d/keepalived start  >/dev/null
----------(内容结束)
chmod +x /etc/keepalived/mysql.sh
service keepalived start


记得需要增加keepalived的开机自启动。

chkconfig keepalived on

重启后,可以用

/etc/init.d/keepalived status

来查看进程是否已启动。


注意:需要两台机器都先重启一下mysqld服务,然后手动

service keepalived restart

另外,可以用ip a s 查看浮动IP现在在哪台主机。


4、检验是否生效

4.1部署web站点

测试前,首先你得有个网站,可以参考之前的文章【实战演练】Linux操作系统05-用LAMP搭建网站【实战演练】Linux操作系统07-用tomcat搭建网站,部署一个。

当然,web与数据库要分开部署,而数据库部署在主mysql服务器(10.1.30.28)与从mysql服务器(10.1.30.29)。


4.2修改web配置

修改网站的config.php或者jdbc等连接数据库的文件,将数据库的HOST设置为VIP(10.1.30.30),而不是主或者从服务器的真实IP地址。


4.3测试

直接访问网站域名,看看网站是否正常访问。如果能够正常访问,登录主服务器,

service myslqd stop

然后继续访问网站域名,看看是否是否仍然能正常访问,如果可以,正面主从切换成功。