LVS 的三种模型中,NAT和DR模型最为常见,TUN模型比较复杂,这里就不再举例。
为了简化模拟过程,在这里我不再引入另外的路由设备了。
一、NAT模型:

说明:我在这里准备3台虚拟主机,物理机作为用户端,一台虚拟主机作为Director,另两台作为web服务器,我们演示的场景应该是用户过来的请求应该在两台web服务器中轮询,两台服务器提供相同的页面给用户,但是这里为了演示效果,我这里提供的两台服务器的页面不相同,以更好的显示效果。
为了模拟真实场景,内网使用vmnet2,外网使用Bridged。
根据环境来配置各虚拟主机ip地址并为web服务提供页面(注:RS1和RS2的网关要指向DIP)
Director:
- ifconfig eth0 172.16.9.1/16
- ifconfig eth1 192.168.10.1/24
打开转发,并测试下看能否访问RS1和RS2

RS1:
- ifconfig eth0 192.168.10.2/24
- route add default gw 192.168.10.1
RS2:
- ifconfig eth0 192.168.10.2/24
- route add default gw 192.168.10.1
在Director上配置集群服务:
说明:从Linux内核版本2.6起,ip_vs code已经被整合进了内核中,因此,只要在编译内核的时候选择了ipvs的功能,您的Linux即能支持LVS(如果用‘yum list all ipvs*’找不到时,可能是你的yum源没有配置完全哦,检查下yum源看看)

在客户端访问VIP,就会看到两个页面会交替出现了。


也可以将调度方法指定为wrr:

再刷新页面,两次的访问页面就会以2:1的访问形式出现了。
再查看下集群服务中,连接次数的比也是2:1的哦^_^

二、DR模型:
DR模型中要解决的问题:
1、在前面一篇文章中我们提到了在Director和RS上都需要配置VIP,而当用户请求过来的时候,RS必须要隐藏自己的VIP。
在这里我们引入两个参数:arp_announce和arp_ignore ,可以通过配置其参数来设置响应请求。
arp_announce :当ARP请求通过某个端口进来是否利用这个接口来回应。
0(默认)-----将本地所有地址向外通告(不管配置在哪个接口上全响应ARP请求)
1-----表示避免和目标网络不在同一网络内的本地地址向外通告
2-----只用最佳本地地址通告给目标网络
arp_ignore:是否响应通过本地网卡进来的ARP请求
0(默认)-----无论请求是从哪个网卡进来的,在该主机内,只要有和目标地址在同一网络内的地址,就一定给予响应
1-----只有请求的目标地址恰好是在请求的网络中才给予响应
在DR模型内,我们将arp_announce设为2和arp_ignore设为1,并且RS中的VIP不进行广播,即可隐藏RS的VIP。
2、响应客户端的时候,要以RS的VIP进行响应
添加一条路由即可:
route add -host 172.16.66.1 dev lo:0
例、

说明:将虚拟主机都设置为桥接模式
配置RS1:

在RS2上相同的配置:

在Director上配置地址及集群服务:

通过物理机访问http://172.16.66.1,即可出现两页面轮询的效果了。
三、LVS的持久连接:
('-p' 来指定持久连接的超时时间)
如果期望源于同一个客户端的请求都由同一台RS响应时,则需要用到持久连接。
持久连接的三种类型:
PCC--持久客户端连接:可以实现只要是来自于同一个客户端的请求统统定义到某一个特定的RS(默认端口定义为0)
PPC--持久端口连接:将对某种特定应用的请求转发到特定的RS
PFWM--持久防火墙标记连接:将多个PPC合并起来,即多个特定应用定义到某个特定的RS,即根据iptables所定义的标记来定义集群服务;
根据iptables 的规则,可以将对于某类服务/几个不同端口的访问定义为一类,再对打过标记的服务定义其集群服务
例如:我们开启web(80)、ssh(22)、基于ssl的web(443)三种服务,来解析下持久连接下的三种类型;
下面的实验基于DR模型:
web和ssh已经启动,下面为RS启动基于ssl的web服务:
1、先创建证书:
在Director中配置:
- [root@www ~]# yum -y install mod_ssl
- vim /etc/pki/tls/openssl.conf
- 45 dir = /etc/pki/CA
- [root@www ~]# cd /etc/pki/CA/
- [root@www CA]# (umask 077;openssl genrsa -out private/cakay.pem 2048)
- [root@www CA]# openssl req -new -x509 -key private/cakay.pem -out cacert.pem -days 3650
- [root@www CA]# mkdir certs newcerts tls
- [root@www CA]# touch index.txt
- [root@www CA]# echo 01 > serial
在RS上配置:
- [root@rs1 ~]# mkdir /etc/httpd/ssl
- [root@rs1 ~]# cd /etc/httpd/ssl
- [root@rs1 ssl]# (umask 077; openssl genrsa -out httpd.key 1024)
- [root@rs1 ssl]# openssl req -new -key httpd.key -out httpd.csr
-
- vim /etc/httpd/conf.d/ssl.conf
- 112 SSLCertificateFile /etc/httpd/ssl/httpd.crt
- 119 SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
#前面数字代表的是行号
2、将申请的证书复制给CA
- [root@rs1 ssl]# scp httpd.csr 172.16.9.1:/tmp
CA签署证书并将证书颁发给RS
- [root@www tmp]# openssl ca -in httpd.csr -out httpd.crt
- [root@www tmp]# scp httpd.csr httpd.crt 172.16.9.3:/etc/httpd/ssl/
证书只需要一个,将该证书复制给RS2即可(这里不做演示)
重启httpd服务
三种服务开启后,下面演示持久连接的效果:
PCC:
在Director上定义集群服务:
- [root@www ~]# ipvsadm -C
- [root@www ~]# ipvsadm -A -t 172.16.66.1:0 -s rr -p
- [root@www ~]# ipvsadm -a -t 172.16.66.1:0 -r 172.16.9.2 -g
- [root@www ~]# ipvsadm -a -t 172.16.66.1:0 -r 172.16.9.3 -g
访问三种服务,都会被定向到同一服务器上,刷新也不会改变的;



PPC只需在DR的基础上定义长连接的超时时间即可,这里就不再演示了
PFWM:
先定义iptables规则,为将要绑定的服务所请求的数据包打上同一种标记;
- [root@www ~]# iptables -t mangle -A PREROUTING -d 172.16.66.1 -p tcp --dport 80 -j MARK --set-mark 5
- [root@www ~]# iptables -t mangle -A PREROUTING -d 172.16.66.1 -p tcp --dport 443 -j MARK --set-mark 5
为3种服务分别定义集群服务
- [root@www ~]# ipvsadm -A -f 5 -s rr -p
- [root@www ~]# ipvsadm -a -f 5 -r 172.16.9.2 -g
- [root@www ~]# ipvsadm -a -f 5 -r 172.16.9.3 -g
- [root@www ~]# ipvsadm -A -t 172.16.66.1:22 -s rr -p
- [root@www ~]# ipvsadm -a -t 172.16.66.1:22 -r 172.16.9.2 -g
- [root@www ~]# ipvsadm -a -t 172.16.66.1:22 -r 172.16.9.3 -g
说明:将web和基于ssl的web服务定义到一起,只让一台服务器为二者提供服务,ssh服务还是按照轮询的方式进行
分别访问3种服务,查看其效果即可……