mysql Lvs+Keepalived+Mysql单点写入主主同步

  Lvs+Keepalived+Mysql单点写入读负载均衡主主同步高可用方案

1.1  方案简介

Lvs+keepalived作为目前比较流行的高可用解决方案,lvs提供负载均衡,keepalived作为故障转移,提高系统的可用性。但是一般的mysql高可用为了实现mysql数据的一致性,一般都是采用单点写入,本方案采用keepalived中的sorry_server来实现写入数据库为单点的需求,读负载均衡通过lvs实现,读能自由的实现负载均衡和故障切换。本方案实现的功能是当网络有问题、mysql有问题、服务器宕机、keepalived服务停止后,服务器能自动跳转到备用机,当主服务器服务启动起来后会自动切换回来。

1.2  方案架构图

mysql Lvs+Keepalived+Mysql单点写入主主同步_第1张图片

1.3  方案优缺点

优点:

ü  实现方便,高可用效率好,可以根据服务与系统的可用性多方面进行切换。

ü  可以将写VIP和读VIP分别进行设置,为读写分离做准备。

ü  扩展很方便。可以在后面添加多个从服务器,并做到负载均衡。

缺点:

ü  在启动或者恢复后会立即替换掉定义的sorry_server,因此如果要实现指定条件替换或者不替换需要通过其他方式实现,比如:临时更改mysql的端口等。

ü  安装配置比单写入稍微复杂,需要另外一个VIP。管理比单写入复杂。

ü  主切换后从需要手工切换。

ü  切换需要1s左右的时间。

 

1.4  适用场景

这个方案适用于只有两台数据库服务器(后端有多个从服务器也是可以的,只是要手工切换从服务器比较麻烦,后面会介绍的MMM能将从服务器自动切换)并且还能实现数据库的读写分离的情况,这样backup机器也能用起来,提高系统资源的利用率,减少master端的负载。应用中读数据库配置读VIP,写数据库配置写VIP。这个方案也能够很方便的进行单台数据库的管理维护以及切换工作。比如进行大表的表结构更改、数据库的升级等都是非常方便的。

1.5  方案实战

1.5.1 实战环境介绍

服务器名

IP

VIP

系统

Mysql

Master

10.1.1.113

10.1.1.176
10.1.1.177

Centos 5.5 64bit

5.1.63

Backup

10.1.1.75

10.1.1.176
10.1.1.177

Centos 5.5 64bit

5.1.63

 

1.5.2 Mysql的安装和配置

Mysql的安装和配置相对来讲非常简单,这里就不做介绍,有兴趣的朋友可以查看我博客中关于mysql 5.1.63版本自动安装的文章http://blog.chinaunix.net/uid-20639775-id-3168737.html

1.5.3 Mysql的主主同步配置

Mysql的主主同步这里也不做介绍了,有兴趣的话可以看一下我博文中关于mysql主从同步管理的介绍,主主同步和主从同步差不多,只是互为主从而已,链接如下:http://blog.chinaunix.net/uid-20639775-id-3254611.html

1.5.4 Lvs的安装

在master、backup服务器都进行安装:

wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz

ln -s /usr/src/kernels/2.6.18-164.el5-i686/ /usr/src/linux

tar zxvf ipvsadm-1.24.tar.gz

cd ipvsadm-1.24

make && make install

1.5.5 Keepalived的安装

在master、backup服务器都进行安装:

wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz
tar zxvf keepalived-1.1.19.tar.gz
cd keepalived-1.1.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

1.5.6 Keepalived的配置

1.5.6.1   Master的keepalived的配置

Master和backup不一样的地方已经标记为红色

vim /etc/keepalived/keepalived.conf

global_defs {

 

notification_email {

               [email protected]

        }

        notification_email_from [email protected]

        smtp_server mail.test.com

        smtp_connect_timeout 30

        router_id LVS1

}

 

vrrp_sync_group test {

group {

        loadbalance

}

}

 

vrrp_instance loadbalance {

        state MASTER

        interface eth0

        lvs_sync_daemon_inteface eth0

        virtual_router_id 51

        priority 180

        advert_int 1

 

authentication {

        auth_type PASS

        auth_pass 1111

}

 

virtual_ipaddress {

        10.1.1.176 dev eth0 label eth0:1

        10.1.1.177 dev eth0 label eth0:2

}

}

 

virtual_server 10.1.1.176 3306 {

        delay_loop 6

        lb_algo rr

        lb_kind DR

        persistence_timeout 20

        protocol TCP

        sorry_server 10.1.1.75 3306

        real_server 10.1.1.113 3306 {

        weight 3

        TCP_CHECK {

        connect_timeout 3

        nb_get_retry 3

        delay_before_retry 3

        connect_port 3306

}

}

}

 

virtual_server 10.1.1.177 3306 {

        delay_loop 6

        lb_algo rr

        lb_kind DR

        #persistence_timeout 20

        protocol TCP

        real_server 10.1.1.113 3306 {

        weight 3

        TCP_CHECK {

        connect_timeout 3

        nb_get_retry 3

        delay_before_retry 3

        connect_port 3306

}

}

        real_server 10.1.1.75 3306 {

        weight 3

        TCP_CHECK {

        connect_timeout 3

        nb_get_retry 3

        delay_before_retry 3

        connect_port 3306

}

}

}

1.5.6.2   Backup的keepalived的配置

Master和backup不一样的地方已经标记为红色

vim /etc/keepalived/keepalived.conf

global_defs {

 

notification_email {

               [email protected]

        }

        notification_email_from [email protected]

        smtp_server mail.test.com

        smtp_connect_timeout 30

        router_id LVS1

}

 

vrrp_sync_group test {

group {

        loadbalance

}

}

 

vrrp_instance loadbalance {

        state BACKUP

        interface eth0

        lvs_sync_daemon_inteface eth0

        virtual_router_id 51

        priority 150

        advert_int 1

 

authentication {

        auth_type PASS

        auth_pass 1111

}

 

virtual_ipaddress {

        10.1.1.176 dev eth0 label eth0:1

        10.1.1.177 dev eth0 label eth0:2

}

}

 

virtual_server 10.1.1.176 3306 {

        delay_loop 6

        lb_algo rr

        lb_kind DR

        persistence_timeout 20

        protocol TCP

        sorry_server 10.1.1.75 3306

        real_server 10.1.1.113 3306 {

        weight 3

        TCP_CHECK {

        connect_timeout 3

        nb_get_retry 3

        delay_before_retry 3

        connect_port 3306

}

}

}

 

virtual_server 10.1.1.177 3306 {

        delay_loop 6

        lb_algo rr

        lb_kind DR

        persistence_timeout 20

        protocol TCP

        real_server 10.1.1.113 3306 {

        weight 3

        TCP_CHECK {

        connect_timeout 3

        nb_get_retry 3

        delay_before_retry 3

        connect_port 3306

}

}

        real_server 10.1.1.75 3306 {

        weight 3

        TCP_CHECK {

        connect_timeout 3

        nb_get_retry 3

        delay_before_retry 3

        connect_port 3306

}

}

}

1.5.7 Master和backup的realserver的配置

对于realserver的配置master和backup是一致的,脚本内容如下:

vim /etc/rc.d/init.d/realserver.sh

#!/bin/bash

# description: Config realserver lo and apply noarp

 

SNS_VIP=10.1.1.176

SNS_VIP2=10.1.1.177

/etc/rc.d/init.d/functions

case "$1" in

 

start)

       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP

        ifconfig lo:1 $SNS_VIP2 netmask 255.255.255.255 broadcast $SNS_VIP2

       /sbin/route add -host $SNS_VIP dev lo:0

        /sbin/route add -host $SNS_VIP2 dev lo:1

       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

       ifconfig lo:1 down

       route del $SNS_VIP >/dev/null 2>&1

       route del $SNS_VIP2 >/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

exit 0

1.5.8 Master和backup的启动

启动master和backup的mysql以后,再在master和backup执行如下命令启动keepalived和realserver脚本:

/etc/rc.d/init.d/realserver.sh start

/etc/rc.d/init.d/keepalived start

并将keepalived和realserver的启动脚本加入到rc.local自启动中:

echo “/etc/rc.d/init.d/realserver.sh start” >> /etc/rc.local

echo “/etc/rc.d/init.d/keepalived start” >> /etc/rc.local

1.5.9 高可用方案测试

方案搭建好以后就要进行全方位的可靠性测试了,看看是否达到了我们的预期效果,大致测试步骤如下:

ü  停掉master上的mysql,看看能写IP否自动切换到sorry_server,看看读IP是否去掉了master的mysql,使用如下命令查看:ipvsadm –ln。

ü  停掉master上的keepalived,看读写VIP是否会迁移到backup上。

ü  启动master上的mysql,看是否能切换回master。

ü  启动master上的keepalived,看VIP是否会迁移回master上。

ü  重启master的系统,看看切换过程是否OK

你可能感兴趣的:(系统架构)