首页 > lvs

keepalived程序因为他的配置简单,维护容易而广为各位linuxer使用,蚊子自然也不会放过这么好的一款软件了,关于keepalived的做lvs高可用的文章已经满google都是了,蚊子自然就不在这里赘述了。蚊子这篇文章讲述的是如何只使用两台机器使用keepalived搭建web服务的高可用负载均衡

之前在蚊子的《》一篇文章中,介绍了使用heartbeatlvs和squid来搭建双机高可用负载均衡的上网服务器,有兴趣的朋友可以对比一下现在这篇和上篇。

一、试验环境

vmware6.0
linux01 192.168.211.128  CentOS release 5.3 (Final)
linux02 192.168.211.129  CentOS release 5.3 (Final)
web:httpd-2.2.3-31.el5.centos
keepalived版本:keepalived-1.1.19.tar.gz

二、安装程序

1、keepalived的安装

首先到http://www.keepalived.org/download.html下载最新的keepalived程序

# tar zxvf keepalived-1.1.19.tar.gz
# cd keepalived-1.1.19
# ./configure –prefix=/ –with-kernel-dir=/usr/src/kernels/2.6.18-128.el5-i686
# make
# make install

# cp keepalived/etc/init.d/keepalived.rh.init /etc/init.d/keepalived
# chmod +x /etc/init.d/keepalived
# cp keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived

2、web的安装

因为蚊子只是为了实现功能,所以只使用了centos自己的apache,如果默认系统没有按照httpd,使用

# yum –y install httpd

3、ipvsadm的安装

ipvsadm的安装也很简单,如果系统默认没有,则使用

# yum –y install ipvsadm

以上两个步骤在两台机器上是一样的。

三、 配置部分

1、linux01上的配置

1.1、keepalived的配置

编辑/etc/keepalived/keepalived.conf

# vi /etc/keepalived/keepalived.conf ,添加如下内容

! Configuration File for keepalived

global_defs {
   notification_email {
     admin@example.com
   }
   notification_email_from admin@example.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id linux01
}

vrrp_instance VI_1 {                               #定义一个实例
    state BACKUP                                    #设置为backup,然后通过priority控制哪台提升为主
    interface eth0
    virtual_router_id 51
    priority 100
    nopreempt                                          #在priority高的这台设置这个参数,方便当主恢复后
    advert_int 1                                        #可以自动接管
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.211.110 dev eth0 label eth0:0                #这里使用label标签启用eth0:0
    }
}

virtual_server 192.168.211.110 80 {                        #这里往下是定义LVS
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    protocol TCP

    real_server 127.0.0.1 80 {                            #其中一台是本地web服务
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }
    real_server 192.168.211.129 80 {             #另一台的web服务
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }  
}

1.2、web配置

web使用apache默认的配置,唯一修改的就是添加了自己的index.html文件,为了方便之后的测试

# echo “linux01”>/var/www/html/index.html

1.3、关于本机启动回环地址

众所周知,要是用lvs的dr模式,必须在realserver上启动回环地址,所以,搭建两台机器的负载均衡,当然就得在本机也启动相应的回环地址,才能实现所要的功能,脚本如下

# vi /usr/local/bin/startlo

#!/bin/sh

VIP=192.168.211.110

case "$1" in
  stop)
        # close lo:0 interface

        echo $"Close lo:0 interface"
        /sbin/route del -host $VIP dev lo:0
        /sbin/ifconfig lo:0 down
        echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
        echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore
        ;;
  start)
        # start lo:0 interface

        echo $"Start lo:0 interface"
        /sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up
        /sbin/route add -host $VIP dev lo:0
        echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
        echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
        ;;
  *)
        echo $"Usage: $0 (start|stop)"
        exit 1
        ;;
esac

但由于keepalived不像heartbeat里有ldirectord来控制回环地址的启动和停止,所以我们需要人为的判断应该在哪台机器上启动回环地址,所以蚊子就写了下面的一个脚本,

# vi /usr/local/bin/check_interface

#!/bin/bash
#
#作者:蚊子
#
#脚本说明:
#本脚本用于判断当前server是否是master
#如果当前server不是master,则启动回环地址
#否则停止回环地址
#
#VIP_interface请根据自己的情况自行设定,这个是VIP接口
#lo_interface请根据自己的情况自行设定,是回环地址接口

VIP_interface="eth0:0"
lo_interface="lo:0"

i=10

while [ $i != 0 ]
do
    /sbin/ifconfig |grep $VIP_interface &>/dev/null
    retval=$?
    if [ ! $retval -eq 0 ];then
        /sbin/ifconfig |grep $lo_interface &>/dev/null
        retval=$?
        if [ ! $retval -eq 0 ];then
            /usr/local/bin/startlo start
        fi
    else
        /sbin/ifconfig |grep $lo_interface &>/dev/null
        retval=$?
        if [ $retval -eq 0 ];then
            /usr/local/bin/startlo stop
        fi
    fi
    i=10
    sleep 10
done

2、linux02上的配置

2.1、keepalived的配置

具体的配置这里就不给出了,请参考linux01上的配置,唯一的区别

A、priority的值小于linux01上值,蚊子设置为50
B、在vrrp_instance VI_1的配置中不用设置nopreempt  
C、修改realserver部分的ip为本机和另外一台server的ip地址

2.2、web的配置

apache的配置和linux01一样使用默认配置,同意是编辑默认的index.html文件

# echo “linux02”>/var/www/html/index.html

2.3、本地回环地址的设置

这部分内容和linux01上的一样,相关脚本可以拷贝过来直接使用

四、启动测试

到此,一切准备就绪就可以测试了

首先将所有需要的脚本设置可执行权限。依次启动相应的服务

A、# /etc/init.d/httpd start
B、# /usr/local/bin/check_interface &
C、# /etc/init.d/keepalived start

如果没有任何报错,说明服务已经启动,keepalived的日志存放在/var/log/messages中,如果有错误,请自行查看

测试1:当前状态下测试负载均衡情况

方法:打开ie浏览器,输入http://192.168.211.110,然后不断用ctrl+F5强制刷新,可以看到网页内容在linux01和linux02中切换

测试2:停止linux01的keepalive,测试负载均衡情况

方法:

A、/etc/init.d/keepalived stop
然后等待几秒可以看到linux01上的lo:0地址已经启动,而linux02上的lo:0已经停止

B、打开ie浏览器,输入http://192.168.211.110,然后不断用ctrl+F5强制刷新,可以看到网页内容在linux01和linux02中切换

测试3:开启linux01上的keepalived,观察linux01是否切换回master

方法:启动keepalived程序,使用ifconfig观察linux01上已经启动了eth0:0接口,同时lo:0接口停止,linux02上eth0;0接口停止,同时lo:0接口启动

阅读全文
今天有人在群里喊谁做过lvs+squid,正好以前做过一个,我就把过程整理下来,供大家参考。首先看看拓扑图如下
说下我写这篇文章所用的测试环境,vmvare6.0,模拟两个linux,用的是centos5.1
squid-1(192.168.211.128)
squid-2(192.168.211.130)
Vip(192.168.211.135)
实现方式lvs-dr
1,lvs配置部分
安装lvs所需要的软件

yum -y install heartbeat

yum y install heartbeatldirectord

yum -y install heartbeat-devel

yum y install ipvsadm

配置Ldirector
vi /etc/ha.d/ldirectord.cf设置如下内容,两台机器文件内容相同

# Global Directives

checktimeout=3

checkinterval=1

autoreload=yes

logfile=“/var/log/ldirectord.log”

logfile=“local0”

#emailalert=“admin@x.y.z”

#emailalertfreq=3600

#emailalertstatus=all

quiescent=yes

# Sample for an http virtual service

virtual=192.168.211.135:3128

real=192.168.211.128:3128 gate

real=192.168.211.130:3128 gate

scheduler=rr

#persistent=600

#netmask=255.255.255.255

protocol=tcp

checktype=negotiate

checkport=3128

配置heartbeat

vi /etc/ha.d/ha.cf

debugfile /var/log/ha-debug

logfile /var/log/ha-log

logfacility local0

keepalive 2

deadtime 30

warntime 10

initdead 120

udpport 694

ucast eth0 192.168.211.130 #另外一台这里要设置成另外的ip

auto_failback on

node contos5-1-1 #通过uanme -n得到

node contos5-1-2

ping_group group1 192.168.211.128 192.168.211.130

respawn hacluster /usr/lib/heartbeat/ipfail

这里之所以使用ucast而不用bcast是因为,如果同网段你还有另外的一套lvs的话,bcast广播也会发到这套lvs里,虽说应用上不会给另外一套lvs带来影响,但日志里会出现很多错误

cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/

vi /etc/ha.d/authkeys,将如下两行的注释去掉

# crc adds no security , except from packet corruption.

# Use only on physically secure networks.

#

auth 1

1 crc

#2 sha1

#3 md5

chomd 600 /etc/ha.d/authkeys

vi /etc/ha.d/haresources文件,加入

contos5-1-1 closelo 192.168.211.135 ldirectord::ldirectord.cf startlo

在/etc/ha.d/resource.d下建立closelo脚本,内容如下

#!/bin/sh

VIP=192.168.211.135

case “$1” in

start)

# close lo:0 interface

echo $“Close lo:0 interface”

/sbin/route del -host $VIP dev lo:0

/sbin/ifconfig lo:0 down

echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore

;;

stop)

# start lo:0 interface

echo $“Start lo:0 interface”

/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up

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

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

;;

*)

echo $“Usage: $0 (start|stop)”

exit 1

;;

esac

/etc/ha.d/resource.d下建立startlo脚本

# ! /bin/sh

VIP=192.168.211.135

case “$1” in

stop)

# close lo:0 interface

echo $“Close lo:0 interface”

/sbin/route del host $VIP dev lo:0

/sbin/ifconfig lo:0 down

echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore

; ;

start)

# start lo:0 interface

echo $“Start lo:0 interface”

/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up

/sbin/route add host $VIP dev lo:0

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

; ;

* )

echo $“Usage: $0 (start|stop)”

exit 1

; ;

esac

到此,lvs部分就全部完成了,接下来说squid的设置,具体配置我就不写了,网上这方面的文章很多,我仅仅完成一个可以做正向代理的出来

squid我使用的是3.0stable8
./configure –prefix=/usr/local/squid
make && make install
完成安装后,配置文件内容如下

visible_hostname 2

acl manager proto cache_object

acl localhost src 127.0.0.1/32

acl to_localhost dst 127.0.0.0/8

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network

acl localnet src 172.16.0.0/12 # RFC1918 possible internal network

acl localnet src 192.168.0.0/16 # RFC1918 possible internal network

acl SSL_ports port 443

acl Safe_ports port 80 # http

acl Safe_ports port 21 # ftp

acl Safe_ports port 443 # https

acl Safe_ports port 70 # gopher

acl Safe_ports port 210 # wais

acl Safe_ports port 1025-65535 # unregistered ports

acl Safe_ports port 280 # http-mgmt

acl Safe_ports port 488 # gss-http

acl Safe_ports port 591 # filemaker

acl Safe_ports port 777 # multiling http

acl CONNECT method CONNECT

acl purge method PURGE

http_access allow manager localhost

http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow purge localhost

http_access allow localnet

http_access deny all

icp_access allow localnet

icp_access deny all

htcp_access allow localnet

htcp_access deny all

#always_direct allow all

#http_port 80 accel vhost vport

http_port 3128

hierarchy_stoplist cgi-bin ?

access_log /usr/local/squid/var/logs/access.log squid

cache_dir ufs /usr/local/squid/cache 10 2 4

refresh_pattern ^ftp: 1440 20% 10080

refresh_pattern ^gopher: 1440 0% 1440

refresh_pattern (cgi-bin|?) 0 0% 0

refresh_pattern . 0 20% 4320

cache_effective_user squid

cache_effective_group squid

然后启动squid,接下来就可以测试了,到此一个可用的而且强健的双机squid就完成了(除非两台机器同时挂掉)

注:每次启动heartbeat前,请先执行 /etc/ha.d/resource.d/closelo脚本,使得lo:o网卡启动,不然这套配置将不起作用了,我目前还没有找到更好的解决办法

如对以上配置有何不明了的还请提出共同讨论

阅读全文
上次实现了最基础的LVS,可这种最基础的LVS不能满足真正的实际应用,为什么呢,因为他的实用性不高,一但后端RS有当机的情况,LB并不会发现,如果后端有3台RS就说明会有1/3的用户会看到出错的页面,所以此次的总结就是为了解决这个问题

实现方式,使用heartbeat中自带的ldirector程序,该程序可以对后端RS进行健康监控,发现有RS服务不可用,则将这台RSserver从列表中删除

环境和上次一样
LVS架构:

             LB-2.187(vip:2.186)
               |      |
              |        |
              |         |
            RS01        RS02
          (2.188)    (2.189)

实现目的:
1,实现roundrobin方式的投递请求
2,进行RS的健康检查

Libnet的安装
可以去这里下载libnet.tar.gz安装包
下载后进行解压
按默认安装即可
./configure
make && make install

hearbeat安装
可以去这里下载heartbeat安装包
安装方法也比较简单
解压后按默认安装即可
我使用的2.1.3

groupadd haclient
useradd -g haclient hacluster

./ConfigureMe configure
make && make install

mkdir -p /etc/ha.d/conf
cd heartbeat-2.1.3/ldirectord
cp ldirectord.cf /etc/ha.d/conf

此站点下载对应linux版本的rpm包进行安装,ldirectord启动需要这些包的支持
perl-TimeDate-1.16-1.2.el4.rf.noarch.rpm
perl-MailTools-2.02-1.el4.rf.noarch.rpm

配置Ldirector
vi /etc/ha.d/conf/ldirectord设置如下内容

# Global Directives
checktimeout=3
checkinterval=1
#fallback=127.0.0.1:80
autoreload=yes
logfile="/var/log/ldirectord.log"
logfile="local0"
#emailalert="admin@x.y.z"
#emailalertfreq=3600
#emailalertstatus=all
quiescent=yes

# Sample for an http virtual service
virtual=192.168.2.186:80
        real=192.168.2.188:80 ipip
        real=192.168.2.189:80 ipip
        service=http
        request="index.html"
        scheduler=rr
        #persistent=600
        #netmask=255.255.255.255
        protocol=tcp
        checktype=negotiate
        checkport=80
        request="index.html"

然后执行/usr/sbin/ldirectord start启动ldirectord服务,可以执行/usr/sbin/ldirectord status查看ldirectord运行状态

/usr/sbin/ldirectord status ldirectord for /etc/ha.d/conf/ldirectord.cf is running with pid: 1522

接下来进行测试,使用软件仍然是webserver stress tool,模拟500了连接
1,正常测试,两台RS服务器正常

ipvsadm
IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.186:http rr
  -> 192.168.2.188:http Tunnel 1 0 250
  -> 192.168.2.189:http Tunnel 1 1 250

ipvsadm显示每个RS投递请求各250
来看下websever显示结果:

URL No. Name Clicks Errors Errors [%] Time Spent [ms] Avg. Click Time [ms]
1
251 0 0.00 2,677 11

没有error

2,将任意一台RS80服务关掉

ipvsadm
IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.186:http rr
  -> 192.168.2.188:http Tunnel 0 0 0
  -> 192.168.2.189:http Tunnel 1 0 500

ipvsadm显示结果,已经将所有的请求投递到2.189这个台服务正常的RS上了
来看下Webserver显示结果:

URL No. Name Clicks Errors Errors [%] Time Spent [ms] Avg. Click Time [ms]
1
250 0 0.00 2,658 11

同样没有出现error

到此,一个能用于健康检查的lvs就配置完毕了
关于ldirectord的用法可以到这个网页查看,这是ldirectord的manpage页

 

阅读全文

最近对LVS技术相当痴迷,相应的技术这里我就不在赘述了,有兴趣的朋友可以去LVS的官网上去看,哪里写的很详细,这里我仅把我的配置心得写出来,有不正确的地方还望各位看客指出

首先说下我的配置环境
大环境:vmware6.0,centOS4.4

LVS架构:

             LB-2.187(vip:2.186)
               |      |
              |        |
             |          |
            RS01       RS02
          (2.188)   (2.189)

实现目的:
    1,简单实现负载均衡
    2,不对后端服务器进行健康检查

IPVS安装
可以到这里下载最新的ipvsadm软件,下载后执行以下操作

ln -s /usr/src/kernels/2.6.9-42.EL-i686/ /usr/src/linux
rpmbuild –rebuild ipvsadm-1.24-6.src.rpm
rpm -ivh /usr/src/redhat/RPMS/i386/ipvsadm-1.24-6.i386.rpm

LB上的配置
在/usr/local/bin下建立startlvs.sh脚本,加入如下内容

echo 1 >/proc/sys/net/ipv4/ip_forward
ifconfig eth0:0 192.168.2.186 netmask 255.255.255.255 broadcast 192.168.2.186 up

/sbin/route add -host 192.168.2.186 dev eth0:0

ipvsadm -A -t 192.168.2.186:80 -s rr
ipvsadm -a -t 192.168.2.186:80 -r 192.168.2.188 -i
ipvsadm -a -t 192.168.2.186:80 -r 192.168.2.189 -i

然后将脚本加入到/etc/rc.local中以便开机自动运行

Realserver上的配置
在/usr/local/bin下建立starttunl.sh,加入如下内容:

modprobe ipip

ifconfig tunl0 192.168.2.186 netmask 255.255.255.255 broadcast 192.168.2.186 up

/sbin/route add -host 192.168.2.186 dev tunl0

echo "2">/proc/sys/net/ipv4/conf/all/arp_announce

echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2">/proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1">/proc/sys/net/ipv4/conf/tunl0/arp_ignore

如此,已经简单的lvs就配置完成了,我使用webserver stress tool进行的模拟用户访问,realsever上启动lighttp,在LB上执行ipvsadm -l,显示如下:

[root@LVS-LB01 bin]# ipvsadm -l

IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.186:http rr
  -> 192.168.2.189:http Tunnel 1 0 250
  -> 192.168.2.188:http Tunnel 1 0 251

webserver stress tool返回的结果如下

URL No. Name Clicks Errors Errors [%] Time Spent [ms] Avg. Click Time [ms]
1
250 0 0.00 3,695 15

如果此时我将后端的RS服务停一台会看到如下显示结果:

IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.186:http rr
  -> 192.168.2.189:http Tunnel 1 0 250
  -> 192.168.2.188:http Tunnel 1 0 250

ipvsadm依然会把请求投递到后端RS
来看下webserver stress tool的结果

URL No. Name Clicks Errors Errors [%] Time Spent [ms] Avg. Click Time [ms]
1
492 242 49.19 1,865 7

很明显已经能看到有一半的errors了

几点说明:
1,此lvs并支持健康检查,一但后端有一台服务停了,LB并不会知道,依旧会把服务投递到后端
2,我是用的VS/TUN的方式实现的LVS
3,策略我使用的rr方式,如需要其他策略,请自行更改

阅读全文