「MySQL高可用」单点写入主主同步
方案简介
lvs提供负载均衡,keepalived作为故障转移,提高系统可用性。本方案能实现网络故障、mysql有问题、服务器宕机、keepalived服务停止后,服务能自动切换到备用服务器,主服务器恢复后,再切换回来。
方案优缺点
优点:
- 安装配置简单,实现方便高可用效率好
- 可将写VIP和读VIP分别进行设置,为读写分离做准备
- 可以增加多个从服务器,并做到负载均衡
缺点:
- 在启动或恢复 后会立即替换掉定义的sorry_server,因此如果要实现指定条件替换或者不替换,需要通过其他方式实现。比如:临时更改mysql端口等。
- 切换需要1s左右时间。
方案架构图

适用场景
这个方案适用于只有两台数据库服务器并且还没有实现数据库的读写分离的情况,读和写都配置VIP。这个方案能够便于单台数据库的管理维护及切换工作。
安装环境
服务器 | IP | VIP | 系统 | Mysql |
Master | 192.168.240.100 | 192.168.240.88 | Centos6.5 X86_64 | 5.6.25 |
Backup | 192.168.240.128 | 192.168.240.88 | Centos6.5 X86_64 | 5.6.25 |
配置主主同步
这里不讲解
LVS+KeepAlived配置安装
ipvsadm安装 (Master和Backup都需安装)
# yum install kernel-devel
# ln -s /usr/src/kernels/2.6.32-573.7.1.el6.x86_64/ /usr/src/linux
# yum install libnl* popt-static
# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
# tar zxvf ipvsadm-1.26.tar.gz
# cd ipvsadm-1.26
# make&&make install
keepalived安装(Master和Backup都需安装)
# wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
# tar zxvf keepalived-1.2.19.tar.gz
# cd keepalived-1.2.19
# ./configure --prefix=/usr/local/keepalived
# make&&make install
# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
# mkdir /etc/keepalived
配置keepalived
# vim /etc/keepalived/keepalived.conf Master配置
# wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
# tar zxvf keepalived-1.2.19.tar.gz
# cd keepalived-1.2.19
# ./configure --prefix=/usr/local/keepalived
# make&&make install
# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
# mkdir /etc/keepalived
# vim /etc/keepalived/keepalived.conf Backup配置
! Configuration File for keepalived
global_defs {
notification_email {
itchat@foxmail.com
}
notification_email_from keepalived@backup.com
smtp_server localhost
smtp_connect_timeout 30
router_id LVS1
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.240.88
}
}
virtual_server 192.168.240.88 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 20
protocol TCP
sorry_server 192.168.240.128 3306
real_server 192.168.240.100 3306 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
配置realserver (Master和Backup都需做)
# vim /etc/init.d/realserver
#!/bin/bash
# description: Config realserver lo and apply noarp
SNS_VIP=192.168.240.88
/etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
# chmod 755 /etc/rc.d/init.d/realserver
# chmod 755 /etc/rc.d/init.d/functions
# echo "/etc/init.d/realserver start" >>/etc/rc.d/rc.local 设置realserver开机启动
启动Master和Backup上的mysql服务后,再启动keepalived和realserver
# /etc/init.d/keepalived start
# /etc/init.d/realserver start
# chkconfig --level 2345 keepalived on
验证是否成功
验证方法:
√ 停掉master上的mysql,看看能写IP否自动切换到sorry_server,使用如下命令查看:ipvsadm –ln。
√ 停掉master上的keepalived,看读写VIP是否会迁移到backup上。
√ 启动master上的mysql,看是否能切换回master。
√ 启动master上的keepalived,看VIP是否会迁移回master上。
√ 重启master的系统,看看切换过程是否OK
下面只举例:验证一(停掉Master的Mysql)
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.88:3306 rr persistent 20
-> 192.168.240.128:3306 Route 1 0 0
停掉Master上的mysql
# service mysqld stop
分别查看master backup上的日志
# tail -f /var/log/messages Master上日志
Oct 8 16:37:52 Master Keepalived_healthcheckers[3437]: TCP connection to [192.168.240.100]:3306 failed !!!
Oct 8 16:37:52 Master Keepalived_healthcheckers[3437]: Removing service [192.168.240.100]:3306 from VS [192.168.1.88]:3306
Oct 8 16:37:52 Master Keepalived_healthcheckers[3437]: Lost quorum 1-0=1 > 0 for VS [192.168.1.88]:3306
Oct 8 16:37:52 Master Keepalived_healthcheckers[3437]: Adding sorry server [192.168.240.128]:3306 to VS [192.168.1.88]:3306
Oct 8 16:37:52 Master Keepalived_healthcheckers[3437]: Removing alive servers from the pool for VS [192.168.1.88]:3306
Oct 8 16:37:52 Master Keepalived_healthcheckers[3437]: Remote SMTP server [0.0.0.0]:25 connected.
# tail -f /var/log/messages Backup上日志
Oct 8 16:37:45 Backup Keepalived_healthcheckers[2448]: TCP connection to [192.168.240.100]:3306 failed !!!
Oct 8 16:37:45 Backup Keepalived_healthcheckers[2448]: Removing service [192.168.240.100]:3306 from VS [192.168.240.88]:3306
Oct 8 16:37:45 Backup Keepalived_healthcheckers[2448]: Lost quorum 1-0=1 > 0 for VS [192.168.240.88]:3306
Oct 8 16:37:45 Backup Keepalived_healthcheckers[2448]: Adding sorry server [192.168.240.128]:3306 to VS [192.168.240.88]:3306
Oct 8 16:37:45 Backup Keepalived_healthcheckers[2448]: Removing alive servers from the pool for VS [192.168.240.88]:3306
Oct 8 16:37:45 Backup Keepalived_healthcheckers[2448]: Remote SMTP server [0.0.0.0]:25 connected.
Oct 8 16:37:58 Backup Keepalived_healthcheckers[2448]: SMTP alert successfully sent.
方案已知问题:Master上的Mysql服务停掉后,VIP并不会切换到sorry_server,这将导致写vip不连接。要实现自动切换VIP,需要借助第三方工具或脚本监控。