LVS架构:

LVS集群的体系结构如图:
-
负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址上的。它可以是用IP负载均衡技术的负载调度器,也可以是基于内容请求分发的负载调度器,还可以是两者的结合。
-
服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
-
后端存储(backend storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
调度器采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客户请求到达时,调度器只根据负载情况从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的其他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提供不同的服务,当客户请求到达时,调度器可根据请求的内容和服务器的情况选择服务器执行请求。因为所有的操作都是在操作系统核心空间中将完成的,它的调度开销很小,所以它具有很高的吞吐率。
服务器池的结点数目是可变的。当整个系统收到的负载超过目前所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。对大多数网络服务来说,结点与结点间不存在很强的相关性,所以整个系统的性能可以随着服务器池的结点数目增加而线性增长。
后端存储通常用容错的分布式文件系统,如AFS、GFS、Coda和Intermezzo等。分布式文件系统为各服务器提供共享的存储区,它们访问分布式文件系统就像访问本地文件系统一样。同时,分布式文件系统提供良好的伸缩性和可用性。然而,当不同服务器上的应用程序同时访问分布式文件系统上同一资源时,应用程序的访问冲突需要消解才能使得资源处于一致状态。这需要一个分布式锁管理器(Distributed
Lock
Manager),它可能是分布式文件系统内部提供的,也可能是外部的。开发者在写应用程序时,可以使用分布式锁管理器来保证应用程序在不同结点上并发访问的一致性。
负载调度器、服务器池和分布式文件系统通过高速网络相连,如100Mbps交换机、Myrinet、CompactNET和Gigabit交换机等。使用高速的网络,主要为避免当系统规模扩大时互联网络成为瓶颈。
Graphic Monitor是为系统管理员提供整个集群系统的监视器,它可以监视系统中每个结点的状况。Graphic
Monitor是基于浏览器的,所以无论管理员在本地还是异地都可以监测系统的状况。为了安全的原因,浏览器要通过HTTPS(Secure
HTTP)协议和身份认证后,才能进行系统监测,并进行系统的配置和管理。
LVS结构与工作原理
LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real
Server,RS)群组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual
Server),而看不到提供服务的RS群。
当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。同请求包一样,应答包的返回方式也与包转发策略有关。
LVS的包转发策略有三种:
NAT (Network Address Translation)模式。LB收到用户请求包后,LB将请求包中虚拟服务器的IP地址转换为某个选定RS的IP地址,转发给RS;RS将应答包发给LB,LB将应答包中RS的IP转为虚拟服务器的IP地址,回送给用户。
IP隧道 (IP Tunneling)模式。LB收到用户请求包后,根据IP隧道协议封装该包,然后传给某个选定的RS;RS解出请求信息,直接将应答内容传给用户。此时要求RS和LB都要支持IP隧道协议。
DR(Direct Routing)模式。LB收到请求包后,将请求包中目标MAC地址转换为某个选定RS的MAC地址后将包转发出去,RS收到请求包后 ,可直接将应答内容传给用户。此时要求LB和所有RS都必须在一个物理段内,且LB与RS群共享一个虚拟IP。
目前系统有八种负载均衡调度算法,具体如下:
rr:轮循调度(Round-Robin) 它将请求依次分配不同的RS,也就是在RS中均摊请求。这种算法简单,但是只适合于RS处理性能相差不大的情况。
wrr:加权轮循调度(Weighted Round-Robin) 它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS更多。相同权值的RS得到相同数目的连接数。
dh:目的地址哈希调度 (Destination Hashing) 以目的地址为关键字查找一个静态hash表来获得需要的RS。
sh:源地址哈希调度(Source Hashing) 以源地址为关键字查找一个静态hash表来获得需要的RS。
Lc:最小连接数调度(Least-Connection) IPVS表存储了所有的活动的连接。把新的连接请求发送到当前连接数最小的RS。
Wlc:加权最小连接数调度(Weighted Least-Connection) 假设各台RS的权值依次为Wi(I = 1..n),当前的TCP连接数依次为Ti(I=1..n),依次选取Ti/Wi为最小的RS作为下一个分配的RS。
Lblc:基于地址的最小连接数调度(Locality-Based Least-Connection) 将来自同一目的地址的请求分配给同一台RS如果这台服务器尚未满负荷,否则分配给连接数最小的RS,并以它为下一次分配的首先考虑。
Lblcr:基于地址的带重复最小连接数调度(Locality-Based Least-Connection with Replication)
对于某一目的地址,对应有一个RS子集。对此地址的请求,为它分配子集中连接数最小的RS;如果子集中所有的服务器均已满负荷,则从集群中选择一个连接数较小的服务器,将它加入到此子集并分配连接;若一定时间内,这个子集未被做任何修改,则将子集中负载最大的节点从子集删除。
命令参考
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 地址和端口的数字形式
LVS NAT的特性:
1、RS应该使用私有地址:
2、RS的网关必须指向DIP:
3、RIP和DIP必须在同一网段内:
4、请求和相应的报文都经过Director,在高负载场景中,Director很可能成为系统性能瓶颈:
5、支持端口映射:
6、RS可以使用任意支持集群服务的OS:
LVS DR类型
1、让前端路由将请求发往VIP时,只能是Director上的VIP:
解决方案:
(1)静态地址绑定:
未必有路由器的配置权限:
Director调用时静态地址绑定将难以使用:
(2)arptables
(3) 修改Linux内核参数,将RS上的VIP配置在lo接口的别名,限制Linux仅对对应接口的ARP请求做响应
LVS DR类型的特性:
1、RS可以使用私有地址,但也可以使用公网地址 ,此时可以直接通过互联网连入RS以实现配置、监控等:
2、RS的网关一定不能指向DIP:
3、RS跟Director要在同一物理网络内(不能由路由器分隔):
4、请求报文经过Director,但响应报文一定不经过Director:
5、不支持端口映射:
6、RS可以使用大多数的操作系统:
LVS TUN类型:IP隧道
1、RIP、DIP、VIP都得是公网地址:
2、RS的网关不会指向也不可能指向DIP:
3、请求报文经过Director,但响应报文一定不经过Director:
4、不支持端口映射:
5、RS的OS必须得支持隧道功能:
LVS的调度方法: 10种
静态方法:仅根据算法本身进行调度
rr:Round Robin
wrr:Weighted RR
sh:source hashing
dh: destination hashing
动态方法:根据算法及RS当前的负载状况
lc:Least Connection
Overhead=Active*256+Inactive
结果中,最小者胜出
wlc:Weighted LC
Overhead=(Active*256+Inactive)/weight
sed:Shortest Expect Delay
Overhead=(Active+1)*256/weight
nq:Never Queue
lblc:Locality-based least Connection
dh+lc
lblcr:Replicated and Locality-based least Connection
Session持久机制:
1、session绑定:始终将同一请求者的联结定向至同一个RS(第一次请求时仍由调度方法选择):
2、session复制:在RS之间同步session,因此,每个RS持集群中所有的session:对于大规模集群环境不适用:
3、session服务器:利用单独部署的服务器来统一管理session;
实验:
一、NAT模式
设置三台机器:
DR:两块网卡,eth0:192.168.0.118 eth1(DIP):192.168.12.1 eth0:0(VIP)192.168.0.200
node1:一块网卡,eth0(RIP):192.168.12.11
node2:一块网卡,eth0(RIP):192.168.12.12
NAT模型架构图:两个RS需把网关指向DIP,DR机器需配置两块网卡,分别配置VIP和DIP。两个RS各配置一块网卡,分配RIP。(RIP和DIP需在一个网段)
在DR机器上
1、查找ipvs内核编译模块,
[root@localhost ~]# grep -i "ipvs" /boot/config-2.6.32-431.el6.x86_64
# IPVS transport protocol load balancing support
# IPVS scheduler
# IPVS application helper
2、查看ipvs内核编译模块
[root@localhost ~]# grep -C 10 -i "ipvs" /boot/config-2.6.32-431.el6.x86_64
CONFIG_IP_SET_HASH_IPPORTNET=m
CONFIG_IP_SET_HASH_NET=m
CONFIG_IP_SET_HASH_NETPORT=m
CONFIG_IP_SET_LIST_SET=m
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
#
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
#
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
#
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_PE_SIP=m
#
# IP: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV4=m
CONFIG_NF_CONNTRACK_IPV4=m
# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
3、查看ipvs内核编译模块
[root@localhost ~]# grep -E -i "ipvs|IP_VS" /boot/config-2.6.32-431.el6.x86_64
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
# IPVS transport protocol load balancing support
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
# IPVS scheduler
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
# IPVS application helper
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_PE_SIP=m
LVS的集群服务:
四层交换,四层路由
根据请求目标套接字(包括端口的协议类型tcp,udp)来实现妆发
如:192.168.0.200:80
4、装上ipvsadm
yum install -y ipvsadm
5、ipvsadm
ipvsadm(用户空间工具)
ipvsadm用法如下:
ipvsadm -A|E -t|u|f service-address [-s scheduler]
[-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address
[-g|i|m] [-w weight] [-x upper] [-y lower]
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]
[--syncid syncid]
ipvsadm --stop-daemon state
ipvsadm -h
集群服务相关命令
-A:添加一个集群服务
-t:tcp
-u: udp
-f:firewall mark,通常将两个或以上的服务绑定为一个服务进行处理时使用:
service-address:
-t IP:port
-u ip:port
-f firewall_mark
-s 调度方法,默认为wlc
-p timeout: persistent connection,持久连接
-E: 修改定义过的集群服务
-D:-t|-u| f service-address:删除指定的集群服务
RS相关的命令
-a: 想指定的CS中添加RS
-t|-u|-f service-address:指明将RS添加至哪个Cluster Service中
-r: 指定RS,可以包含{IP[:port]},只有支持端口映射的LVS类型才允许使用跟集群服务中不同的端口
LVS类型:
-g:Gateway,DR
-i:ipip,TUN
-m:masquerade,NAT
指定RS权重:
-w
-e:修改指定的RS属性
-d -t|u|f service-address -r server-address:从指定的集群服务中删除某RS
清空所有的集群服务:
-C
保存规则:(使用输出重定向)
ipvsadm-save
ipvsadm -S
查看ipvs规则等:
-L [option]
-n:数字格式显示IP地址
-c:显示连接相关信息
--stats:显示统计数据
--rate:速率
--exact:显示统计数据的精确值
-Z:计数器清零:
6、配置三台机器
node1、node2上启动httpd
node1:
vim /var/www/html/index.html
node1.shamereedwine.com
node2:
vim /var/www/html/index.html
node2.shamereedwine.com
node1:
启动httpd服务
service httpd start
node2:
启动httpd服务
service httpd start
node1:
配置IP地址
ifconfig eth0 192.168.12.11/24
指定默认网关
route add default gw 192.168.12.1
node2:
配置IP地址
ifconfig eth0 192.168.12.12/24
指定默认网关
route add default gw 192.168.12.1
DR:
配置eth1地址
ifconfig eth1 192.168.12.1/24
DR:
打开路由间转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p#立即生效
DR:
测试两web机器网页打开情况
[root@localhost ~]# curl
node1.shamereedwine.com
[root@localhost ~]# curl
node2.shamereedwine.com
DR:
设置VIP
ifconfig eth0:0 192.168.0.200/24
DR:
加集群服务
ipvsadm -A -t 192.168.0.200:80 -s rr
DR:
查看添加的集群的信息
[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.0.200:80 rr
DR:
向集群中加主机
[root@localhost ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.12.11 -m
[root@localhost ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.12.12 -m
DR:
查看添加real server后的集群的信息
[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.0.200:80 rr
-> 192.168.12.11:80 Masq 1 0 0
-> 192.168.12.12:80 Masq 1 0 0
DR:
显示速率
[root@localhost ~]# ipvsadm -L -n --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 192.168.0.200:80 0 0 0 0 0
-> 192.168.12.11:80 0 0 0 0 0
-> 192.168.12.12:80 0 0 0 0 0
DR:
显示统计数据
[root@localhost ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.0.200:80 0 0 0 0 0
-> 192.168.12.11:80 0 0 0 0 0
-> 192.168.12.12:80 0 0 0 0 0
使用浏览器访问VIP
如下图所示:网页在node1和node2之间跳动
DR:
查看统计数据
[root@localhost ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.0.200:80 6 30 30 3552 3406
-> 192.168.12.11:80 3 15 15 1805 1702
-> 192.168.12.12:80 3 15 15 1747 1704
DR:
更改算法为wrr
[root@localhost ~]# ipvsadm -E -t 192.168.0.200:80 -s wrr
DR:
修改reaal server 192.168.12.11的权重为3
[root@localhost ~]# ipvsadm -e -t 192.168.0.200:80 -r 192.168.12.11 -m -w 3
DR:
查看集群信息
[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.0.200:80 wrr
-> 192.168.12.11:80 Masq 3 0 0
-> 192.168.12.12:80 Masq 1 0 0
DR:
刷新页面,显示数据,node1的访问量是node2的三倍左右
[root@localhost ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.0.200:80 31 155 155 20208 14224
-> 192.168.12.11:80 22 110 110 14465 9448
-> 192.168.12.12:80 9 45 45 5743 4776
DR:
定义连接超时时间
[root@localhost ~]# ipvsadm -L --timeout
Timeout (tcp tcpfin udp): 900 120 300
二、DR模式
DR模式的架构
DR:
先配置DIP
[root@localhost ~]# ifconfig eth0:0 192.168.0.170/24 up
再配置VIP
[root@localhost ~]# ifconfig eth0:1 172.16.100.8 up
添加静态路由
[root@localhost ~]#route add -host 172.16.100.8 dev eth0:1
RS1:
配置IP
[root@node1 ~]# ifconfig eth0 192.168.0.171/24 up
添加默认网关
route add default gw 192.168.0.1
RS2:
配置IP
[root@node2 ~]# ifconfig eth0 192.168.0.172/24 up
添加默认网关
route add default gw 192.168.0.1
RS1:{
配置内核参数
[root@node1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@node1 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@node1 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@node1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
网卡上指定VIP的地址
[root@node1 ~]# ifconfig lo:0 172.16.100.8 netmask 255.255.255.255 broadcast 172.16.100.8 up
加静态路由
[root@node1 ~]# route add -host 172.16.100.8 lo:0
启动Web服务
[root@node1 ~]# service httpd start
正在启动 httpd: [确定]
使用CURL测试本地的网页,显示如下
[root@node1 ~]# curl
node1.shamereedwine.com
[root@node1 ~]# curl
node1.shamereedwine.com
}
RS2:{
配置内核参数
[root@node2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@node2 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@node2 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@node2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
网卡上指定VIP的地址
[root@node2 ~]# ifconfig lo:0 172.16.100.8 netmask 255.255.255.255 broadcast 172.16.100.8 up
加静态路由
[root@node2 ~]# route add -host 172.16.100.8 lo:0
启动Web服务
[root@node2 ~]# service httpd start
正在启动 httpd: [确定]
使用CURL测试本地的网页,显示如下
[root@node2 ~]# curl
node2.shamereedwine.com
[root@node2 ~]# curl
node2.shamereedwine.com
}
DR:
添加ipvs条目定义集群服务
[root@localhost ~]# ipvsadm -A -t 172.16.100.8:80 -s rr
[root@localhost ~]# ipvsadm -a -t 172.16.100.8:80 -r 192.168.0.171 -g
[root@localhost ~]# ipvsadm -a -t 172.16.100.8:80 -r 192.168.0.172 -g
查看定义的条目:
[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 172.16.100.8:80 rr
-> 192.168.0.171:80 Route 1 0 0
-> 192.168.0.172:80 Route 1 0 0
三、LVS持久连接
PCC:将来自同一个客户端发往VIP的所有请求统统定向至同一个RS:
PPC:将来自于一个客户端发往某VIP的某端口的所有请求统统定向至同一个RS:
PFMS:端口绑定,port affinity
基于防火墙标记,将两个或以上的端口绑定为同一个服务。
示例:
三台服务器
DR:192.168.0.104 VIP:192.168.0.200
RS1:192.168.0.106
RS2:192.168.0.107
配置:
DR:
设置VIP
[root@localhost ~]# ifconfig eth0:0 192.168.0.200/24 up
加静态路由
[root@localhost ~]# route add -host 192.168.0.200 dev eth0:0
RS1:
配置内核参数
[root@node1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@node1 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@node1 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@node1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
配置VIP地址
[root@node1 ~]# ifconfig lo:0 192.168.0.200 netmask 255.255.255.255 broadcast 192.168.0.200 up
加静态路由
[root@node1 ~]# route add -host 192.168.0.200 dev lo:0
RS2:
配置内核参数
[root@node2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@node2 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@node2 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@node2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
配置VIP地址
[root@node2 ~]# ifconfig lo:0 192.168.0.200 netmask 255.255.255.255 broadcast 192.168.0.200 up
加静态路由
[root@node2 ~]# route add -host 192.168.0.200 dev lo:0
RS1、RS2:
启动web服务
service httpd start
PPC(模式演示):将来自于一个客户端发往某VIP的某端口的所有请求统统定向至同一个RS:
DR:
添加集群规则
[root@localhost ~]# ipvsadm -A -t 192.168.0.200:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.106 -g
[root@localhost ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.107 -g
网页持续两个站点间跳跃,如下图所示:
查看数据连接状态,负载比较均衡
[root@localhost ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.0.200:80 2 2 0 104 0
-> 192.168.0.106:80 1 1 0 52 0
-> 192.168.0.107:80 1 1 0 52 0
DR:
设置持久连接的时间是120秒
[root@localhost ~]# ipvsadm -E -t 192.168.0.200:80 -s rr -p 120
现在无论怎么刷新都绑定到一个站点上,是PPC的效果:
使用SSH连接到VIP地址,如下图所示:
连接上的是DR的机器
DR:
把ssh服务加入集群
[root@localhost ~]# ipvsadm -A -t 192.168.0.200:22 -s rr -p 1200
[root@localhost ~]# ipvsadm -a -t 192.168.0.200:22 -r 192.168.0.106 -g
[root@localhost ~]# ipvsadm -a -t 192.168.0.200:22 -r 192.168.0.107 -g
[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.0.200:22 rr persistent 1200
-> 192.168.0.106:22 Route 1 0 0
-> 192.168.0.107:22 Route 1 0 0
TCP 192.168.0.200:80 rr persistent 120
-> 192.168.0.106:80 Route 1 0 0
-> 192.168.0.107:80 Route 1 0 0
重新使用SSH连接到VIP地址,如下图所示:
这次连接入的是RS2的机器。
在一定时间内再重新使用SSH连接VIP,连接的还是RS2的机器,如下图所示:
PCC(模式演示):将来自同一个客户端发往VIP的所有请求统统定向至同一个RS:
DR:
定义集群服务
[root@localhost ~]# ipvsadm -A -t 192.168.0.200:0 -s rr -p 600
[root@localhost ~]# ipvsadm -a -t 192.168.0.200:0 -r 192.168.0.106 -g
[root@localhost ~]# ipvsadm -a -t 192.168.0.200:0 -r 192.168.0.107 -g
[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.0.200:0 rr persistent 600
-> 192.168.0.106:0 Route 1 0 0
-> 192.168.0.107:0 Route 1 0 0
测试WEB和SSH,如下图所示:
已经将来自同一个客户端发往VIP的所有请求统统定向至同一个RS
四、做防火墙标记
#iptables -t mangle -A PREROUTING -d VIP -p tcp --dport CS_Port -j MARK --set-mark # (0-99)
定义集群服务
#ipvsadm -A -f #
[root@localhost ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp --dport 80 -j MARK --set-mark 10
保存
[root@localhost ~]# service iptables save
iptables:将防火墙规则保存到 /etc/sysconfig/iptables: [确定]
DR:
添加集群服务
[root@localhost ~]# ipvsadm -A -f 10 -s rr
[root@localhost ~]# ipvsadm -a -f 10 -r 192.168.0.106 -g
[root@localhost ~]# ipvsadm -a -f 10 -r 192.168.0.107 -g
[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
FWM 10 rr
-> 192.168.0.106:0 Route 1 0 0
-> 192.168.0.107:0 Route 1 0 0
测试集群服务显示效果如下:

站点在node1和node2之间切换
定义持久连接
[root@localhost ~]# ipvsadm -E -f 10 -s rr -p 1200
[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
FWM 10 rr persistent 1200
-> 192.168.0.106:0 Route 1 0 0
-> 192.168.0.107:0 Route 1 0 0
再测试请求的效果,如下所示:

来自于一个客户端的请求,在一定的时间内只定向到一台RS。
五、健康监测
1、后端RS的健康状态监测
(1)脚本
(2)keepalived,ldirectord
2、Director自身的可用性
(1)ldirectord(heartbeat,corosync)
(2)keepalived
node1、node2:
cd /var/www/html/
vim .health.html
OK
DR:
vim checkhealth.sh
#!/bin/bash
CS=`-f 10`
RS1=192.168.0.106
RS2=192.168.0.107
checkRS() {
curl -s {1}/.health.html | grep "OK" &> /dev/null
RetVal=$?
if [ $RetVal -ne 0 ] && ipvsadm -L -n | grep "$1" &> /dev/null; then
ipvsadm -d $CS -r $1
fi
if [ $RetVal -eq 0 ] && ! ipvsadm -L -n | grep "$1" &> /dev/null; then
ipvsadm -a $CS -r $1 -g
fi
}
while true;do
checkRS $RS1
checkRS $RS2
sleep 3
done