首页 > 代码库 > 使用keepalived搭建高可用的LVS-DR集群

使用keepalived搭建高可用的LVS-DR集群

使用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 层,及应用层, 

原理分别如下: Layer3Keepalived 使用Layer3的方式工作式时,Keepalived 会定期向服务器群中的服务器发送一个ICMP 的数据包(既我们平时用的Ping 程序), 如果发现某台服务的IP 地址没有激活,Keepalived 便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3 的方式是以服务器的IP 地址是否有效作为服务器工作正常与否的标准。Layer4: 主要以TCP 端口的状态来决定服务器工作正常与否。如web server 的服务端口一般是80,如果Keepalived 检测到80 端口没有启动,则Keepalived 将把这台服务器从服务器群中删除。Layer7Layer5 就是工作在具体的应用层了,比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,这个会影响LVSrr调度算法,同一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

 

 

 

配置xuegod62RS1

 

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

 

配置xuegod64RS2

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    

xuegod62httpd服务关闭:

[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 最后输出说明

 技术分享


本文出自 “末班车” 博客,请务必保留此出处http://blxueyuan.blog.51cto.com/9673381/1880567

使用keepalived搭建高可用的LVS-DR集群