LVS–DR模式的原理:
本次实验需要三个虚拟机以及物理机:
虚拟机名称 | 作用 | IP |
server1 | DS | 172.25.63.1 |
server2 | RS1 | 172.25.63.2 |
server3 | RS2 | 172.25.63.3 |
VIP为:172.25.63.100
测试服务:Http 端口:80
物理机为客户端
一、DR模式的实现
1. 配置DS
在server1上:
安装 ipvsadm
yum install ipvsadm -y
查看lvs编写的策略:
ipvsadm -l #若速度比较慢可以使用-ln选项
添加策略:
ipvsadm -A -t 172.25.63.100:80 -s rr #-t表示TCP协议的虚拟服务,-s指定策略为轮询
ipvsadm -a -t 172.25.63.100:80 -r 172.25.63.2:80 -g #添加RS指定并端口,-g表示为DR模式
ipvsadm -a -t 172.25.63.100:80 -r 172.25.63.3:80 -g #添加另外一台RS
添加后查看规则:
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.63.100:http rr
-> server2:http Route 1 0 0
-> server3:http Route 1 0 0
为DS添加VIP:
ip addr add 172.25.63.100/32 dev eth0 #子网掩码可以为32,也可以为24
ipvs命令的选项:
-A 添加一个虚拟服务,使用ip地址、端口号、协议来唯一定义一个虚拟服务
-E 编辑一个虚拟服务
-D 删除一个虚拟服务
-C 清空虚拟服务列表
-R 从标准输入中还原虚拟服务列表
-S 保存虚拟服务规则至标准输出,输出规则可使用-R选项还原
-L 显示虚拟服务列表
-Z 虚拟服务器列表计数器清零(清空当前连接数)
-a 添加一台真实服务器
-e 编辑一台真实服务器
-d 减少一台真实服务器
-t 使用TCP服务,该参数后需加主机与端口信息
-u 使用UDP服务,该参数后需加主机与端口信息
-s 指定lvs的调度算法
-r 设置真实服务器IP与端口
-g 设置lvs工作模式为DR直连路由
-i 设置lvs工作模式为TUN隧道
-m 设置lvs工作模式为NAT地址转换模式
-w 指定真实服务器权重
-c 连接状态,配和-L使用
-n 数字格式显示
–stats 显示统计信息
–rate 显示速率信息
–sort 对虚拟服务器和真实服务器排序输出
–set tcp tcpfin udp
设置ipvs连接超时值,三个参数分别代表tcp会话超时时间、收到FIN包后tcp会话超时时间、udp超时时间
–timeout 显示tcp tcpfin udp的timeout值
–start-daemon
启动同步守护进程
–stop-daemon
停止同步守护进程
2.配置RS
server2和server3上:
添加VIP:
ip addr add 172.25.63.100/32 dev eth0 #子网掩码可以为32,也可以为24
为 server2 配置apache服务:
[root@server2 html]# yum install -y httpd
[root@server2 html]# cd /var/www/html/
[root@server2 html]# vim index.html
[root@server2 html]# cat index.html
server2
[root@server2 html]# systemctl start httpd
为 server3 配置apache服务:
[root@server2 html]# yum install -y httpd
[root@server2 html]# cd /var/www/html/
[root@server2 html]# vim index.html
[root@server2 html]# cat index.html
server3
[root@server2 html]# systemctl start httpd
3.为RS配置arptables
首先需要先了解APR协议:ARP协议详解(),由于server 1 2 3均有VIP,由ARP协议可知,apr请求将会在局域网内广播, 此配置arptables的作用是当客户端访问VIP时,让其访问DS而不是RS
也可通过修改内核参数实现,此处使用arptables
在server2 上:
yum install -y arptables-0.0.4-8.el7.x86_64
arptables -nL #查看策略
arptables -A INPUT -d 172.25.63.100 -j DROP #添加策略,将目的地址为172.25.63.100的arp请求丢弃
arptables -A OUTPUT -s 172.25.63.100 -j mangle --mangle-ip-s 172.25.63.2 #将源ip为VIP的arp响应的源IP改成RS的IP
策略配置完成查看策略:
[root@server2 html]# arptables -nL
Chain INPUT (policy ACCEPT)
-j DROP -d 172.25.63.100
Chain OUTPUT (policy ACCEPT)
-j mangle -s 172.25.63.100 --mangle-ip-s 172.25.63.2
Chain FORWARD (policy ACCEPT)
在server3 上做同样的操作:
yum install -y arptables-0.0.4-8.el7.x86_64
arptables -nL #查看策略
arptables -A INPUT -d 172.25.63.100 -j DROP #添加策略,将目的地址为172.25.63.100的arp请求丢弃
arptables -A OUTPUT -s 172.25.63.100 -j mangle --mangle-ip-s 172.25.63.3 #将源ip为VIP的arp响应的源IP改成RS的IP
4.测试
在客户端(物理机)上:
[kiosk@foundation63 ~]$ curl 172.25.63.100
server2
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3
[kiosk@foundation63 ~]$ curl 172.25.63.100
server2
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3
[kiosk@foundation63 ~]$ curl 172.25.63.100
server2
轮询策略成功实现
在DS上查看轮询次数:
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP server1:http rr
-> server2:http Route 1 0 2
-> server3:http Route 1 0 2
二、结合ldirectord实现RS高可用
一中DR模式实现后,当server2宕掉时,再进行测试:
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3
[kiosk@foundation63 ~]$ curl 172.25.63.100
curl: (7) Failed connect to 172.25.63.100:80; Connection refused
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3
[kiosk@foundation63 ~]$ curl 172.25.63.100
curl: (7) Failed connect to 172.25.63.100:80; Connection refused
以上说明调度器(DS)不会对后端的RS进行检查,要想实现次功能,可以结合ldirectord实现
1.安装ldirectord
在server1 上:
此步需要高可用的yum源:
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# cat westos.repo
[rhel7.3]
name=rhel7.3
baseurl=http://172.25.63.250/iso
gpgcheck=0
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.63.250/iso/addons/HighAvailability #高可用yum源
gpgcheck=0
[root@server1 yum.repos.d]# yum clean all
[root@server1 yum.repos.d]# yum repolist
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
repo id repo name status
!HighAvailability HighAvailability 37
!rhel7.3 rhel7.3 4,751
repolist: 4,788
安装及配置:
yum install ldirectord-3.9.5-3.1.x86_64.rpm -y
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
cd /etc/ha.d/
ls
vim ldirectord.cf
12 checktimeout=3 #ldirectord等待健康检查执行完毕的等待时间,单位秒。如果因为某些原因检查失败或在设置的时间周期内没有完成检查,ldirectord将会从IPVS表中移除真实服务器
13 checkinterval=1 #ldirectord在两个检查之间的间隔时间
16 autoreload=yes #如果启用这个选项,它使ldirectord按时计算这个配置文件的md5校验和值,看其是否有改动,当发现有改动时自动应用那些改动,这个方便的 特性运行你容易地改变集群的配置,你对配置文件改动后几秒,ldirectord将察觉到有改动,调用ipvsadm命令实现改动,从有效服务器池中移除 真实服务器或按需要将它们添加到池中
22 quiescent=no #当一个节点在checktimeout设置的时间周期内没有响应时它是“静止的”(它的权重为0),当你设置了这个选项后,ldirectord将 会从IPVS表中移除真实服务器而不是“停止”它,从IPVS表移除节点将中断现有的客户端连接,并使LVS丢掉所有的连接跟踪记录和持续连接模板,如果 你不将这个选项设置为no,当某个节点崩溃时,对某些客户端计算机而言可能会显示为集群关闭了,因为在这个节点崩溃前这些客户端计算机被分配给它了,而连 接跟踪记录和程序连接模板仍然保留在Director上。
24 # Sample for an http virtual service
25 virtual=172.25.63.100:80 #指定我们想要在Director Server 上设置的VIP地址和端口号
26 real=172.25.63.2:80 gate #RS的ip及端口
27 real=172.25.63.3:80 gate #RS的ip及端口
28 fallback=127.0.0.1:80 gate #若后端两个RS崩溃,则由自身顶替
29 service=http #使用服务
30 scheduler=rr #负载均衡规则
31 #persistent=600
32 #netmask=255.255.255.255
33 protocol=tcp #TCP协议
34 checktype=negotiate #监测规则
35 checkport=80 #监测端口
36 request="index.html"
37 #receive="Test Page" #需要注释掉
38 #virtualhost=www.x.y.z #需要注释调
3.清空之前的策略
在server1 :
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP server1:http rr
-> server2:http Route 1 0 0
-> server3:http Route 1 0 0
[root@server1 ha.d]# ipvsadm -C
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
4.启动服务
在server1:
systemctl start ldirectord
查看策略:
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP server1:http rr
-> server2:http Route 1 0 0
-> server3:http Route 1 0 0
5.测试
在客户端:
正常情况下:
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3
[kiosk@foundation63 ~]$ curl 172.25.63.100
server2
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3
[kiosk@foundation63 ~]$ curl 172.25.63.100
server2
当停止server2 的http服务时:
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3
[kiosk@foundation63 ~]$ curl 172.25.63.100
server2
[kiosk@foundation63 ~]$ curl 172.25.63.100 #此时停止server2 http 后面全是server3提供服务
server3
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3
再次启用server2 http服务后:
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3
[kiosk@foundation63 ~]$ curl 172.25.63.100 #启动server2 http服务后就能够马上轮询
server2
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3
[kiosk@foundation63 ~]$ curl 172.25.63.100
server2
[kiosk@foundation63 ~]$ curl 172.25.63.100
server3