使用keepalived搭建高可用的LVS-DR集群
一:Keepalived服务概述
keepalived 是一个类似于 layer3, 4 & 5 交换机制的软件,也就是我们平时说的第 3 层、第 4 层和第 5层交换。 Keepalived 的作用是检测 web 服务器的状态,如果有一台 web 服务器死机,戒工作出现故障,Keepalived 将检测到,并将有故障的 web 服务器从系统中剔除,当 web 服务器工作正常后 Keepalived 自劢将web 服务器加入到服务器群中,这些工作全部自劢完成,丌需要人工干涉,需要人工做的只是修复故障的web 服务器。
keepalived 理论工作原理
Layer3,4&7 工作在 IP/TCP 协议栈的 IP 层, TCP 层,及应用层,。
原理分别如下: Layer3:Keepalived 使用Layer3的方式工作式时,Keepalived 会定期向服务器群中的服务器发送一个ICMP 的数据包(既我们平时用的Ping 程序), 如果发现某台服务的IP 地址没有激活,Keepalived 便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3 的方式是以服务器的IP 地址是否有效作为服务器工作正常与否的标准。Layer4: 主要以TCP 端口的状态来决定服务器工作正常与否。如web server 的服务端口一般是80,如果Keepalived 检测到80 端口没有启动,则Keepalived 将把这台服务器从服务器群中删除。Layer7:Layer5 就是工作在具体的应用层了,比Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。Keepalived 将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived 将把服务器从服务器群中剔除。
keepalived作用:
1.管理VIP VIP 会在LVS 之间漂移
2.监控LVS分发器
运行在主分发的Keepalived会以组播的形式向网络中宣告自己,即主分发器还活着,备用节点能收到。当备用节点,在一个时间单位中收不到组播,备用节点会认
为主LVS 挂了,开始接手主分发器工作,把VIP 配给自己。
3.管理RS
Keepalived会每隔一个时间段去做一次类似于访问的操作如:
探针:elinks http://192.168.3.64 -dump
Keepalived的安装与相关配置文件详解
1:安装ipvsadm软件:
[root@xuegod63~]# rpm -ivh /mnt/Packages/ipvsadm-1.25-9.el6.x86_64.rpm
安装keepalived
[root@xuegod63 ~]# tar zxvf keepalived-1.2.16.tar.gz
[root@xuegod63 ~]# cd keepalived-1.2.16
[root@xuegod61 keepalived-1.1.17]# ./configure --prefix=/usr/local/keepalived
[root@xuegod63 keepalived-1.2.16]# make -j 4 && make inatsll
[root@xuegod63 ~]# /etc/init.d/keepalived start
[root@xuegod63 ~]# chkconfig keepalived on
扩展:
虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议。使用组播方式通信。
VRRP是一种路由容错协议,也可以叫做备份路由协议。一个局域网络内的所有主机都设置缺省路由(默认网关),当网内主机发出的目的地址不在本网段时,报文将被通过缺省路由发往外部路由器,从而实现了主机与外部网络的通信。当缺省路由器down掉(即端口关闭)之后,内部主机将无法与外部通信,如果路由器设置了VRRP时,那么这时,虚拟路由将启用备份路由器,从而实现全网通信。
工作流程如图:
2:相关配置文件详解
[root@xuegod63 ~]# cd /usr/local/keepalived/etc/
[root@xuegod63 etc]# ls
keepalived rc.d sysconfig
注释:
keepalived #存放着keepalive的主配置文件。
rc.d #存放着keepalive的启动脚本文件,
sysconfig #存放着keepalive的加载文件,指定其加载主配置文件,才能正常启动
1)主配置文件:
[root@xuegod63 keepalived]# ls /usr/local/keepalived/etc/keepalived/keepalived.conf
/usr/local/keepalived/etc/keepalived/keepalived.conf
[root@xuegod63 ~]# vim /usr/local/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
注:
默认的配置文件中,使用第三方smtp服务器,但这在现实中几乎没有意义,发不出邮件,我们将其指定为localhost, 将通知信息的发送交给本地sendmail服务处理。router_id LVS_DEVEL #标识当前节点名字,两个节点的此项需要
vrrp_instanceapache {#定义一个实例,一个集群就是一个实例。VI_1 可以随意改
state MASTER#指定此节点为主节点,备用节点上设置为BACKUP即可
interface eth0#绑定虚拟IP的网络接口
virtual_router_id 51#VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组,以便于广播告诉主2备节点的情况
priority 100#主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1#组播信息发送间隔,两个节点设置必须一样
authentication {#设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {#指定虚拟IP, 两个节点设置必须一样
192.168.1.70
}
}
virtual_server 192.168.1.70 80 { #承接上一个配置文件中的定义虚拟IP地址
delay_loop 6 Keepalived #多长时间监测一次RS,真实服务器
lb_algo rr #分发算法
lb_kind DR DR #模式
nat_mask 255.255.255.0
persistence_timeout 50 # 同一IP 50秒内的请求都发到同个real server,这个会影响LVS的rr调度算法,同一IP超过50秒后,再次访问,才会被转发到另一台real server上。
persistence
real_server 192.168.1.62 80 { #配置服务节点1,需要指定realserver的真实IP地址和端口
weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
TCP_CHECK {
connect_timeout 3#表示3秒无响应超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3#表示重试间隔
connect_port 80 #连接端口
}
real_server 192.168.1.64 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
3:启动脚本
[root@xuegod63 ~]# ls /usr/local/keepalived/etc/rc.d/init.d/keepalived
/usr/local/keepalived/etc/rc.d/init.d/keepalived
加载文件
[root@xuegod63 ~]# ls /usr/local/keepalived/etc/sysconfig/keepalived
/usr/local/keepalived/etc/sysconfig/keepalived
四:实战案例
实验要求与分析
使用keepalived实现LVS-DR模式高可用机器名称,
分析:
在这种模式下,虚拟IP在某时刻只能属于某一个节点,另一个节点作为备用节点存在。当主节点不可用时,备用节点接管虚拟IP,提供正常服务。
配置参数:
节点xuegod63(主节点);节点xuegod61(备用节点);
虚拟IP192.168.1.70对外提供服务的IP。
要求默认情况下由节点xuegod63提供服务,当节点xuegod63不可用时,由节点xuegod61提供服务(即虚拟IP漂移至节点xuegod61)。
一:实验拓扑
二:实验环境
三:实验步骤
配置主LVS_keepalived xuegod63.cn
1:建立服务启动脚本,以便使用service命令控制之
[root@xuegod63 keepalived]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
[root@xuegod63 keepalived]# chmod +x/etc/init.d/keepalived
2. 修改/etc/init.d/keepalived
[root@xuegod63 keepalived]# vim /etc/init.d/keepalived
改. /usr/local/keepalived/etc/sysconfig/keepalived
添加: export PATH="$PATH:/usr/local/keepalived/sbin"
注:#将keepavlied主程序所在路径导入到环境变量PATH中,因为我们使用非默认路径(/usr/local)安装keepalived, 故需要修改几处路径,以保证keepalived能正常启动, 需要修改的文件如下:
3. 修改指定keepalived要加载的keepalive的主配置文件,设置正确的服务启动参数:
[root@xuegod63 etc]# vim /usr/local/keepalived/etc/sysconfig/keepalived
改:14KEEPALIVED_OPTIONS="-D -f /usr/local/keepalived/etc/keepalived/keepalived.conf"
4. 启动服务与开机启动
[root@xuegod63 etc]# /etc/init.d/keepalived restart
[root@xuegod63 etc]# chkconfig keepalived on
5:查看默认
[root@xuegod63 ~]# ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:12:f3:74 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.63/24 brd 192.168.1.255 scope global eth0
inet 192.168.200.16/32 scope global eth0
inet 192.168.200.17/32 scope global eth0
inet 192.168.200.18/32 scope global eth0
inet6 fe80::20c:29ff:fe12:f374/64 scope link
---------------------------------------------------------安装完成-----------------------------------------------------------
6:修改配置文件
[root@xuegod63 ~]# vim /usr/local/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server root@localhost
smtp_connect_timeout 30
router_id xuegod63
}
vrrp_instance apache{
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.70
}
}
real_server 192.168.1.62 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.64 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
注:
real_server192.168.1.6280{#配置服务节点1,需要指定realserver的真实IP地址和端口,IP与端口之间用空格隔开weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器connect_timeout 3 #表示3秒无响应超时nb_get_retry 3#表示重试次数delay_before_retry 3 #表示重试间隔
connect_port 80#检测端口}
默认配置文件中还有两个virtual_server模版,把剩下的都删除了,就可以。
如:
virtual_server 10.10.10.2 1358 {。。。}
virtual_server 10.10.10.3 1358{。。。}
7:测试:
[root@xuegod63 ~]# ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:12:f3:74 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.63/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.70/32 scope global eth0
[root@xuegod63 etc]# service keepalived restart
[root@xuegod63 etc]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.70:80 rr persistent 50
注:没有看到realserver,是因为两台realserver没有开启httpd服务。
配置xuegod61为备用LVS
1:安装ipvsadm软件:
[root@xuegod61~]# rpm -ivh /mnt/Packages/ipvsadm-1.25-9.el6.x86_64.rpm
2:安装keepalived
[root@xuegod63 ~]# scp keepalived-1.2.16.tar.gz 192.168.1.61:/root/ [root@xuegod61~]# tar zxvf keepalived-1.2.16.tar.gz
[root@xuegod61~]# cd keepalived-1.2.16
[root@xuegod61 keepalived-1.1.17]# ./configure --prefix=/usr/local/keepalived
[root@xuegod61 keepalived-1.1.17]# make -j 4 && make install
从xuegod63上直接复制对应的配置文件到xuegod61上:
3:建立服务启动脚本配置好,以便使用service命令控制
[root@xuegod63 ~]# scp /etc/init.d/keepalived 192.168.1.61:/etc/init.d/
4:修改指定keepalived要加载的配置文件,设置正确的服务启动参数:
[root@xuegod63 ~]#scp /usr/local/keepalived/etc/sysconfig/keepalived 192.168.1.61:/usr/local/keepalived/etc/sysconfig/
5:复制主配置文件
[root@xuegod63 ~]# scp /usr/local/keepalived/etc/keepalived/keepalived.conf 192.168.1.61:/usr/local/keepalived/etc/keepalived/
6:修改配置文件:
[root@localhost]# vim /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id xuegod61 #运行keepalived 的机器标示符
}
vrrp_instance apache {
state BACKUP#当前LVS 状态为从分发器
interface eth0
virtual_router_id 51
priority90#当前LVS 优先级,备的要比主的小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.70
}
}
7:重启服务:
[root@localhost ~]# /etc/init.d/keepalived restart
8:测试
测试备用节点
[root@xuegod63 ~]# service keepalived stop
查看日志
[root@xuegod61 rc.d]# tail -f /var/log/messages
Dec 6 02:34:29 xuegod61 Keepalived_vrrp[5290]: VRRP_Instance(apache{) Entering MASTER STATE
Dec 6 02:34:29 xuegod61 Keepalived_vrrp[5290]: VRRP_Instance(apache{) setting protocol VIPs.
Dec 6 02:34:29 xuegod61 Keepalived_healthcheckers[5289]: Netlink reflector reports IP 192.168.1.70 added
Dec 6 02:34:29 xuegod61 Keepalived_vrrp[5290]: VRRP_Instance(apache{) Sending gratuitous ARPs on eth0 for 192.168.1.70
配置xuegod62为RS1
1:编写脚本把虚拟IP(VIP)绑定到xuegod62的回环网卡上。
[root@xuegod62 ~]# vim /etc/init.d/lvsrsdr#写入以下内容
#!/bin/bash
#description : start realserver
VIP=192.168.1.70
source/etc/init.d/functions
case "$1" in
start)
echo " start LVS of RealServer DR"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $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
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS of RealServer DR"
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 "Usage: $0 {start|stop}"
exit 1
esac
2:启动并设置开机自启动:
[root@xuegod62 ~]# chmod +x /etc/init.d/lvsrsdr
[root@xuegod62 ~]# /etc/init.d/lvsrsdr start
[root@xuegod62~]# echo '/etc/init.d/lvsrsdr start' >> /etc/rc.local
[root@xuegod62 ~]# ifconfig
。。。
lo:0 Link encap:Local Loopback
inet addr:192.168.1.70 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
3:安装apache:
[root@xuegod62 ~]# yum install httpd -y
[root@xuegod62 ~]# echo '192.168.1.62' > /var/www/html/index.html
[root@xuegod62 ~]# service httpd restart
配置xuegod64为RS2
1:复制脚本:
[root@xuegod62 ~]# scp /etc/init.d/lvsrsdr root@192.168.1.64:/etc/init.d/
2:启动并设置开机自启动:
[root@xuegod64 ~]# chmod +x /etc/init.d/lvsrsdr
[root@xuegod64 ~]# /etc/init.d/lvsrsdr start
[root@xuegod64 ~]# echo '/etc/init.d/lvsrsdr start' >> /etc/rc.local
[root@xuegod64~]# ifconfig
。。。
lo:0 Link encap:Local Loopback
inet addr:192.168.1.70 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
3:安装apache:
[root@xuegod64~]# yum install httpd -y
[root@xuegod64~]# echo '192.168.1.64' > /var/www/html/index.html
[root@xuegod64~]# service httpd restart
4:测试---负载均衡
测试----VIP 192.168.1.70
注:这里同一IP地址50S以内,都分配到同一台realserver,等待50秒。
测试LVS高可用
1、测试高可用:
[root@xuegod63 keepalived]# /etc/init.d/keepalived stop
[root@ xuegod61~]# ipvsadm -L -n#查看ipvsadm资源和VIP已经转到xuegod61上来了
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.70:80 rr persistent 50
-> 192.168.1.62:80 Route 1 0 0
-> 192.168.1.64:80 Route 1 0 2
[root@localhost ~]#ip addr
。。。
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:c5:08:33 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.61/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.70/32 scope global eth0
查看日志:
[root@localhost keepalived]# tail -f /var/log/messages
Jul 26 22:00:49 localhost Keepalived_vrrp[4468]: VRRP_Instance(apache) Entering MASTER STATE
2、用客户端访问VIP 网站测试分发,看是否和之前没关闭之前一样正常分发。
http://192.168.1.70/
3、测试LVS主恢复正常后,自动从备分发器转到主分发器上。因为备的优先级低。
[root@xuegod63 keepalived]# /etc/init.d/keepalived start
[root@xuegod63 keepalived]# ip addr
。。。
inet 192.168.1.63/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.70/32 scope global eth0
inet6 fe80::20c:29ff:fe12:ec1e/64 scope link
valid_lft forever preferred_lft forever
[root@ xuegod61~]# ip addr #没有VIP了。
。。。
link/ether 00:0c:29:c5:08:33 brd ff:ff:ff:ff:ff:ff
测试RS容错
首先查看下lvs 配置ipvsadm -ln 可以看到所有RS 服务器地址
[root@xuegod63 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.70:80 rr persistent 50
-> 192.168.1.62:80 Route 1 0 30
-> 192.168.1.64:80 Route 1 0 2
把xuegod62的httpd服务关闭:
[root@xuegod62 www]# service httpd stop
查看:
[root@xuegod63 ~]# vim /var/log/messages
在将xuegod64启动再次查看日志
注:打开主LVS 的日志(/var/log/message),使其滚动输出。关闭其中一个RS 服务器网卡,看日志是否提示该IP 机器访问失败,然后是否提示将该机器从LVS 中移除。答案都是提示的。
使用ipvsadm -ln 可以看到刚才关闭的那台机器的IP 不在列表中了。
注:当keepalived主从优先级一样时,当主恢复后,还是要回切资源的。第一次建立主从关系时,需要10s左右的认证时间。
排错
报错信息:
[root@xuegod61 keepalived-1.2.16]# ./configure
解决办法:由提示可以看到,没有发现gcc cc 编译工具,只需要安装即可。解决方法:
[root@xuegod61 keepalived-1.2.16]#yum install gcc gcc-C++
解决方法:内核源码做软链接,查看是否有内核源码
[root@xuegod61 ~]#ls /usr/src/kernels/
[root@xuegod61 ~]#yum install kernel-devel ipvsadm
[root@xuegod61 ~]#ln -s /usr/src/kernels/2.6.32-220.el6.x86_64/ /usr/src/linux
注:上面ln 软链接时源地址根据系统版本的不同,目录名也不同
Configure 最后输出说明