LVS工作模式及配置

实现集群

从硬件上实现:
1、F5
2、BIG-IP
从软件实现:
1、LVS(工作在tcp/ip的第四层)
2、haproxy
3、ngnix(工作在第七层)
4、varnish

LVS 简介

LVS ,即 Linux Virtual Server ,Linux 虚拟服务器;是一个虚拟的服务器集群,是LB集群的一个实现。

LVS的四种模式

1、DR
2、nat
3、ip-tun
4、full-nat

LVS的相关术语

DR:Director Server 指的是前端负载均衡器节点,控制器、调度器
RS:Real Server 后端真实的工作服务器,后台提供服务的主机
VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址,控制器上对外开放的ip
DIP:Director Server IP 主要用于和内部主机通讯的IP地址,控制器上连接后端服务器的ip
RIP:Real Server IP 后端服务器的IP地址
CIP:Client IP 访问客户端的IP地址,客户端ip

工作原理

lvs附着于netfilter,有五个内置的钩子函数
PREROUTING—>INPUT(流向内部)
PREROUTING—>FORWARD—>POSTROUTING(转发)
OUTPUT—> POSTROUTING(流向外部)
LVS工作模式及配置_第1张图片
1.当用户向负载均衡调度器发起请求,调度器将请求发往至内核空间
2.PREROUTING链首先会受到用户请求,判断目标ip确定是本机ip,将数据包发往INPUT链
3.IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对。如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,将新的数据包发往POSTROUTING链
4.POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

lvs工作于INPUT
PREROUTING—>INPUT(lvs在此强行改变数据流向)—> POSTROUTING

lvs组成(两部分)
1、ipvs(ip virrual server):一段代码,工作在内核,是真正生效实现调度的代码,是工作在内核中的netfilter input钩子函数上
2、ipvsadm:工作在用户空间,负责为ipvs内核框架编写规则,是工作在用户空间的命令行工具,写具体的规则,用于管理集群服务

一、DR模式(Direct Routing)

LVS工作模式及配置_第2张图片
它通过修改请求报文的目标mac地址进行转发
1.保证前端路由器将目标IP为VIP的请求报文发送给director(静态绑定 arptables 修改rs主机内核的参数)
2.rs的rip可以使用私有地址,但也可以使用公网地址
3.请求报文经由director调度,但响应的报文一定不能经由director
4.rs跟director必须在同一物理网络中(同一物理网络不等于同网段)
5.RS网关不能指向dip
数据流向:
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
© IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
(d) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
(e) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端

配置实验

1、配置

VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址,即实验中配置的172.25.23.100
DIP:Director Server IP 主要用于和内部主机通讯的IP地址,即实验中配置的172.25.23.1,即调度器的内网ip
RIP:Real Server IP 后端服务器的IP地址,后端主机的内网ip,即172.25.23.2和172.25.23.3
CIP:Client IP 访问客户端的IP地址,即用户客户机的ip,此处用真机进行访问,即172.25.23.23

1)基于软件的配置

准备三台虚拟机,server1做调度器,server2,server3做后端服务器

				server1					server2					server3
内网ip			172.25.23.1				172.25.23.2				172.25.23.3
vip				172.25.23.100			172.25.23.100			172.25.23.100
配置				调度器						阿帕奇						阿帕奇

配置:

在server1上

1)配置yum源

cd /etc/yum.repos.d/
vim rhel-source.repo 
	name=Red Hat Enterprise Linux $releasever - $basearch - Source
	baseurl=http://172.25.23.250/rhel6.5
	enabled=1
	gpgcheck=0
	gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

	[LoadBalancer]
	name=Red Hat Enterprise Linux $releasever - $basearch - Source
	baseurl=http://172.25.23.250/rhel6.5/LoadBalancer	
	enabled=1
	gpgcheck=0
	gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

2)给另两台主机发送配置好的yum源

	yum install openssh-clients -y
	scp /etc/yum.repos.d/rhel-source.repo [email protected]:/etc/yum.repos.d/   ##yum源发给另外两台服务器
	scp /etc/yum.repos.d/rhel-source.repo [email protected]:/etc/yum.repos.d/		

3)配置ipvsadm

	yum install ipvsadm -y		##安装ipvsadm
	ipvsadm -l					##查看编写规则
	lsmod
	lsmod|grep ip_vs
	ip addr add 172.25.23.100/24 dev eth0			##给网卡添加内网地址
	ipvsadm -A -t 172.25.23.100:80 -s rr			##在lvs中为http协议添加一个vip为100的server,并设置调度方式为Round Robin,即轮询。添加一个集群服务
	#	-A  ##添加
	#	-E	##修改
	#	-t 	##tcp
	#	-u	##udp
	#	-s	##指定调度算法		
	ipvsadm -a -t 172.25.23.100:80 -r 172.25.23.2:80 -g	##访问100时,转向23.2服务器。给一个集群服务添加一条RS规则
	ipvsadm -a -t 172.25.23.100:80 -r 172.25.23.3:80 -g	##访问100时,转向23.3服务器
	#	-a	##添加
	#	-e	##修改
	#	-d	##删除
	#	-g	##dr模式直接路由gatway
	ipvsadm -l
	#	-c	##列出当前所有的connection
    # 	--stats	##列出统计数据
    #	--rate	##速率数据
	/etc/init.d/ipvsadm save				##保存规则
	ipvsadm -l

在server2(后端服务器)

1)配置阿帕奇i

	yum install httpd -y
	/etc/init.d/httpd start
	cd /var/www/html/
	vim index.html
		server2
	/etc/init.d/httpd restart

2)网卡添加内网地址

ip addr add 172.25.23.100/32 dev eth0		##给网卡添加内网地址

3)arp规则

	yum search arptables
	yum install arptables_jf.x86_64 -y		##安装arp防火墙软件
	arptables -L					##查看
	arptables -A IN -d 172.25.23.100 -j DROP	##写arp规则,询问到此主机100时,访问被丢弃
	arptables -A OUT -s 172.25.23.100 -j mangle --mangle-ip-s 172.25.23.2	##访问100以23.2返回
	arptables -L
	/etc/init.d/arptables_jf save			##保存规则

在server3 (后端服务器)

	yum install openssh-clients -y
	yum install httpd -y
	/etc/init.d/httpd start
	cd /var/www/html/
	vim index.html
		server3
	/etc/init.d/httpd restart
	ip addr add 172.25.23.100/32 dev eth0		##给网卡添加内网地址
	yum install arptables_jf.x86_64 -y
	arptables -A IN -d 172.25.23.100 -j DROP
	arptables -A OUT -s 172.25.23.100 -j mangle --mangle-ip-s 172.25.23.3
	arptables -L
	/etc/init.d/arptables_jf save	

测试:真机充当客户机

	curl 172.25.23.100	##访问

测试效果,在server1上
ipvsadm -L
可以看到轮询
LVS工作模式及配置_第3张图片

真机上
arp -an|fgrep 100	##查看访问到那个主机网卡

在这里插入图片描述

2)基于内核的配置

##配置内核参数
##arp_ignore和arp_announce参数都和ARP协议相关,主要用于控制系统返回arp响应和发送arp请求时的动作。这两个参数很重要,特别是在LVS的DR场景下,它们的配置直接影响到DR转发是否正常

arp_ignore参数的作用是控制系统在收到外部的arp请求时,是否要返回arp响应
0: 如果路由向我的一个网络接口发送广播,请求的是本机上的其他接口,就告知它(默认值)
1:只响应目的IP地址为接收网卡上的本地地址的arp请求,如果路由向我的一个网络接口发送广播,请求的是本机上的其他接口,就拒绝它
arp_announce的作用是控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址
0: 一旦我接入一个网络,就向这个网络内的所有主机通告自己所有的网络接口信息,不隐藏(默认值)
1:一旦我接入一个网络,就将接入网络这一个接口的信息通告其他主机,本机上的其他接口信息可以通告也可以不通告
2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址,一旦我接入一个网络,就将接入网络这一个接口的信息通告其他主机,本机上的其他接口信息绝对不通告出去

在serve1上

	ipvsadm -C
	ip addr add 172.25.23.100/24 dev eth0
	ipvsadm -A -t 172.25.23.100:80 -s rr
	ipvsadm -a -t 172.25.23.100:80 -r 172.25.23.2:80 -g
	ipvsadm -a -t 172.25.23.100:80 -r 172.25.23.3:80 -g

在server2

	sysctl -a |grep arp_ignore			##修改内核参数
	sysctl -a |grep arp_announce		##修改内核参数
	sysctl -w net.ipv4.conf.all.arp_ignore=1
	sysctl -w net.ipv4.conf.lo.arp_ignore=1
	sysctl -w net.ipv4.conf.all.arp_announce=2
	sysctl -w net.ipv4.conf.lo.arp_announce=2
	ip addr add 172.25.23.100/32 dev eth0		

在server3上

	sysctl -a |grep arp_ignore
	sysctl -a |grep arp_announce
	sysctl -w net.ipv4.conf.all.arp_ignore=1
	sysctl -w net.ipv4.conf.lo.arp_ignore=1
	sysctl -w net.ipv4.conf.all.arp_announce=2
	sysctl -w net.ipv4.conf.lo.arp_announce=2
	ip addr add 172.25.23.100/32 dev eth0		

2、对服务器进行健康状态检查

server1是调度器,临时服务器,server2和server3是后端服务器

server1(调度器)上

1)修改yum源

vim rhel-source.repo
	name=Red Hat Enterprise Linux $releasever - $basearch - Source
	baseurl=http://172.25.23.250/rhel6.5
	enabled=1
	gpgcheck=0
	gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

	[LoadBalancer]
	name=Red Hat Enterprise Linux $releasever - $basearch - Source
	baseurl=http://172.25.23.250/rhel6.5/LoadBalancer
	enabled=1
	gpgcheck=0
	gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

	[HighAvailability]
	name=Red Hat Enterprise Linux $releasever - $basearch - Source
	baseurl=http://172.25.23.250/rhel6.5/HighAvailability	##
	enabled=1
	gpgcheck=0
	gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
yum clean all 
yum repolist

2)安装软件

##此处ldirectord-3.9.5-3.1.x86_64.rpm需要从真机复制过来,如果没有需要下载

	yum install ldirectord-3.9.5-3.1.x86_64.rpm -y
	rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm
	cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
	vim /etc/ha.d/ldirectord.cf
		 25 virtual=172.25.23.100:80		##访问地址
		 26         real=172.25.23.2:80 gate	##后端服务器
		 27         real=172.25.23.3:80 gate	##后端服务器
		 28         fallback=127.0.0.1:80 gate	##本机
		 29         service=http
		 30         scheduler=rr
		 31         #persistent=600
		 32         #netmask=255.255.255.255
		 33         protocol=tcp
		 34         checktype=negotiate
		 35         checkport=80
		 36         request="index.html"
		 37         #receive="Test Page"
		 38         #virtualhost=www.x.y.z
	
	ipvsadm -l
	ipvsadm -C			##需要刷新一下策略
	/etc/init.d/ldirectord restart	##重启
	ipvsadm -l			##查看服务器运行状态

3)配置http服务

#给server1安装阿帕器,当后端服务器故障后,server1临时顶替工作
yum install httpd -y
/etc/init.d/httpd start
cd /var/www/html/
vim index.html
	server1
/etc/init.d/httpd restart		

实验效果

当server2服务器stop后,客户机(真机)curl 172.25.23.100,一直是server3服务器在工作,当server2,server3同时stop后,server1顶替工作,
用到命令:

	server2上
	/etc/init.d/httpd stop
	/etc/init.d/httpd start
	server3上
	/etc/init.d/httpd stop
	/etc/init.d/httpd star
	真机
	curl 172.25.23.100	

在server1上
ipvsadm -l
可以看到此时哪台服务器在工作
LVS工作模式及配置_第4张图片

二、IP-TUN模式(IP TUNNELING)

LVS工作模式及配置_第5张图片
在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)
不修改请求报文的ip首部(cip—vip),而是通过在原有的ip首部(dip–rip),再封装一个ip首部
1.rip dip vip 全是公网地址
2.rs的网关不能指向dip
3.请求报文必须经由director调度,但响应报文必须不能经由director
4.rs的os必须支持隧道功能
数据流向:
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
© IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
(d) POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
(e) RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端

配置

server1

/etc/init.d/ldirectord stop  ##先把之前实验的关掉
ipvsadm -C			##刷新
ipvsadm -l
modprobe ipip
ip addr show
ip addr del 172.25.23.100/24 dev eth0		##删除eth0上配置的内网
ip addr add 172.25.23.100/24 dev tunl0		##给tunl10添加内网网段
ip addr show
ip link set up tunl0		##开启tunl10
ip addr show
ipvsadm -A -t 172.25.23.100:80 -s rr		
ipvsadm -a -t 172.25.23.100:80 -r 172.25.23.2:80 -i
ipvsadm -a -t 172.25.23.100:80 -r 172.25.23.3:80 -i
ipvsadm -l	
/etc/init.d/ipvsadm save

在server2:

	modprobe ipip
	ip addr show
	ip addr del 172.25.23.100/32 dev eth0
	ip addr add 172.25.23.100/32 dev tunl0		##添加tunls
	ip link set up tunl0				
	
	sysctl -a |grep rp_filter			##把内核改为0
	sysctl -w net.ipv4.conf.default.rp_filter=0
	sysctl -w net.ipv4.conf.lo.rp_filter=0
	sysctl -w net.ipv4.conf.eth0.rp_filter=0
	sysctl -w net.ipv4.conf.tunl0.rp_filter=0
	sysctl -a |grep rp_filter
	sysctl -p					##修改立即生效

在server3

	modprobe ipip
	ip addr show
	ip addr del 172.25.23.100/32 dev eth0
	ip addr add 172.25.23.100/32 dev tunl0
	ip link set up tunl0
	sysctl -a |grep rp_filter
	sysctl -w net.ipv4.conf.default.rp_filter=0
	sysctl -a |grep rp_filter
	sysctl -w net.ipv4.conf.eth0.rp_filter=0
	sysctl -w net.ipv4.conf.tunl0.rp_filter=0
	sysctl -a |grep rp_filter
	sysctl -p

实验效果

在客户机(真机)curl 172.25.23.100
在server1
ipvsadm -l
能看到轮询效果,并且模式是Tunnel
LVS工作模式及配置_第6张图片

三 、NAT模式

LVS工作模式及配置_第7张图片
多目标的DNAT:通过修改请求报文的目标IP地址(同时可能会修改目标端口),至挑选出某RS的RIP地址实现转发
1.RS和DIP应该使用私网地址,且RS的网关要指向DIP
2.请求和响应报文都要经由director转发,极高负载的场景中,director可能会成为系统瓶颈
3.RS可以使用任意OS
4.RS的RIP和Director的DIP必须要在同一IP网络:RS的网关要指向DIP
数据流向:
(a). 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b). PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
©. IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
(d). POSTROUTING链通过选路,将数据包发送给Real Server
(e). Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
(f). Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP

你可能感兴趣的:(企业)