一、 部署环境

  • 服务器版本:CentOS 6.5 (Final)

  • 网络拓扑:

Keepalived学习笔记--LVS+Keepalived+Apache负载均衡架构_ keepalived

  • 网卡参数:

Keepalived学习笔记--LVS+Keepalived+Apache负载均衡架构_ 负载均衡_02


二、需求分析:

    使用LVS做负载均衡实现高性能,使用keepalived实现高可用,后端真实服务器为两台web服务器。


三、 特点:

    1. 当主调度器宕机后,不再发送心跳连接给从调度器,从调度器会接替其工作;当主调度其恢复后,它再次发送心跳连接给从调度器,从调度器切换至待机状态,主调度器恢复工作。

    2. 主/从调度器实事监控真实服务器的可用性,但某台真实服务器宕机后,调度器会自动将其在调度表中剔除;当真实服务器恢复工作后,再把其RIP添加至调度列表中。


四、 注意事项:

    服务器防火墙默认会阻挡心跳连接,从而MASTER/BACKUP无法相互识别,最终导致他们俩都以为对方挂了,各自都呈现工作状态,这样就有两个VIP同时配置在了调度器上,这样就会导致裂脑的情形。裂脑对网页服务器的影响不大,但是如果后台服务器是数据库服务器的话有可能就会造成重复读或脏数据,破化数据库完整性,影响较大。

    解决办法:

    1)在调度器上配置双网卡,让其互相识别。

    2)修改防火墙配置,让其互相识别。


五、 相关配置

1. 调度器端配置:

    1) 开启防火墙端口:

/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables restart

    2)安装LVS:

mkdir tools
cd tools
LANG=EN
wget 
tar zxf ipvsadm-1.24.tar.gz 
cd ipvsadm-1.24
uname -r    # 查看内核版本
ln -s /usr/src/kernels/2.6.32-431.17.1.el6.x86_64 /usr/src/linux    # 做软链接
ll /usr/src/ |grep linux    # 查看软链接是否生效
make
make install
ipvsadm
lsmod|grep ip_vs    # 查看调度器是否安装完成

    3)安装keepalived:

yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt-devel    # 安装keepalived前必须安装开发包
cd ..
ls
wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz
tar zxf keepalived-1.1.17.tar.gz
cd keepalived-1.1.17
./configure
make
make install
/bin/cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/    # 复制启动文件
/bin/cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
/bin/cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/    # 复制配置文件
/bin/cp /usr/local/sbin/keepalived /usr/sbin/
/etc/init.d/keepalived start    # 开启查看是否安装成功
/etc/init.d/keepalived stop    # 由于需要修改配置文件,因此先关闭

    4)修改keepalived配置文件(/etc/keepalived/keepalived.conf):

  • 主调度器上配置文件:

! Configuration File for keepalived

global_defs {
   notification_email {
     stzhou@stephenzhou.net
   }
   notification_email_from administrator@stephenzhou.net
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_MASTER    # 从调度器此处需要修改为LVS_BACKUP
}

vrrp_instance VI_1 {
    state MASTER    # 从调度器此处需要修改为BACKUP
    interface eth1
    virtual_router_id 51
    priority 150    # 从调度器此处需要修改为100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.29
    }
}

virtual_server 192.168.2.29 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.2.19 80 {
        weight 1
        TCP_CHECK {
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 3
		}
    }

    real_server 192.168.2.20 80 {
        weight 1
        TCP_CHECK {
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 3
		}
    }
}
  • 从调度器上配置文件(略)

  • 配置完之后启动keepalived服务:

ps -ef|grep keep    # 查看三个服务是否已全部开启(core/vrrp/check keepalived)
ip add    # 查看VIP是否在网卡上启用
ipvsadm -Ln    # 查看LVS调度器RIP分配状态

2. 真实服务器端配置文件(/root/scripts/rc_ctl):

注:此配置文件为真实服务器使用LVS架构常规配置,回环端口上绑定VIP并且进行ARP抑制操作。此处需要注意httpd服务开机自启以及防火墙端口配置。

#!/bin/sh
# created by stephen#2014-07-01

# description: config real server lo and apply non-arp

VIP=(
	192.168.2.29
	# 192.168.2.28
)

. /etc/init.d/functions

start(){
	for ((i=0;i<${#VIP[*]};i++))
	do
		ifconfig lo:$i ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up
		ifconfig lo:$i
		route add -host ${VIP[$i]} dev lo:$i
	done
	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
}

stop(){
	for ((i=0;i<${#VIP[*]};i++))
	do
		ifconfig lo:$i down
	done
	if [ ${#VIP[*]} -le 1 ];then
		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	
	fi
}
case "$1" in
start)
	action "realserver vip is tied" /bin/true
	start
;;
stop)
	action "realserver vip is canceled" /bin/true
	stop
;;
*)
	echo "Usage:$0 {start|stop}"
;;
esac

3. 其他

  • 修改防火墙,允许心跳连接(在大并发的情况下可能会关闭防火墙,以保证服务稳定性)。

vi /etc/sysconfig/iptable

添加两项防火墙允许项,一为调度器的心跳网卡网卡对,一为VRRP协议项:

-A INPUT -d 192.168.4.21 -j ACCEPT
-A INPUT -d 192.168.4.22 -j ACCEPT
-A INPUT -p vrrp -j ACCEPT
  • 配置心跳线路由(如果不配置的话心跳流量依然会走VIP所在的那个外网网段/eth1)以及自启动LVS服务:

    1)主调度器上:

route add -host 192.168.4.22 dev eth3
echo "route add -host 192.168.4.22 dev eth3" >/etc/rc.local    # 开机自添加项
echo "ipvsadm" >>/etc/rc.local

    2)从调度器上:

route add -host 192.168.4.21 dev eth3
echo "route add -host 192.168.4.21 dev eth3" >/etc/rc.local
echo "ipvsadm" >>/etc/rc.local
  • 真实服务器也需要开机自添加VIP绑定回环网卡和ARP抑制参数:

echo "/root/scripts/rc_ctl start" >>/etc/rc.local
  • 真实服务器需要开机自启动apache的web服务,以下以chkconfig方式实现:

chkconfig --level 345 httpd on    # 在345启动模式下开启
chkconfig --list|grep httpd    # 查看配置结果
  • 调度器上需要开机自启动keepalived服务:

chkconfig --level 345 keepalived on
chkconfig --list|grep keepalived


  • 查看keepalived日志:

cat /var/log/messages

4. 测试keepalived可用性

  • 主调度器宕机情形:局域网内随便取一台机器不停ping VIP,禁用主调度器物理网卡或直接关机,预想情形是ping失败两个request后重新ping通VIP,用ip add|grep $VIP查看后发现VIP已经绑定到了从调度器的网卡上了;主调度器恢复后VIP应该再次绑定到它上面,从调度器待机。

  • 真实服务器宕机情形:禁用某台真实服务器回环网卡或直接关机,预想情形是ipvsadm -Ln查看发现该服务器的RIP被剔除;真实服务器恢复后该机的RIP应该被自动加入到调度器列表中。


六、 参考博文:

    1. keepalived工作原理

    2. CentOS6.5高可用集群LVS+Keepalived(DR模式)

    3. Heartbeat+DRBD+MySQL高可用架构方案与实施过程细节

           4. Linux下chkconfig命令详解