CentOS 6.X高可用集群部署LVS(DR)+Keepalived实现高性能高可用负载均衡服务器和双机热备

背景

随着你的网站业务量的增长你网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如F5又太贵,你们又是创业型互联公司如何有效节约成本,节省不必要的浪费?同时实现商业硬件一样的高性能高可用的功能?有什么好的负载均衡可伸张可扩展的方案吗?答案是肯定的!有!我们利用LVS+Keepalived基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器。

LVS+Keepalived 介绍

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,很好的可伸缩性、可靠性和管理性。

LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。

本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR),这三种负载均衡技术各有优缺点,根据实际情况来选择适合自己的。十种调度算法(rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)。

Keepalived采用VRRP(virtual router redundancy protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现linux服务器的多机热备功能。VRRP是针对路由器的一种备份解决方案—–由多台路由器组成一个热备组。通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的服务器失败,其他服务器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务。Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。

一些大型LVS应用实例

LVS项目从成立到现在为止,受到不少关注,LVS集群系统已被应用于很多重负载的站点。到目前为止,该系统已在美、英、德、澳等国的几十个站点上正式使用。

英国国家JANET Cache Service(wwwcache.ja.net)是为英国150所以上的大学提供Web Cache服务。他们用28个结点的LVS集群代替了原有现50多台相互独立的Cache服务器,用他们的话说现在速度就跟夏天一样,因为夏天是放假期间 没有很多人使用网络。

Linux的门户站点(www.linux.com)用LVS将很多台VA Linux SMP服务器组成高性能的WEB服务,已使用将近一年。

SourceForge(sourceforge.net)是在全球范围内为开发源码项目提供WEB、FTP、Mailing List和CVS等服务,他们也使用LVS将负载调度到十几台机器上。

世界上最大的PC制造商之一采用了两个LVS集群系统,一个在美洲,一个在欧洲,用于网上直销系统。

以RealPlayer提供音频视频服务而闻名的Real公司(www.real.com)使用由20台服务器组成的LVS集群,为其全球用户提供音频视频服务。在2000年3月时,整个集群系统已收到平均每秒20,000个连接的请求流。

NetWalk(www.netwalk.com)用多台服务器构造LVS系统,提供1024个虚拟服务,其中本项目的一个美国镜像站点(www.us.linuxvirtualserver.org)。

RedHat(www.redhat.com)从其6.1发行版起已经包含LVS代码,他们开发了一个LVS集群管理工具叫Piranha,用于控制LVS集群,并提供了一个图形化的配置界面。

VA Linux(www.valinux.com)向客户提供基于LVS的服务器集群系统,并且提供相关的服务和支持。

LVS的工作模式和算法解析

Lvs有3种工作模式

NAT(网络地址映射)模式—通过NAT网络地址转换方式来实现负载均衡。相当于LVS服务器同时是一台NAT网关,它拥有一个合法的公共IP,同时负责将针对此公共IP的请求,按照算法将其转发给局域网内的某台真实服务器,处理完成后,将结果返回给LVS服务器,再由LVS服务器把请求返回给用户。NAT方式可支持任何的操作系统,以及私有网络,并且只需一个Internet IP地址,但是整个系统的性能受到限制。因为执行NAT每次需要重写包,有一定的延迟;另外,大部分应用有80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对负载均衡器形成很大压力,成为了新的瓶颈。

DR模式(直接路由模式)—当参与集群的服务器和作为控制管理的服务器在同一网段时可用此法,LVS控制器接收到请求包时直接送到真实服务器节点,优点是返回给客户端的流量不经过控制主机,速度快开销少。与IP Tunneling类似,负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct Routing与IP Tunneling相比没有IP封装的开销,但由于采用物理层(修改MAC地址)技术,所有服务器都必须在一个物理网段。

IP隧道模式—这种方式是在集群的节点不在同一个网段时可用的转发机制,是将IP包封装在其他网络流量中的方法。为了安全的考虑,应该使用隧道技术中的VPN,也可以使用租用专线。集群所提供的服务是基于TCP/IP的Web服务、Mail服务、News服务、DNS服务、Proxy服务等等。director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接,IP Tunneling技术极大地提高了director的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过100个节点,real server可以在任何LAN或WAN上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器必须拥有正式的IP地址用于与客户机直接通信,并且所有服务器必须支持IP隧道协议。

Lvs的算法解析(10种)

rr(Round Robin)—轮询,将外部请求按照请求的顺序轮流分配到集群中的真实服务器上,它不考虑真实服务器的负载状况,只是简单的轮换

wrr(Weighted Round Robin)—加权轮询,在轮询基础之上,根据权重,将分发更多的请求到权重大的服务器

lc(Least Connections)—最少连接算法,把新的连接分发给连接最少的真实服务器,直到这台服务器的连接数不再是最少为止

wlc(Weighted Least Connections)—根据权重和连接数,综合考虑控制转发行为

lblc(Locality-Based Least Connections)—局部性最少连接算法,这种算法会加上针对源请求IP地址的路由估算,并尝试把请求发送到与源请求IP路由最少(就是距离最近)的服务器上。这种方式通常用于远程的、大范围内的缓存系统

lblcr(Locality-Based Least Connections with Replication)—带复制的局部性最少连接算法。它在lblc的基础上,增加了一个真实服务器列表,先按照lblc的算法计算出距离最近的一组真实服务器,再决定把请求发送到其中的一台服务器

dh(Destination Hashing)—目标地址散列算法把请求的目标IP地址进行散列(hash),并与真实服务器列表进行散列配对,以一种类似于随机的方式分配请求

sh(Source Hashing)—这种算法对应的被称为源地址散列算法,与dh不同的是,此算法是把请求的源IP地址进行散列,然后执行与dh类似的操作

sed(Shortest Expected Delay)—这个要根据sed算出一个最短延迟,这个值X=(C+1)/W,其中C为这台服务器当前连接数,W为这个服务器的权重,请求发给X值最小的一台服务器,overhead=((当前活动状态的连接数+1)*256)/权重

nq(Never Queue)—无需队列,如果有空闲的服务器,将直接把请求分发过去,如果服务器都有连接,将进行sed算法

DR模式原理分析

LVS+Keepalived(DR)模式主要是靠虚拟IP来实现,客户端访问服务器首先会找keeaplived服务器,然后由keepalived服务器调度找到真实机,最后真实机通过自己的虚拟IP直接返回给客户端。那么这里有个疑问了,为什么每一台机器上都有虚拟IP,而客户端访问却单单找keepalived?那是因为keepalived服务器在不停发出例如:我就你要找的IP的信号,所以客户端很容易发现自己需要访问的IP而找到keepalived服务器。这个可以通过日志来发现。那么我们就需要在除了keepalived服务器之外的每台真实机上建立一个虚拟IP。这里又有疑问keepalived服务器为什么不需要建立虚拟IP,那是因为keepalived会自己生成虚拟IP,所以没必要自己去建立。
更详细资料请参考:
LVS-DR工作原理图文详解:http://www.czhphp.com/archives/267

LVS更详细的介绍:(Linux负载均衡软件LVS介绍:http://www.3mu.me/?p=1058)

VS/DR原理图

dr

LVS-DR配置架构根据其VIP与RIP是否在同一个网段内可分为两种模型:
zaQ3qi
更详细资料请参考:
如何编写LVS对Real Server的健康状态检测脚本:http://www.tuicool.com/articles/RFFv6jn

系统环境

实验拓扑

111

测试环境信息

服务器:普通台式机
虚拟化:Xen
虚拟机4台: ipvs01,ipvs02,web01,web02

网络环境:
LVS Master(ipvs01) IP:192.168.1.58
LVS Backup(ipvs02) IP:192.168.1.59
RealServer(web01) IP:192.168.1.6
RealServer(web02) IP:192.168.1.8
虚拟IP(VIP):192.168.1.55
Kernel:2.6.32-358.14.1.el6.x86_64
LVS版本:ipvsadm-1.26
keepalived版本:keepalived-1.2.7

系统版本:
物理机CentOS6.5 64bit
虚拟机CentOS6.6 64bit

安装

软件包6.5系统已经自带ipvs1.26和keepalived1.2.7 测试用yum自行安装。
主LVS服务器ipvs01安装:
检查linux内核是否集成lvs模块:modprobe -l | grep ipvs
开启路由转发功能:echo “1”>/proc/sys/net/ipv4/ip_forward (可不用执行,在下面的启动脚本中已自动执行此操作)
安装ipvsadm和keepalived
[root@ipvs01 ~]# yum list >yum.list
[root@ipvs01 ~]# cat yum.list|grep ipvs
ipvsadm.x86_64 1.26-2.el6 @base
[root@ipvs01 ~]# cat yum.list |grep keepalived
keepalived.x86_64 1.2.7-3.el6 @base
[root@ipvs01 ~]# yum install ipvsadm keepalived
#ipvsadm是一个管理工具,Linux内核已经内置了LVS的核心模块
[root@ipvs01 ~]# chkconfig keepalived on
[root@ipvs01 ~]#ipvsadm
[root@ipvs01 ~]#lsmod |grep ip_vs 查看模块是否加载成功
ip_vs_rr 1420 2
ip_vs 115643 4 ip_vs_rr
libcrc32c 1246 1 ip_vs
ipv6 321454 18 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
查看内核中相关IPVS的模块
[root@ipvs01 ~]# modprobe –list|grep ip_vs
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
kernel/net/netfilter/ipvs/ip_vs_sh.ko
kernel/net/netfilter/ipvs/ip_vs_sed.ko
kernel/net/netfilter/ipvs/ip_vs_nq.ko
kernel/net/netfilter/ipvs/ip_vs_ftp.ko
第一个和最后一个
ip_vs.ko ip_vs_ftp
中间的10个是ipvsadm 10个算法
[root@ipvs01 ~] # rpm -qa | grep keepalived

配置

主LVS服务器配置

[root@ipvs01 ~]#cd /etc/keepalived/
[root@ipvs01 ~]#cp -a keepalived.conf ./keepalived.bak

配置Keepalived

[root@ipvs01 ~]#vi keepalived.conf
输入
:.,$d
删除所有内容,在LVS-MASTER中输入以下内容:

! Configuration File for keepalived
global_defs {
	notification_email {
		test@163.com # 故障通知邮件地址,可以多个地址
	}
	notification_email_from admin@163.com # 故障发送人
	smtp_server smtp.163.com # 由163.com发送邮件
	smtp_connect_timeout 30

	#运行Keepalived服务器的一个标识
	#发邮件时显示在邮件标题中的信息
	router_id LVS_MASTER  #BACKUP上修改为LVS_BACKUP,网上资料说这个值也需要修改,具体不详,之前我们线上的主备就一直是一样的 ^ ^还是修改一下吧!
}

# 监测ipvsadm进程状态,每3秒执行一次
vrrp_script chk_ipvsadm{
    script "/data/conf/shell/keepalived_chk_ipvsadm.sh"
    interval 3
    weight 3
}

vrrp_instance VI_1 {
	# 指定实例的初始状态(角色)。在两台都启动时系统会马上选择priority值高的作为MASTER
	state MASTER   #角色主MASTER,备服务器改为BACKUP
	interface eth0   #HA侦听接口
	virtual_router_id 51   #虚拟路由标记ID,同一组vrrp一致,VRID 标记(0-255)
	priority 100   #优先级自定义,MASTER高于BACKUP即可
	advert_int 1   #HA 侦听间隔:1秒
	authentication {   #认证形式
		auth_type PASS   #认证类型PASS:PASS/AH 2种可选
		auth_pass 1111   #认证密码,同一组vrrp密码一致
	}

	#VIP 这个IP在发生MASTER 到 BACKUP切换时会随之add或del,所以每台服务器上可以不绑定
	#虚拟地址,而都放入virtual_ipaddress块中(可以多个),keepalived会自动使用ip地址进
	#行绑定(不需要依赖ifcfg-eth0),利用ip add show eth0可以看到加入的VIP
	virtual_ipaddress {   #虚拟服务地址,虚拟IP(VTP),可以多个,分多行
		192.168.1.55
	}
}

# 定义virtual_server (HTTP | 80)
virtual_server 192.168.1.55 80 {   #虚拟服务地址和端口
    delay_loop 6   #运行情况检查,单位秒,每隔6秒查询realserver状态
    lb_algo rr   #负载调度算法,RR为轮询
    lb_kind DR   #LVS负载工作模式为DR,三大模式NAT,TUN,DR
    nat_mask 255.255.255.0   #网络掩码
    #persistence_timeout 50   #会话保持时间,50秒内分配同一节点,即同一IP的连接50秒内被分配到同一台realserver,测试时候为了查看均衡效果可以先注释掉
    protocol TCP    #协议类型TCP/UDP,用TCP协议检查realserver状态

	# 定义rs1,每一个rs都需要下面的一个配置段
    real_server 192.168.1.6 80 {   #配置真实服务器节点1(第一个web服务器)的IP和端口
        weight 5            #权值大小,越大权值越高,默认1,0为失效
		# inhibit_on_failure # 在服务器健康检查失败后不从IPVS中删除而将其权值标记为0

		# TCP方式的健康检查
        TCP_CHECK {           #健康检查方式,realserver 状态检测时间,单位秒
            connect_timeout 3           #连接超时时间3秒
            nb_get_retry 3                  #重试次数:3次
            delay_before_retry 3       #重试间隔
            connect_port 80                #健康检查端口连接端口
        }
    }

	real_server 192.168.1.8 80 { # 第二个web服务器
        weight 5
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

/data/conf/shell/keepalived_chk_ipvsadm.sh文件的作用大家从keepalived.conf中可以看得出来,主要的作用就是确认ipvsadm是否处于运行状态,该文件内容如下(注:这个文件可能是旧版本的判断方法,在新版本里无效。这里不能靠进程来判断是不是加载了ip_vs模块,因为这里就是一个命令,没有产生进程。所以此处是多余的,应该删除掉):

#!/bin/bash
#
# author: linmaogan
# description:
# 定时查看ipvsadm是否存在,如果不存在则启动ipvsadm,
# 如果启动失败,则停止keepalived
#

status=$(ps aux|grep ipvsadm | grep -v grep | grep -v bash | wc -l)
if [ "${status}" = "0" ]; then
	service ipvsadm start
	status2=$(ps aux|grep ipvsadm | grep -v grep | grep -v bash |wc -l)
	if [ "${status2}" = "0"  ]; then
		/etc/init.d/keepalived stop
	fi
fi

BACKUP服务器配置

BACKUP服务器同上配置,先安装lvs再安装keepalived,然后配置/etc/keepalived/keepalived.conf,只需将批注部分改一下即可。
主要修改以下3处:

原:router_id LVS_MASTER  #BACKUP上修改为LVS_BACKUP
router_id LVS_BACKUP  #BACKUP上修改为LVS_BACKUP

原:state MASTER #标示状态为MASTER 备份机为BACKUP
state BACKUP  #标示状态改为BACKUP

原:priority 100   #MASTER权重要高于BACKUP 比如BACKUP为99
priority 99   #MASTER权重要高于BACKUP,MASTER为100,那么BACKUP略小于,比如99

其他保持不变。

开启路由转发(可不用执行,在下面的启动脚本中已自动执行此操作)
vi /etc/sysctl.conf
修改下面的值,从0修改到1:
net.ipv4.ip_forward = 1
刷新系统变量,使系统文件变更马上生效
sysctl -p

配置ipvsadm for Master

把以下内容保存成:lvs_server.sh,并放置在/etc/init.d目录下

#!/bin/bash
#Description : LVS Start!
#Write by : linmaogan@gmail.com
#Last Modefiy : 2014/3/7
#把以下内容保存成:lvs_server.sh
#并放置在/etc/init.d目录下
#如果想启动LVS Server执行:/etc/init.d/lvs_server.sh start
#如果想停止LVS Server执行:/etc/init.d/lvs_server.sh stop
#如果想重启LVS Server执行:/etc/init.d/lvs_server.sh restart

VIP=192.168.1.55 #虚拟IP,视具体情况而变

#有几个输入几个,与下面的配置对应,同时必须与KeepAlived.config配置对应
RIP1=192.168.1.6 #实际的服务器IP
RIP2=192.168.1.7 #实际的服务器IP
RIP3=192.168.1.8 #实际的服务器IP

. /etc/rc.d/init.d/functions # 如果提示权限不够,那么先在命令行执行: chmod 777 /etc/rc.d/init.d/functions

case "$1" in
start)
        echo "启动LVS服务器"
          #设置虚拟IP和同步参数
          /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
          echo "1" >/proc/sys/net/ipv4/ip_forward
		  #注:如果要永久性修改,则修改 /etc/sysctl.conf 将其中的net.ipv4.ip_forward设置成1
          #清空 IPVS的内存数据
          /sbin/ipvsadm -C

          #设置LVS
          #开启FTP 21 端口服务,并指向RIP1和RIP2的服务器
          /sbin/ipvsadm -A -t $VIP:21 -s rr
          /sbin/ipvsadm -a -t $VIP:21 -r $RIP1:21 -g
          /sbin/ipvsadm -a -t $VIP:21 -r $RIP2:21 -g
          /sbin/ipvsadm -a -t $VIP:21 -r $RIP3:21 -g

          #开启WEB 80 端口服务,并指向RIP1和RIP2的服务器
          /sbin/ipvsadm -A -t $VIP:80 -s rr
          /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
          /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
          /sbin/ipvsadm -a -t $VIP:80 -r $RIP3:80 -g

          #运行LVS
          /sbin/ipvsadm -ln
          ;;
stop)
       echo "关闭LVS服务器"
       echo "0" >/proc/sys/net/ipv4/ip_forward
       /sbin/ipvsadm -C
       /sbin/ifconfig eth0:0 down
       ;;

restart)
       echo "关闭LVS服务器"
       echo "0" >/proc/sys/net/ipv4/ip_forward
       /sbin/ipvsadm -C
       /sbin/ifconfig eth0:0 down

      echo "启动LVS服务器"
      #设置虚拟IP和同步参数
      /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
      echo "1" >/proc/sys/net/ipv4/ip_forward
      #清空 IPVS的内存数据
      /sbin/ipvsadm -C

      #设置LVS
      #开启FTP 21 端口服务,并指向RIP1和RIP2的服务器
      /sbin/ipvsadm -A -t $VIP:21 -s rr
      /sbin/ipvsadm -a -t $VIP:21 -r $RIP1:21 -g
      /sbin/ipvsadm -a -t $VIP:21 -r $RIP2:21 -g
      /sbin/ipvsadm -a -t $VIP:21 -r $RIP3:21 -g

      #开启WEB 80 端口服务,并指向RIP1和RIP2的服务器
      /sbin/ipvsadm -A -t $VIP:80 -s rr
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP3:80 -g

      #运行LVS
      /sbin/ipvsadm -ln
      ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

/etc/init.d/lvs_server.sh使用方法
[root@RServer2 ~]# chmod 777 /etc/init.d/lvs_server.sh
[root@RServer2 ~]# chmod 777 /etc/rc.d/init.d/functions
[root@RServer2 ~]# /etc/init.d/lvs_server.sh start|stop|restart

服务节点配置

Web01,web02 ,http服务安装略

[root@web01 ~]# yum -y install httpd
[root@web01 ~]# /etc/init.d/httpd start
[root@web01 ~]# cat /var/www/html/index.html</pre>
<h1>WEB01/192.168.1.6</h1>
<pre>[root@web02 ~]# cat /var/www/html/index.html</pre>
<h1>WEB02/192.168.1.8</h1>
<pre>

分别在2台Real Server上面编写脚本并启动

cat /etc/init.d/lvs_realserver.sh
#!/bin/bash
#Description : Config RealServer
#Write by : linmaogan@gmail.com
#Last Modefiy : 2014/3/7
#把以下内容保存成:lvs_realserver.sh
#并放置在/etc/init.d目录下
#如果想启动LVS Server执行:/etc/init.d/lvs_realserver.sh start
#如果想停止LVS Server执行:/etc/init.d/lvs_realserver.sh stop

SNS_VIP=192.168.1.55   #虚拟IP,视具体情况而变

. /etc/rc.d/init.d/functions     # 如果提示权限不够,那么先在命令行执行: chmod 777 /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

这里解释一下arp_ignore和arp_announce:

1> arp_ignore
arp_ignore 是linux中应答arp的策略,基本的值有3个,0,1,2 可以到8,8是拒绝应答也就是关闭。
0 是默认值,就是对于任何请求,不管问的是哪个网口,只要本地所有的ip里有一个是匹配的,这个网口就会回答arp请求。
1 是如果我这个网口有这个ip,那么我就回应你。就是是我的活我就干
2 这个条件就更苛刻一点了,不光是我的活,你还得有资格问我,就是请求arp包的ip地址必须在同一个网段。

这里我们设置成了1,也就是对于real server上,不会回应vip对应的arp请求包,因为我们对外是一个整天啊,只有负载均衡器master有这个权利啊,大家不能抢功劳不是,不然就乱套了。外界只会找到master的 mac地址
2> arp_announce
arp_annouce是linux中发送arp请求包的策略。也就是用哪个ip,哪个mac来请求的问题。基本3个值0,1,2
0 使用本地网卡上任何一个ip地址和mac都可以
1 尽量使用对应网口上的网段的ip地址和设备的mac
2 使用对应网卡上的最好的适合请求arp包的ip地址和设备mac

lvs_announce 设置成2 的原因就是 在客户请求完80端口的数据包发送时需要走出内网,就要找网关,但是此时如果使用vip去发送arp请求,显然网关要糊涂了,一会是master是mac对应vip,一会是real server的mac对应vip,也就是所谓的arp欺骗了。所以为了避免这样的情况,就配置成使用网口的ip地址和mac来发送arp请求包。

赋给执行权限

chmod +x /etc/init.d/lvs_realserver.sh

在web01和web02上分别运行脚本

/etc/init.d/lvs_realserver.sh start
echo "/etc/init.d/lvs_realserver.sh start" >> /etc/rc.local # 开机启动

执行完毕后查看路由有一条虚拟IP的路由指向lo接口

[root@web01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.55 0.0.0.0 255.255.255.255 UH 0 0 0 lo

测试LVS

如果虚拟IP不能访问,可以考虑进行以下网络及防火墙处理:
在Master-LVS-Director和Backup-LVS-Director上分别执行

防火墙处理:
[root@172-1-1-168 ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.1.55 --dport 80 -j REDIRECT
[root@172-1-1-168 ~]# iptables -I INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
[root@172-1-1-168 ~]# iptables -I OUTPUT -p tcp --sport 80 -j ACCEPT
[root@172-1-1-168 ~]# /etc/rc.d/init.d/iptables save
[root@172-1-1-168 ~]# service iptables restart
网络处理:
[root@172-1-1-168 ~]# ifconfig eth0:0 192.168.1.55 netmask 255.255.255.0 broadcast 192.168.1.55
[root@172-1-1-168 ~]# route add -host 192.168.1.55 dev eth0:0
[root@172-1-1-168 ~]# echo "1" >/proc/sys/net/ipv4/ip_forward

为了测试方便,此处关闭iptables,因为CentOS 6.x X64默认是开启IPTABLES的,这样我们不方便测试这个实验,所以暂时采用关闭IPTABLES的办法,以后需要时再测试如何使用IPTABLES的规则。
配置iptables关闭自启动
chkconfig --level 0123456 iptables off
查看自启动状态
chkconfig --list iptables
将四台机器的IPTABLES全部关闭,防止出现其它问题。
(注意:如果防火墙不通,会造成主备服务器都抢占虚拟IP,即主备服务器里都显示有虚拟IP)
光是这样还是不行的,因为不重启不能停止掉iptables,所以在四台上执行如下命令:
service iptables stop
setenforce 0 #临时关闭selinux

将ipvs01,ipvs02 ,keepalived服务启动
# /etc/init.d/httpd start
# service keepalived start
将web01,web02, http服务启动

在主LVS服务器上查看lvs状态如下 说明配置生效

[root@ipvs01 ~]# ipvsadm -ln //查看lvs的情况,用了什么算法,有几台真实服务器在线等等

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.1.55:80 rr persistent 50

-> 192.168.1.6:80 Route 5 0 0

-> 192.168.1.8:80 Route 5 0 0

从ip a 命令来看 虚拟IP现在是在ipvs01上的,而从服务器上ip a没有虚拟IP

[root@ipvs01 ~]# ip a # 显示VTP绑定在哪个服务器上

1: lo: mtu 16436 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 52:54:00:06:88:f4 brd ff:ff:ff:ff:ff:ff

inet 192.168.1.58/24 brd 192.168.40.255 scope global eth0

inet 192.168.1.55/32 scope global eth0

inet6 fe80::5054:ff:fe06:88f4/64 scope link

valid_lft forever preferred_lft forever

负载均衡测试

打开浏览器测试:

6

刷新一下

8

高可用性测试

将ipvs01 keepalived服务器停掉,然后查看ipvs02 ip a状态

[root@ipvs01 ~]# /etc/init.d/keepalived stop

Stopping keepalived: [ OK ]

[root@SN349_ipvs02 ~]# ip a

1: lo: mtu 16436 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 52:54:00:45:f8:78 brd ff:ff:ff:ff:ff:ff

inet 192.168.1.59/24 brd 192.168.40.255 scope global eth0

inet 192.168.1.55/32 scope global eth0

inet6 fe80::5054:ff:fe45:f878/64 scope link

valid_lft forever preferred_lft forever

此时ipvs02绑定了虚拟IP 顶替了ipvs01的服务。

或者观察CentOS-LVS_BACKUP上的日志,信息如下

tail -f /var/log/messages

1

从日志中可知,主机出现故障后,备机立刻检测到,此时备机变为MASTER角色,并且接管了主机的虚拟IP资源,最后将虚拟IP绑定在etho设备上。

将CentOS-LVS_MASTER 上的keepalived服务开启后,CentOS-LVS_BACKUP的日志状态。

2

从日志可知,备机在检测到主机重新恢复正常后,释放了虚拟IP资源重新成为BACKUP角色

故障切换测试

故障切换是测试当某个节点出现故障后,Keepalived监制模块是否能及时发现然后屏蔽故障节点,同时将服务器转移到正常节点来执行。

将WEB1节点服务停掉,假设这个节点出现故障,然后主、备机日志信息如下

3

4

从以上可以看出,Keepalived监控模块检测到192.168.1.6这台主机出现故障后,将WEB1从集群系统中剔除掉了。 此时访问http://192.168.1.55只能看到WEB2了)

8

重新启动WEB1节点的服务,日志信息如下:

5

6

Keepalived监控模块检测到192.168.10.6这台主机恢复正常后,又将此节点加入集群系统中,再次访问就可以访问到WEB1页面了)

6

LVS群集系统维护命令

1、ipvsadm维护
启动:/etc/init.d/lvs_server.sh start
停止:/etc/init.d/lvs_server.sh stop
重启:/etc/init.d/lvs_server.sh restart

2、Keepaived维护
启动:/etc/init.d/keepaived start
停止:/etc/init.d/keepaived stop
重启:/etc/init.d/keepaived restart

3、real server 维护
启动:/etc/init.d/lvs_realserver.sh start
停止:/etc/init.d/lvs_realserver.sh stop

ipvsadm 的命令参考

先简单介绍几个术语:
1,virtual-service-address:是指虚拟服务器的ip 地址
2,real-service-address:是指真实服务器的ip 地址
3,scheduler:调度方法

ipvsadm 的用法和格式如下:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p
[timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port
[-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm –set tcp tcpfin udp
ipvsadm –start-daemon state [–mcast-interface interface]
ipvsadm –stop-daemon
ipvsadm -h
命令选项解释:
有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可
以。
-A –add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也
就是增加一台新的虚拟服务器。
-E –edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D –delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C –clear 清除内核虚拟服务器表中的所有记录。
-R –restore 恢复虚拟服务器规则
-S –save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a –add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器
记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e –edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d –delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l –list 显示内核虚拟服务器表
-Z –zero 虚拟服务表计数器清零(清空当前的连接数量等)
–set tcp tcpfin udp 设置连接超时值
–start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说
明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的
VRRP 功能。
–stop-daemon 停止同步守护进程
-h –help 显示帮助信息
其他的选项:
-t –tcp-service service-address 说明虚拟服务器提供的是tcp 的服务
[vip:port] or [real-server-ip:port]
-u –udp-service service-address 说明虚拟服务器提供的是udp 的服务
[vip:port] or [real-server-ip:port]
-f –fwmark-service fwmark 说明是经过iptables 标记过的服务类型。
-s –scheduler scheduler 使用的调度算法,有这样几个选项
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
默认的调度算法是: wlc.
-p –persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客
户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M –netmask netmask persistent granularity mask
-r –real-server server-address 真实的服务器[Real-Server:port]
-g –gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i –ipip 指定LVS 的工作模式为隧道模式
-m –masquerading 指定LVS 的工作模式为NAT 模式
-w –weight weight 真实服务器的权值
–mcast-interface interface 指定组播的同步接口
-c –connection 显示LVS 目前的连接 如:ipvsadm -L -c
–timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L –timeout
–daemon 显示同步守护进程状态
–stats 显示统计信息
–rate 显示速率信息
–sort 对虚拟服务器和真实服务器排序输出
–numeric -n 输出IP 地址和端口的数字形式

命令使用示例:http://www.toxingwang.com/linux-unix/haandclusters/1604.html

可能出现的问题

1、如果手动在Real SERVER 上添加虚拟地址与回环地址的绑定后出现 secureCRT 与 192.168.1.58 断开情况
a、ifconfig lo:0 192.168.1.58 up
b、ifconfig lo:0 192.168.1.58 broadcast 192.168.1.58 netmask 255.255.255.255 up
c、route add -host 192.168.1.58 dev lo:0

解决方案:在执行a( IP 地址)后出现 secureCRT 与 192.168.1.58 断开情况,此时在 VIP 服务器上无法 ping 通 192.168.1.58 ;执行完 b (回环 IP vip )后, ping 正常。

参考资料

CentOS 6.3下部署LVS(NAT)+Keepalived实现高性能高可用负载均衡:http://www.linuxidc.com/Linux/2012-11/74252.htm
CentOS6.4 配置LVS(DR模式):http://www.cnblogs.com/kgdxpr/archive/2013/09/09/3309776.html
LVS(DR)+ KeepAlived On CentOS6 安装配置说明书:http://www.360doc.com/content/12/0217/23/4165_187485416.shtml
CentOS6.5高可用集群LVS+Keepalived(DR模式):http://www.it165.net/admin/html/201312/2220.html
vs/nat、vs/tun、vs/dr三种模式下各服务器的配置:http://blog.chinaunix.net/uid-28417061-id-3761106.html
CentOS6.4 LVS+keepalived高可用负载均衡服务配置:http://songxj.blog.51cto.com/620981/1171882

发表评论?

4 条评论。

  1. /data/conf/shell/keepalived_chk_ipvsadm.sh,
    status=$(ps aux|grep ipvsadm | grep -v grep | grep -v bash | wc -l)
    这一句结果是0 ,ps aux|grep ipvsadm 已经有结果了奥
    可能这个地方有点问题吧。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据