视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
负载均衡lvs+高可用keepalive完整部署
2025-09-30 08:56:58 责编:小OO
文档


原理就这样了,现在开始部署

1,改机器名

[root@data-1-2 ~]# hostname

data-1-2

[root@data-1-2 ~]#

[root@data-1-1 ~]# hostname

data-1-1

[root@data-1-1 ~]#

[root@director ~]# hostname

director

[root@director ~]#

2,两个RS节点都安装http服务

[root@data-1-1 ~]# yum -y install httpd

3,启动http

4,改一下主页面

查看站点目录

[root@data-1-2 ~]# cat /etc/httpd/conf/httpd.conf | grep DocumentRoot

# DocumentRoot: The directory out of which you will serve your

DocumentRoot "/var/www/html"

# This should be changed to whatever you set DocumentRoot to.

#    DocumentRoot /www/docs/dummy-host.example.com

[root@data-1-2 ~]# echo 133 > /var/www/html/index.html

[root@data-1-1 ~]# echo 128 > /var/www/html/index.html

5,安装lvs

[root@data-1-2 ~]#  mkdir -p /home/oldboy/tools

[root@data-1-1 ~]# mkdir -p /home/oldboy/tools

[root@director ~]# mkdir -p /home/oldboy/tools

以后安装全部在director端

[root@director ~]# mkdir -p /home/oldboy/tools

[root@director ~]# cd  /home/oldboy/tools

下载软件包

[root@director tools]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz

--2016-04-14 02:23:51--  http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz

Resolving www.linuxvirtualserver.org... 69.56.251.119, 2001:470:1f0f:297::2

Connecting to www.linuxvirtualserver.org|69.56.251.119|:80... connected.

HTTP request sent, awaiting response... 200 OK

Length: 36598 (36K) [application/x-gzip]

Saving to: “ipvsadm-1.24.tar.gz”

100%[======================================>] 36,598 56.5K/s in 0.6s

2016-04-14 02:23:54 (56.5 KB/s) - “ipvsadm-1.24.tar.gz” saved [36598/36598]

查看内核模块

[root@director tools]#

[root@director tools]# lsmod | grep ip_vs

[root@director tools]# cat /etc/redhat-release

CentOS release 6.5 (Final)

[root@director tools]# uname -r

2.6.32-431.el6.i686

[root@director tools]#

[root@director tools]# ls -ld /usr/src/kernels/2.6.32-431.el6.i686/

drwxr-xr-x. 22 root root 4096 Apr 14  2016 /usr/src/kernels/2.6.32-431.el6.i686/

安装lvs需要对kernel目录作个软连接

[root@director tools]# ln -s /usr/src/kernels/2.6.32-431.el6.i686 /usr/src/linux

[root@director tools]# ls -l /usr/src/

total 8

drwxr-xr-x. 2 root root 4096 Sep 23  2011 debug

drwxr-xr-x. 3 root root 4096 Apr 14  2016 kernels

lrwxrwxrwx. 1 root root 36 Apr 14 02:34 linux -> /usr/src/kernels/2.6.32- 431.el6.i686

[root@director

解压软件包

[root@director tools]#  tar -zxvf ipvsadm-1.24.tar.gz

[root@director tools]# ls

ipvsadm-1.24  ipvsadm-1.24.tar.gz

开始编译

[root@director tools]# cd ipvsadm-1.24

[root@director ipvsadm-1.24]# ls

config_stream.c  dynamic_array.h    ipvsadm-save     libipvs     VERSION

config_stream.h  ipvsadm.8          ipvsadm-save.8   Makefile

contrib          ipvsadm.c          ipvsadm.sh       README

debian           ipvsadm-restore    ipvsadm.spec     SCHEDULERS

dynamic_array.c  ipvsadm-restore.8  ipvsadm.spec.in  TAGS

发现有makefiel直接make

Make

[root@director ipvsadm-1.24]# make install

此时检查一下内核模块

[root@director ipvsadm-1.24]# lsmod | grep ip_vs

[root@director ipvsadm-1.24]#

没有

执行ipvsadm

[root@director ipvsadm-1.24]# ipvsadm

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

[root@director ipvsadm-1.24]#

也可以modprobe  ip_vs加载到内核模块

再次检查内核模块

[root@director ipvsadm-1.24]# lsmod | grep ip_vs

ip_vs                 102058  0

libcrc32c                841  1 ip_vs

ipv6                  2610  18 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6

[root@director ipvsadm-1.24]#

配置lvs负载均衡服务

[root@localhost ~]# echo 'modprobe ip_vs' >> /etc/rc.d/rc.local

[root@localhost ~]# cat  /etc/rc.d/rc.local

配置ip地址

[root@director ipvsadm-1.24]# ifconfig eth0:1 192.168.48.138 netmask 255.255.255.0 up

[root@localhost ~]# echo 'ifconfig eth0:1 192.168.48.138 netmask 255.255.255.0 up' >> /etc/rc.d/rc.local

下面是配好的IP

[root@localhost ~]# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0C:29:37:B7:13

          inet addr:192.168.48.137  Bcast:192.168.48.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe37:b713/ Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:619 errors:0 dropped:0 overruns:0 frame:0

          TX packets:507 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:105788 (103.3 KiB)  TX bytes:60062 (58.6 KiB)

          Interrupt:19 Base address:0x2024

eth0:1    Link encap:Ethernet  HWaddr 00:0C:29:37:B7:13

          inet addr:192.168.48.138  Bcast:192.168.48.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:19 Base address:0x2024

eth1      Link encap:Ethernet  HWaddr 00:0C:29:37:B7:1D

          inet addr:10.0.0.130  Bcast:10.0.0.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe37:b71d/ Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:40 errors:0 dropped:0 overruns:0 frame:0

          TX packets:11 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:5232 (5.1 KiB)  TX bytes:1368 (1.3 KiB)

          Interrupt:19 Base address:0x20a4

lo        Link encap:Local Loopback

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:136  Metric:1

          RX packets:16 errors:0 dropped:0 overruns:0 frame:0

          TX packets:16 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:960 (960.0 b)  TX bytes:960 (960.0 b)

检查一下能不能ping通vip

[root@data-1-1 network-scripts]# ping 192.168.48.138

PING 192.168.48.138 (192.168.48.138) 56(84) bytes of data.

 bytes from 192.168.48.138: icmp_seq=1 ttl= time=1.42 ms

 bytes from 192.168.48.138: icmp_seq=2 ttl= time=0.447 ms

 bytes from 192.168.48.138: icmp_seq=3 ttl= time=0.661 ms

^C

--- 192.168.48.138 ping statistics ---

手工执行添加lvs服务

[root@localhost ~]# ipvsadm --set 30 5 60

[root@localhost ~]# ipvsadm -A -t 192.168.48.138:80 -s wrr -p 20

[root@localhost ~]# ipvsadm -a -t 192.168.48.138:80 -r 192.168.48.128:80 -g -w 1

[root@localhost ~]# 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.48.138:80 wrr persistent 20

-> 192.168.48.128:80 Route 1 0 0

[root@localhost ~]# ipvsadm -a -t 192.168.48.138:80 -r 192.168.48.133:80 -g -w 1

[root@localhost ~]#

[root@localhost ~]# 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.48.138:80 wrr persistent 20

-> 192.168.48.133:80 Route 1 0 0

-> 192.168.48.128:80 Route 1 0 0

[root@localhost ~]#

注意以下操作在real server上面执行

绑定rs  vip

[root@data-1-1 CentOS_6.5_Final]# ifconfig lo:0 192.168.48.138 netmask 255.255.255.255up 

[root@data-1-1 network-scripts]# route add -host 192.168.48.138 dev lo

[root@data-1-2 CentOS_6.5_Final]# ifconfig lo:0 192.168.48.138 netmask 255.255.255.255 up

[root@data-1-2 CentOS_6.5_Final]# route add -host 192.168.48.138 dev lo

现在手工抑制arp

[root@data-1-1 network-scripts]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

You have new mail in /var/spool/mail/root

[root@data-1-1 network-scripts]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

[root@data-1-1 network-scripts]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@data-1-1 network-scripts]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[root@data-1-2 CentOS_6.5_Final]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

[root@data-1-2 CentOS_6.5_Final]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

[root@data-1-2 CentOS_6.5_Final]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@data-1-2 CentOS_6.5_Final]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[root@data-1-2 CentOS_6.5_Final]#

现在访问一下试试

无法访问

[root@localhost ~]# service iptables stop

iptables: Setting chains to policy ACCEPT: filter          [  OK  ]

iptables: Flushing firewall rules:                         [  OK  ]

iptables: Unloading modules:                               [  OK  ]

[root@localhost ~]#

[root@localhost ~]# chkconfig iptables off

再次验证

[root@localhost ~]# ipvsadm -L --stats

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes                                                                                                   OutBytes

-> RemoteAddress:Port

TCP  192.168.48.138:http                52      284        0    25611                                                                                                          0

-> 192.168.48.133:http 4 20 0 1323 0

-> 192.168.48.128:http 48 2 0 24288 0

下面是脚本配置lvs

Squid端

[root@localhost oldboy]# mv ipvs_server /usr/local/sbin/

[root@localhost oldboy]# cd /usr/local/sbin/

[root@localhost sbin]# chmod 700 ipvs_server

[root@localhost sbin]# cat ipvs_server

#!/bin/bash

. /etc/init.d/functions

VIP=192.168.48.138

GW=192.168.1.1

SUBNET=eth0:0

PORT=80

RIP1=(

  192.168.48.128

     )

RIP2=(

  192.168.48.133

     )

IFCONFIG=/sbin/ifconfig

ROUTE=/sbin/route

IPVSADM=/sbin/ipvsadm

ARPING=/sbin/arping

usage () {

local script_name

script_name=$1

echo 'Usage : $script_name [ start | stop | restart  ]'

echo ""

return 1

}

checkCmd () {

if [ ! -f $1 ]; then

  echo "cant find" $1

  return 1

fi

}

checkSubnet () {

$IFCONFIG | grep "$1" |wc -l

}

ipvsStart () {

if

[ `checkSubnet $SUBNET` -ne 0 ]; then

$IFCONFIG $SUBNET down

fi

local rs

$IFCONFIG  $SUBNET $VIP broadcast $VIP netmask 255.255.255.0 up

$IPVSADM -C

$IPVSADM -A -t  $VIP:$PORT -s wrr -p 60

for ((i=0;i<`echo ${#RIP1[*]}`;i++))

do

  $IPVSADM -a -t  $VIP:$PORT -r ${RIP1[$i]}:$PORT -g -w 1

done

for ((i=0;i<`echo ${#RIP2[*]}`;i++))

do

  $IPVSADM -a -t  $VIP:$PORT -r ${RIP2[$i]}:$PORT -g -w 1

done

rs=$?

$IPVSADM >/tmp/oldboy.log

NetIf=`echo ${SUBNET}| awk -F ":" '{print $1}'`

$ARPING -c 1 -I ${NetIf} -s $VIP $GW >> /tmp/oldboy.log

[ $rs -eq 0 ] && action "Ipvsadm start." /bin/true

 return $rs

}

ipvsStop () {

local rs

rs=1

$IFCONFIG  $SUBNET down

$IPVSADM -C

$IPVSADM -Z

rs=$?

$ARPING -c 1 -I ${NetIf} -s $VIP $GW >/dev/null 2>&1

[ $rs -eq 0 ] && action "Ipvsadm stop." /bin/true

 return $rs

}

main ()

{

if [ $# -ne 1 ];then

usage $0

fi

case "$1" in

start )

ipvsStart

;;

stop)

ipvsStop

;;

restart)

ipvsStop

ipvsStart

;;

*)

usage $0

;;

esac

}

main $*

Realserver端

两个realserver都一样

[root@data-1-1 ~]# cd /usr/local/sbin/

[root@data-1-1 sbin]# pwd

/usr/local/sbin

[root@data-1-1 sbin]# ls

rs_server

[root@data-1-1 sbin]# ll

total 4

-rwx------. 1 root root 1059 Apr 15 02:49 rs_server

[root@data-1-1 sbin]# chmod 700 rs_server

[root@data-1-1 sbin]# cat rs_server

#!/bin/bash

VIP=(

   192.168.48.138

)

. /etc/rc.d/init.d/functions

case $1 in

start)

for ((i=0;i<`echo ${#VIP[*]}`;i++))

   do

   interface="lo:`echo  ${VIP[$i]}| awk -F . '{print $4}'`"

   /sbin/ifconfig $interface  ${VIP[$i]} broadcast  ${VIP[$i]} netmask 255.255.2                                                                                        55.255 up

   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

   action "start lvs of realserver" /bin/true

;;

stop)

for ((i=0;i<`echo ${#VIP[*]}`;i++))

   do

   interface="lo:`echo  ${VIP[$i]}| awk -F . '{print $4}'`"

   /sbin/ifconfig $interface  ${VIP[$i]} broadcast  ${VIP[$i]} netmask 255.255.2                                                                                        55.255 down

   done

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

   action "stop lvs of realserver" /bin/true

;;

*)

   echo "usage: $0 {start|stop}"

   exit 1

esac

[root@data-1-1 sbin]#

[root@data-1-1 ~]# rs_server stop

stop lvs of realserver                                     [  OK  ]

[root@data-1-1 ~]# rs_server start

start lvs of realserver                                    [  OK  ]

[root@data-1-1 ~]#

[root@data-1-1 ~]# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0C:29:5F:1C:77

          inet addr:192.168.48.128  Bcast:192.168.48.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe5f:1c77/ Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:448144 errors:0 dropped:0 overruns:0 frame:0

          TX packets:901345 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:103293994 (98.5 MiB)  TX bytes:1212121651 (1.1 GiB)

          Interrupt:19 Base address:0x2000

eth1      Link encap:Ethernet  HWaddr 00:0C:29:5F:1C:81

          inet addr:10.0.0.128  Bcast:10.0.0.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe5f:1c81/ Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:91636 errors:0 dropped:0 overruns:0 frame:0

          TX packets:42 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:22347817 (21.3 MiB)  TX bytes:3431 (3.3 KiB)

          Interrupt:19 Base address:0x2080

lo        Link encap:Local Loopback

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:374 errors:0 dropped:0 overruns:0 frame:0

          TX packets:374 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:102744 (100.3 KiB)  TX bytes:102744 (100.3 KiB)

lo:138    Link encap:Local Loopback

          inet addr:192.168.48.138  Mask:255.255.255.255

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

[root@data-1-1 ~]#

测试

现在写一个脚本进行健康检查做到如下,每10秒钟扫描一次realserver,当发现realserver宕机就自动从director删除,等恢复好再自动加回来

脚本如下可以放在后台执行

[root@localhost sbin]# cat health_check

#!/bin/bash

VIP="192.168.48.138"

port=80

RIP=(

  192.168.48.128

  192.168.48.133

     )

while true

do

for ((i=0;i<`echo ${#RIP[*]}`;i++))

 do

  PORT_COUNT=`nmap ${RIP[$i]} -p $port|grep open |wc -l`

  [ $PORT_COUNT -ne 1 ] && {

  ipvsadm -d -t  $VIP:$port -r ${RIP[$i]}:$port

echo "${RIP[$i]}" >> /tmp/rs.log

  }

 done

for j in `cat /tmp/rs.log`

 do

  PORT_COUNT=`nmap $j -p $port|grep open |wc -l`

  [ $PORT_COUNT -eq 1 ] && {

  ipvsadm -a -t $VIP:$port -r $j:$port -g -w 1

  sed -i s#$j#""#g /tmp/rs.log

  }

 done

sleep 10

done

下面是网上下载的配置脚本

http://bbs.chinaunix.net/tree/index_294_1/

作者:NetSeek

http://www.linuxtone.org(IT

运维专家网|集群架构|性能调优)

欢迎转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明.

更新时间:2008-10-27

背景:

        随着你的网站业务量的增长你网站的服务器压力越来越大?需要

负载均衡

方案!商业的硬件如F5又太贵,你们又是创业型互联公司如何有效节约成本,节省不必要的浪费?同时

实现

商业硬件一样的高性能高可用的功能?有什么好的负载均衡可伸张可扩展的方案吗?答案是肯定的!有!我们利用LVS+Keepalived基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器。

LVS+Keepalived 介绍

LVS

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);

八种调度

算法

(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。

Keepalvied

               

Keepalived

在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现

二. 网站负载均衡拓朴图

IP信息列表:

名称        IP

LVS-DR-Master        61.1.122.6       

LVS-DR-BACKUP        61.1.122.7       

LVS-DR-VIP        61.1.122.8       

WEB1-Realserver        61.1.122.9       

WEB2-Realserver        61.1.122.10       

GateWay        61.1.122.1       

三. 安装LVS和Keepalvied软件包

   1. 

下载

相关软件包

     #mkdir /usr/local/src/lvs

     #cd /usr/local/src/lvs

     #wget

http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz

     #wget

http://www.keepalived.org/software/keepalived-1.1.15.tar.gz

2. 安装LVS和Keepalived

#lsmod |grep ip_vs

        #uname -r

        2.6.18-53.el5PAE

        #ln -s /usr/src/kernels/2.6.18-53.el5PAE-i686/  /usr/src/linux

        #tar zxvf ipvsadm-1.24.tar.gz

        #cd ipvsadm-1.24

        #make && make install

        #find / -name ipvsadm  # 查看ipvsadm的位置

        #tar zxvf keepalived-1.1.15.tar.gz

        #cd keepalived-1.1.15

        #./configure  && make && make install

        #find / -name keepalived  # 查看keepalived位置               

   

        #cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

        #cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

        #mkdir /etc/keepalived

        #cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

        #cp /usr/local/sbin/keepalived /usr/sbin/

        #service keepalived start|stop     #做成系统启动服务方便管理.

四. 配置LVS实现负载均衡

  1. LVS-DR,配置LVS脚本实现负载均衡

      #vi /usr/local/sbin/lvs-dr.sh

      #!/bin/bash

        # description: start LVS of DirectorServer

        #Written by :NetSeek http://www.linuxtone.org

       

        GW=61.1.122.1

        # website director vip.

        SNS_VIP=61.1.122.8

        SNS_RIP1=61.1.122.9

        SNS_RIP2=61.1.122.10

     ./etc/rc.d/init.d/functions

        logger $0 called with $1

        case "$1" in

        start)

           # set 

squid

vip

           /sbin/ipvsadm --set 30 5 60

                   /sbin/ifconfig eth0:0 $SNS_VIP broadcast $SNS_VIP netmask 255.255.255.255

        broadcast $SNS_VIP up

           /sbin/route add -host $SNS_VIP dev eth0:0

           /sbin/ipvsadm -A -t $SNS_VIP:80 -s wrr -p 3

           /sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP1:80 -g -w 1

           /sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP2:80 -g -w 1

           touch /var/lock/subsys/ipvsadm >/dev/null 2>&1

       ;;

        stop)

           /sbin/ipvsadm -C

           /sbin/ipvsadm -Z

           ifconfig eth0:0 down

           ifconfig eth0:1 down

           route del $SNS_VIP

           route del $SS_VIP

           rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1

           echo "ipvsadm stoped"

           ;;

        status)

           if [ ! -e /var/lock/subsys/ipvsadm ];then

                echo "ipvsadm stoped"

                exit 1

           else

                echo "ipvsadm OK"

           fi

           ;;

        *)

          echo "Usage: $0 {start|stop|status}"

           exit 1

        esac

        exit 0

     

2.配置Realserver脚本.

        #vi /usr/local/sbin/realserver.sh

        #!/bin/bash

        # description: Config realserver lo and apply noarp

        #Written by :NetSeek http://www.linuxtone.org

       

        SNS_VIP=61.1.122.8

        

        . /etc/rc.d/init.d/functions

        

        case "$1" in

        start)

               ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP

               /sbin/route add -host $SNS_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

               

sysctl-p >/dev/null 2>&1

               echo "RealServer Start OK"

        

               ;;

        stop)

               ifconfig lo:0 down

               route del $SNS_VIP >/dev/null 2>&1

               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 "RealServer Stoped"

               ;;

        *)

               echo "Usage: $0 {start|stop}"

               exit 1

        esac

        

        exit 0

    

或者采用secondary ip address方式配置

          # vi /etc/sysctl.conf

          net.ipv4.conf.lo.arp_ignore = 1

          net.ipv4.conf.lo.arp_announce = 2

          net.ipv4.conf.all.arp_ignore = 1

          net.ipv4.conf.all.arp_announce = 2

          [code]

          #sysctl –p

          #ip addr add 61.1.122.8/32 dev lo

          #ip add list 查看是否绑定

  3. 启动lvs-dr脚本和realserver启本,在DR上可以查看LVS当前状态:

        #watch ipvsadm –ln

五.利用Keepalvied实现负载均衡和和高可用性

  1.配置在主负载均衡服务器上配置keepalived.conf

  #vi /etc/keepalived/keepalived.conf

  ! Configuration File for keepalived

global_defs {

   notification_email {

      cnseek@gmail.com

  #   failover@firewall.loc

  #   sysadmin@firewall.loc

   }

   notification_email_from sns-lvs@gmail.com

   smtp_server 127.0.0.1

  # smtp_connect_timeout 30

   router_id LVS_DEVEL

}

# 20081013 written by :netseek

# VIP1

vrrp_instance VI_1 {

    state MASTER             #备份服务器上将MASTER改为BACKUP  

    interface eth0

    virtual_router_id 51

    priority 100    # 

备份

服务上将100改为99

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        61.1.122.8  

        #(如果有多个VIP,继续换行填写.)

    }

}

virtual_server 61.1.122.8 80 {

    delay_loop 6                  #(每隔10秒查询realserver状态)

    lb_algo wrr                  #(lvs 算法)

    lb_kind DR                  #(Direct Route)

    persistence_timeout 60        #(同一IP的连接60秒内被分配到同一台realserver)

    protocol TCP                #(用TCP协议检查realserver状态)

    real_server 61.1.122.9 80 {

        weight 3               #(权重)

        TCP_CHECK {

        connect_timeout 10       #(10秒无响应超时)

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

    }

    real_server 61.1.122.10 80 {

        weight 3

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

     }

}

      

2. BACKUP服务器同上配置,先安装lvs再按装keepalived,仍后配置/etc/keepalived/keepalived.conf,只需将红色标示的部分改一下即可.

3. vi /etc/rc.local

   #/usr/local/sbin/lvs-dr.sh  将lvs-dr.sh这个

脚本

注释掉。步

   #/usr/local/sbin/lvs-dr.sh stop 停止lvs-dr脚本

   #/etc/init.d/keepalived start  启动keepalived 服务,keepalived就能利用keepalived.conf 配

   置

文件

,实现负载均衡和高可用.

4. 查看lvs服务是否正常

  #watch ipvsadm –ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  61.1.122.8:80 wrr persistent 60

  -> 61.1.122.10:80            Route   3      0          0

  -> 61.1.122.9:80             Route   3      0          0

#tail –f /var/log/message  监听日志,查看状态,测试LVS负载均衡及高可用性是否有效。

5.停Master服务器的keepalived服务,查看BAKCUP服务器是否能正常接管服务。

四.相关参考

  1.LVS 基础知识汇总

LVS的算法介绍              

http://www.linuxtone.org/viewthread.php?tid=69

学习LVS的三种转发模式      

http://www.linuxtone.org/viewthread.php?tid=77

LVS中的IP负载均衡技术      

http://www.linuxtone.org/viewthread.php?tid=68

更多的请到

http://www.linuxtone.org

负载均衡版查看

Keepalived 相关参考资料。

http://www.keepalived.org/documentation.html

Lvs到此结束

下面是keepalive

下面是keepalived的正常工作和failover工作原理图

下面开始安装keepalived

准备两台主机

下载安装包以下操作两台机器同时操作

[root@localhost tools]# wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz

[root@localhost tools]# ln -s /usr/src/kernels/2.6.32-431.el6.i686/ /usr/src/linux

[root@localhost tools]# ls -l /usr/src/

total 8

drwxr-xr-x. 2 root root 4096 Sep 23  2011 debug

drwxr-xr-x. 3 root root 4096 Apr 14 09:48 kernels

lrwxrwxrwx. 1 root root 36 Apr 14 02:34 linux -> /usr/src/kernels/2.6.32-431.el6.i686

[root@localhost tools]#

解压

[root@director2 tools]# tar -zxvf keepalived-1.1.17.tar.gz

编译

[root@director2 tools]# cd keepalived-1.1.17

[root@localhost keepalived-1.1.17]# ./configure

configure: error:

  !!! OpenSSL is not properly installed on your system. !!!

  !!! Can not include OpenSSL headers files.            !!!

报错了

 yum install -y openssl openssl-devel

其它经验

其实系统安装了openssl,ssl.h文件也没问题,问题在于redhat AS3 把Kerberos includes 放在一个“奇怪”的地方,以致于keepalived的configure程序找不到,只好报openssl安装有问题。解决方法是设置编译环境的CPPFLAGS变量:export CPPFLAGS=-I/usr/kerberos/include ,再次编译就通过了。

再重新编译

[root@localhost keepalived-1.1.17]# ./configure

configure: error: Popt libraries is required

又报错

yum install popt-devel

再重新编译

[root@localhost keepalived-1.1.17]# ./configure

Keepalived configuration

------------------------

Keepalived version       : 1.1.17

Compiler                 : gcc

Compiler flags           : -g -O2

Extra Lib                : -lpopt -lssl -lcrypto

Use IPVS Framework       : Yes

IPVS sync daemon support : Yes

Use VRRP Framework       : Yes

Use LinkWatch            : No

Use Debug flags          : No

三个yes就正确了1使用ipvs框架  2,支持ipvs的sync功能,3使用vrrp框架

[root@localhost keepalived-1.1.17]# make

[root@director2 keepalived-1.1.17]# make install

如果前面不做软连接可以用下面方法安装

[root@director2 keepalived-1.1.17]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d

[root@director2 keepalived-1.1.17]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

[root@director2 keepalived-1.1.17]# mkdir /etc/keepalived

[root@director2 keepalived-1.1.17]# cp /usr/local/etc/keepalived/keepalived.conf  /etc/keepalived/

[root@director2 keepalived-1.1.17]# cp /usr/local/sbin/keepalived /usr/sbin/

[root@director2 keepalived-1.1.17]# service keepalived start

Starting keepalived:                                       [  OK  ]

[root@director2 keepalived-1.1.17]#

[root@localhost keepalived-1.1.17]# ps -ef | grep keepalived

root      5776     1  0 20:29 ?        00:00:00 keepalived -D

root      5778  5776  0 20:29 ?        00:00:00 keepalived -D

root      5779  5776  0 20:29 ?        00:00:00 keepalived -D

root      57  1260  0 20:30 pts/1    00:00:00 grep keepalive

配置文件说明

这里又是一个实例

下面标红的三行就是主备keepalived的配置文件区别

双实例互相间接管

单实例差异

现在编辑keepalived.conf

[root@localhost keepalived-1.1.17]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

router_id LVS_1

}

vrrp_instance VI_1 {

state MASTER

    interface eth0

virtual_router_id 51

priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

virtual_ipaddress {

        192.168.48.138

    }

}

备节点配置

[root@director2 keepalived]# cat keepalived.conf

! Configuration File for keepalived

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

router_id LVS_2

}

vrrp_instance VI_1 {

state BACKUP

    interface eth0

virtual_router_id 51

priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

virtual_ipaddress {

        192.168.48.138

    }

}

现在启动keepalived

[root@localhost keepalived]# service keepalived stop

Stopping keepalived:                                       [  OK  ]

[root@localhost keepalived]# service keepalived start

Starting keepalived:   

主节点                                    [  OK  ]

[root@director2 keepalived]# ip add |grep 192

    inet 192.168.48.139/24 brd 192.168.48.255 scope global eth0

inet 192.168.48.138/32 scope global eth0

备节点

现在停掉主节点看看备节点能不能接管

[root@localhost keepalived]# service keepalived stop

Stopping keepalived:                                       [  OK  ]

[root@localhost keepalived]# ip add |grep 192

    inet 192.168.48.137/24 brd 192.168.48.255 scope global eth0

[root@localhost keepalived]#

查看备节点

启动主节点

发现不能接管回来怀疑可能是防火墙的原因

[root@director2 keepalived]# service iptables stop

iptables: Setting chains to policy ACCEPT: filter          [  OK  ]

iptables: Flushing firewall rules:                         [  OK  ]

iptables: Unloading modules:                               [  OK  ]

[root@director2 keepalived]# chkconfig iptables off

[root@director2 keepalived]#

两边都有了

检查发现配置文件错误

priority 100

这里一样了

改正后

现在关闭主节点

看备节点

启动主节点

看备节点、

完全正常了

下面是切换过程中对外界ping  vip的反应

可以配置多个vip

多加几行就可以

多实例就复制下面这段

vrrp_instance VI_1 {

state BACKUP

    interface eth0

virtual_router_id 51

priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

virtual_ipaddress {

        192.168.48.138

    }

}

瞎改,第一个实例是备,第二个改成实例主,改一下virtual_router_id

priority 100

virtual_ipaddress {

        192.168.48.138

   }

这样两边就是双主模式

演示通过keepalived实现httpd服务的高可用

两边都安装httpd

yum -y install httpd

[root@director ~]# service httpd start

Starting httpd:                                            [  OK  ]

[root@director ~]# echo 137 > /var/www/html/index.html

[root@director2 ~]# echo 139 > /var/www/html/index.html

现在让主节点宕机

正常接管业务

再启动

接管回来

高可用了

这种方式的高可用必须只能有程序不能有资源,资源放在共享存储

或者两台机器作实时同步

日志为/var/log/message

默认只能实现服务器级别的高可用要实现服务级别的高可用必须写脚本实现

下面是完整的keepalived+lvs的实际应用配置过程总共要4台服务器两台负载均衡器两台realserver

前面几步已经在上午安装完成

下面这步上午没做,需要两个director都执行

[root@director2 ipvsadm-1.24]# sed -i 's#net.ipv4.ip_forward = 0#net.ipv4.ip_forward = 1#' /etc/sysctl.conf

[root@director2 ipvsadm-1.24]# grep net.ipv4.ip_forward /etc/sysctl.conf

net.ipv4.ip_forward = 1

[root@director sbin]#  sysctl -p

net.ipv4.ip_forward = 1

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key

error: "net.bridge.bridge-nf-call-iptables" is an unknown key

error: "net.bridge.bridge-nf-call-arptables" is an unknown key

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 4294967295

kernel.shmall = 268435456

[root@director sbin]#

下面是全局块

其中下面这个是lvs标示要唯一

下面这个是vrrp实例组,在failover时以组为单位,要么同时切换要么同时不切换

下面是重点了

现在配置keepalived让keepalived来管理lvs和realserver

Master端

[root@director keepalived]# cat keepalived.conf 

! Configuration File for keepalived

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_1

}

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    lvs_sync_deamon_inteface eth0

    virtual_router_id 51

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.48.138

    }

}

virtual_server 192.168.48.138 {

delay_loop 6

lb_algo wrr

lb_kind DR

nat_mask 255.255.255.0

persistence_timeout 50

protocol TCP

real_server 192.168.48.128 80 {

        weight 1

        TCP_CHECK {

           connect_timeout 8

           nb_get_retry 3

            delay_before_retry 3

           connect_port 80

     }

}

real_server 192.168.48.133 80 {

        weight 1

        TCP_CHECK {

           connect_timeout 8

           nb_get_retry 3

            delay_before_retry 3

           connect_port 80

      }

   }

}

[root@director keepalived]#

Backup端

[root@director keepalived]# cat keepalived.conf 

! Configuration File for keepalived

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_2

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    lvs_sync_deamon_inteface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.48.138

    }

}

virtual_server 192.168.48.138 {

delay_loop 6

lb_algo wrr

lb_kind DR

nat_mask 255.255.255.0

persistence_timeout 50

protocol TCP

real_server 192.168.48.128 80 {

        weight 1

        TCP_CHECK {

           connect_timeout 8

           nb_get_retry 3

            delay_before_retry 3

           connect_port 80

     }

}

real_server 192.168.48.133 80 {

        weight 1

        TCP_CHECK {

           connect_timeout 8

           nb_get_retry 3

            delay_before_retry 3

           connect_port 80

      }

   }

}

[root@director keepalived]#

现在启动keepalived

master端状态

[root@director keepalived]# service keepalived start

Starting keepalived:                                       [  OK  ]

[root@director keepalived]# ip add | grep 192

    inet 192.168.48.137/24 brd 192.168.48.255 scope global eth0

    inet 192.168.48.138/32 scope global eth0

[root@director keepalived]# 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.48.138:0 wrr persistent 50

-> 192.168.48.133:80 Route 1 0 0

-> 192.168.48.128:80 Route 1 0 0

[root@director keepalived]#

Backup端状态

[root@director2 keepalived]# service keepalived  start

Starting keepalived: 

 [root@director2 keepalived]# ip add | grep 192

    inet 192.168.48.139/24 brd 192.168.48.255 scope global eth0

 [root@director2 keepalived]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

[root@director2 keepalived]#

配置realserver端

两个realserver都一样

[root@data-1-1 ~]# cd /usr/local/sbin/

[root@data-1-1 sbin]# pwd

/usr/local/sbin

[root@data-1-1 sbin]# ls

rs_server

[root@data-1-1 sbin]# ll

total 4

-rwx------. 1 root root 1059 Apr 15 02:49 rs_server

[root@data-1-1 sbin]# chmod 700 rs_server

[root@data-1-1 sbin]# cat rs_server

#!/bin/bash

VIP=(

   192.168.48.138

)

. /etc/rc.d/init.d/functions

case $1 in

start)

for ((i=0;i<`echo ${#VIP[*]}`;i++))

   do

   interface="lo:`echo  ${VIP[$i]}| awk -F . '{print $4}'`"

   /sbin/ifconfig $interface  ${VIP[$i]} broadcast  ${VIP[$i]} netmask 255.255.2                                                                                        55.255 up

   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

   action "start lvs of realserver" /bin/true

;;

stop)

for ((i=0;i<`echo ${#VIP[*]}`;i++))

   do

   interface="lo:`echo  ${VIP[$i]}| awk -F . '{print $4}'`"

   /sbin/ifconfig $interface  ${VIP[$i]} broadcast  ${VIP[$i]} netmask 255.255.2                                                                                        55.255 down

   done

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

   action "stop lvs of realserver" /bin/true

;;

*)

   echo "usage: $0 {start|stop}"

   exit 1

esac

访问一下试试

现在模拟一台realserver宕机

检查负载均衡器状态

发现自动剔除了

现在访问一下页面

能访问,高可用了

看看backup端

Backup端也一样自动剔除了发现backup端也有转发列表

再检查vip

发现backup端没有vip,所以事实上backup端是无法转发的

现在把宕机的realserver启动

检查master端状态

检查backup端状态

两端全部已经接管回来了

访问网页试试

很正常

现在模拟master端宕机

检查backup端状态

很正常接管了

访问一下页面

页面不受影响

现在启动master端看看能不能接管回来

检查master端状态

检查backup端状态

正常接管回来了

到此全部结束

可以在/etc/rc.local里面加入

/usr/local/sbin/rs_server start语句开机自动设置realserver

下面是生产维护要点

下载本文

显示全文
专题