首页 数据库 mysql

「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,需要借助第三方工具或脚本监控。

相关推荐