如果将 TCP/IP 划分为 5 层,则 Keepalived 就是一个类似于 3~5 层交换机制的软件,具有 3~5 层交换功能,其主要作用是检测 web 服务器的状态,如果某台 web 服务器故障,Keepalived 将检测到并将其从系统中剔除,当该 web 服务器工作正常后 Keepalived 自动将其加入到服务器群中,这些工作全部自动完成,而不需要人工干预,只需要人工修复故障的 web 服务器即可。
Keepalived 基于 VRRP 协议来实现高可用的解决方案,利用其避免单点故障,通常这个解决方案中,至少有 2 台服务器运行 Keepalived ,即一台为 MASTER ,另一台为 BACKUP ,但对外表现为一个虚拟 IP ,MASTER 会发送特定消息给 BACKUP,当 BACKUP 收不到改消息时,则认为 MASTER 故障了,BACKUP 会接管虚拟 IP ,继续提供服务,从而保证了高可用性,具体如下图。
3 层机理是发送 ICMP 数据包即 PING 给某台服务器,如果不通,则认为其故障,并从服务器群中剔除。
4 层机理是检测 TCP 端口号状态来判断某台服务器是否故障,如果故障,则从服务器群中剔除。
5 层机理是根据用户的设定检查某个服务器应用程序是否正常运行,如果不正常,则从服务器群中剔除。
主要作用 RealServer 的健康检查,以及负载均衡设备 MASTER 和 BACKUP 之间 failover 的实现。
本系列文章以 CentOS Linux release 6.0(Final) 为例,介绍用 LVS + Keepalived 实现高可用负载均衡。具体业务需求是用虚拟 IP 转发 88、25、21 端口请求到后端的真实服务器来处理业务逻辑,系统拓扑如下图:
MASTER 和 BACKUP 都必须安装 LVS ,安装 ipvsadm 步骤如下:
(1)依赖包安装
执行如下命令查看依赖包是否安装:
rpm -qa|grep popt
一般若安装了会打印以下信息
popt-static-1.13-7.el6.x86_64
popt-devel-1.13-7.el6.x86_64
popt-1.13-7.el6.x86_64
若没有上述的包,则需要依次安装,具体如下:
yum install popt
yum install popt-devel
yum install popt-staticx
再检查 libnl 是否安装
rpm -qa|grep libnl
若已安装,会打印如下信息
libnl-1.1-14.el6.x86_64
libnl-devel-1.1-14.el6.x86_64
如果没有上述的包,则需要依次安装,具体如下:
yum install libnl
yum install libnl-devel
(2) ipvsadm 安装
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
tar zxvf ipvsadm-1.26.tar.gz
ln -s /usr/src/kernels/2.6.32-71.el6.x86_64 /usr/src/linux //注意:每个系统这个路径可能会不一样
cd ipvsadm-1.26
make
make install
至此, LVS 就安装完成了
MASTER 和 BACKUP 都必须安装 Keepalived,安装步骤如下:
wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
tar zxvf keepalived-1.2.7.tar.gz
cd keepalived-1.2.7
./configure
make
make install
通过以上步骤,Keepalived安装好了。 如果 ./configure 时出现下面错误:
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!
则需要安装 OpenSSL 相关包,通过以下命令进行安装:
yum install openssl
yum install openssl-devel
然后从 ./configure 步骤开始执行以下后续步骤就行。
将 Keepalived 做成服务启动 (MASTER 和 BACKUP 都是必须得),具体步骤如下:
(1) 拷贝服务启动脚本
cp ./keepalived/etc/init.d /etc/init.d
(2)拷贝配置文件
mkdir /etc/keepalived
cp ./keepalived/etc/keepalived/keepalived.conf /etc/keepalived
(3)拷贝可执行文件
cp ./bin/keepalived /usr/bin
(4)启动/停用服务
service keepalived start
service keepalived stop
备份并打开配置文件修改部分内容,尤其注意红色部分,具体如下:
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vi /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER # 状态实际 MASTER
interface eth0 # 监听网卡切换
virtual_router_id 51
priority 100 # 优先级(越大优先级越高)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 虚拟 IP 地址列表,即 VIP
172.28.14.227
172.28.14.228
172.28.14.229
}
}
virtual_server 172.28.14.227 8080 {
delay_loop 6
lb_algo wlc
lb_kind DR # DR模式
persistence_timeout 50
protocol TCP
real_server 172.28.19.100 8080 {
weight 1 # 权重(权重越高处理的请求越多)
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8080
}
}
real_server 172.28.19.101 8080 {
weight 1 # 权重(权重越高处理的请求越多)
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8080
}
}
real_server 172.28.19.102 8080 {
weight 1 # 权重(权重越高处理的请求越多)
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8080
}
}
}
virtual_server 172.28.14.228 25 {
delay_loop 6
lb_algo wlc
lb_kind DR # DR 模式
persistence_timeout 50
protocol TCP
real_server 172.28.19.103 25 {
weight 1 # 权重(权重越高处理的请求越多)
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 25
}
}
real_server 172.28.19.104 25 {
weight 1 # 权重(权重越高处理的请求越多)
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 25
}
}
real_server 172.28.19.105 25 {
weight 1 # 权重(权重越高处理的请求越多)
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 25
}
}
}
virtual_server 172.28.14.229 21 {
delay_loop 6
lb_algo wlc
lb_kind DR # DR 模式
persistence_timeout 50
protocol TCP
real_server 172.28.19.106 21 {
weight 1 # 权重(权重越高处理的请求越多)
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 21
}
}
real_server 172.28.19.107 21 {
weight 1 # 权重(权重越高处理的请求越多)
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 21
}
}
real_server 172.28.19.108 21 {
weight 1 # 权重(权重越高处理的请求越多)
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 21
}
}
}
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vi /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKP # 状态实际 BACKUP
...
priority 99 # 优先级99(比 MASTER 优先级 100 低)
...
}
vi realserverd
# !/bin/bash
VIP=172.28.14.227
. /etc/rc.d/init.d/functions
case "$1" in
start)
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
ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
sysctl -p > /dev/null 2>&1
echo "realserver start OK"
;;
stop)
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
ifconfig lo:0 down
/sbin/route del $VIP > /dev/null 2>&1
echo "realserver stoped"
;;
*)
echo "Usage:$0 {start|stop}"
exit 1
esac
exit 0
注意脚本中红色部分,每块网卡绑定一个虚拟IP地址,如果绑定多个虚拟IP,则需要为每块网卡创建一个脚本,并且指定 lo:X(比如:lo:0,lo:1 等),另外,和 ./etc/rc.d/funtions 之间有空格。
启动 keepalived 服务,并执行上述脚本,然后用 ip a 能确认是否有 VIP 地址。
输入 ipvsadm -Ln 查看 LVS 工作状态。
停止 MASTER 的 keepalived 服务,BACKUP 能接管 VIP 地址,再次启动 MASTER 的 keepalived 服务,MASTER 又能再一次接管 VIP 地址。
如果这些你都搞定了,恭喜你,你已经拥有高可用服务了!
阿里云低价购买云服务,值得一看