LVS:Linux Virtual Server,负载调度器,集成内核
官网:http://www.linuxvirtualserver.org/
工作原理:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度 算法来挑选RS
CIP:Client IP (客户端的IP)
VIP: Virtual serve IP VS外网的IP (调度器连接外网的地址)
DIP: Director IP VS内网的IP (调度器连接内网的地址)
RIP: Real server IP (真实服务器的IP)
访问流程:CIP <–> VIP == DIP <–> RIP
lvs集群的类型
lvs-nat:修改请求报文的目标IP ,多目标IP的DNAT
lvs-dr:操纵封装新的MAC地址
lvs-tun:在原请求IP报文之外新加一个IP首部
lvs-fullnat:修改请求报文的源和目标IP
lvs-nat模式
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑 出的RS的RIP和PORT实现转发
(1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由LVS服务器转发,LVS服务器易于成为系统瓶颈 (后端多台服务器都要经过LVS服务器来实现转发)
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统
NAT模式IP包调度过程 :
客户端访问的VIP地址应该是某一网络服务的地址例如:www.baidu.com 通过他们公司的调度器将VIP地址调度到baidu后台的真实提供服务的服务器主机的IP地址。(后台提供服务的主机由多台组成,各个IP地址是不相同的)
文字描述:由客户端发起请求连接某一个网络服务请求到——–>VIP地址:经过 LVS服务器的调度将VIP地址转换成真实提供服务的服务器主机IP地址——>RIP上去;RIP接收到请求后将响应数据包发送到LVS上的VIP地址上去;最后客户端访问的VIP地址给与回应数据包。
LVS-DR模式
LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新 封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出 的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
(1) LVS服务器和RS都配置有VIP
(2) 确保前端路由器将目标IP为VIP的请求报文发往LVS服务器:有以下三种方法。
A . 可以在前端网关做静态绑定VIP和LVS服务器的MAC地址
B .在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle –mangle-ip-s $RIP
(此种方法存在弊端:当LVS服务器宕机时,启用备用的LVS服务器时还需要将绑定的MAC地址修改到备用的LVS服务器上去)
C . 或者采用另一种方法在RS上修改内核参数以限制arp的广播和通告级别(让其不搭理也不回应别人的广播)
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
(3)RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络; RIP的网关不能指向DIP,以确保响应报文不会经由Director
(4)RS和LVS服务器要在同一个物理网络
(5)请求报文要经由LVS服务器,但响应报文不经由LVS服务器,而由RS直接发往 Client
(6)不支持端口映射(端口不能修败)
(7)RS可使用大多数OS系统
DR模式的调度过程:
文字描述过程:当客户端发起请求—–TCP/IP的三次握手———> 到达VIP的LVS服务器——>然后LVS服务器给调度到RS的服务器上去;然后回应就不经过LVS服务器上的VIP地址来回应了,因为每个RS服务器上都有一个VIP的地址,所以RS服务器就直接回应数据包到客户端了。此过程不替换源和目标的IP地址,而是通过修改MAC地址来实现转发调度的。
具体的MAC地址的转换: CIP MACCIP—->VIP MACROUTE1;CIP MACROUTE2—->VIP MACLVS;
此时到达LVS服务器了;经过LVS服务器的调度将原有的方向装换成:CIP MACLVS—–>VIP MACRS1
然后开始回应报文:VIP MACRS1—->CIP ROUTE2;变成VIP MACROUTE1—–>CIP MACCIP
ipvs scheduler (调度算法)
两种:静态方法和动态方法
静态方法:仅根据算法本身进行调度
1、RR:roundrobin,轮询 (后台的服务器轮流调度)
2、WRR:Weighted RR,加权轮询 (后台的服务器加比重轮流调度;如性能好的服务器占比重大)
3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一 个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
4、DH:Destination Hashing;目标地址哈希,将发往同一个目标地址的请求 始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡, 如:宽带运营商
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度
1、LC:least connections 适用于长连接应用 Overhead=activeconns*256+inactiveconns
(activeconns:活动的连接数 inactiveconns :不活动的连接数,就是用tcp/ip连接上去不做任何操作)
(用上述公式计算处现在后台那个服务器的负载小就自动调度到负载最小的那台服务器上去)
2、WLC:Weighted LC,默认调度方法 Overhead=(activeconns*256+inactiveconns)/weight
(在上一条的基础上加上权重值;可以更好的发挥各台服务器的性能)
3、SED:Shortest Expection Delay,初始连接高权重优先 Overhead=(activeconns+1)*256/weight
(在第一次连接时权重高的先连接,以后的连接按照WLC的方式来调度他的连接)
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现 正向代理
6、LBLCR:LBLC with Replication,带复制功能的LBLC 解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
ipvsadm包构成 (实现LVS的包应用)
程序包:ipvsadm
Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvsadm -D -t|u|f service-address 删除
ipvsadm –C 清空定义的所有规则
ipvsadm –R 重载
ipvsadm -S [-n] 保存
保存及重载规则 (由于重启后定义的规则会失效,所以需要保存 和重新载入)
保存:建议保存至/etc/sysconfig/ipvsadm (可以自定义文件的路径和名称)
ipvsadm -Sn > /etc/sysconfig/ipvsadm (添加n是为了防止名字解析)
systemctl stop ipvsadm.service
重载:
ipvsadm-restore < /etc/sysconfig/ipvsadm (重新导入规则)
ipvsadm -R < /etc/sysconfig/ipvsadm
systemctl restart ipvsadm.service
如果导出的规则导出到/etc/sysconfig/ipvsadm 路径下系统开机启动默认导入此文件下的规则。
ipvsadm后面跟的选项参数:
service-address (LVS服务器的地址)
-t: TCP协议的端口,VIP:TCP_PORT
-u: UDP协议的端口,VIP:UDP_PORT
-f:firewall MARK,标记,一个数字
指定集群的调度算法,默认为wlc
-s :(上面的十种调度算法)
lvs类型:
-g: gateway, dr类型,不用写默认使用的的类型
-i: ipip, tun类型
-m: masquerade, nat类型
权重 数
-w
实验:lvs-nat模式的实现
实验结构拓扑图:(以下两个网段都应是公网的地址)
1 .在LVS服务器上:(iptables 和selinux 确定关上)
yum install ipvsadm (安装LVS服务的包)
配置VIP和DIP两块网卡:无需添加网关 (按照结构拓扑图)
启用ip_forward功能:
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p (让其生效)
配置调度规则:
ipvsadm -A -t 172.20.0.200:80 -s rr (rr:使用轮询调度;172.20.0.200为VIP的地址)
ipvsadm -a -t 172.20.0.200:80 -r 192.168.60.21 -m (-r 192.168.60.21: 此为RIP -m :为nat的类型 )
ipvsadm -a -t 172.20.0.200:80 -r 192.168.60.22 -m (-r 192.168.60.22 ;此为RIP;-m为nat的类型)
ipvsadm -Ln (查看定义的规则)
2 .在两台http服务器上安装http服务并配置网卡信息
在第一台http服务器上:
yum install httpd -y (安装包)
systemctl start httpd (启动服务)
echo “RS1” > /var/www/html/index.html (建立访问的主页面)
配置网卡信息:(按照拓扑图来配置)
DEVICE=ens33
IPADDR=192.168.60.21
PREFIX=24
GATEWAY=192.168.60.200
systemctl restart network (重启网络服务)
在第二台服务器上:
yum install httpd -y (安装包)
systemctl start httpd (启动服务)
echo “RS2” > /var/www/html/index.html (建立访问的主页面)
配置网卡信息:
DEVICE=ens33
IPADDR=192.168.60.22
PREFIX=24
GATEWAY=192.168.60.200
systemctl restart network (重启网络服务)
route -n (查看路由列表,确保每个http服务器都只有一个网关,如果多的话会找不到地址)
3 . 在客户端开始访问VIP的地址:
curl 172.20.0.200 (现在测试应该是轮询调度的)
在上述实验中再加一台路由器:(网络结构拓扑图如下)
然后新添加的路由器要添加一个路由:route add default gw 192.168.0.200
启用ip_forward功能:(新加的路由器) (在centos7上)
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p (让其生效)
vim/etc/sysctl.conf (在centos6上改为1 就可以了
还可以更改端口:(nat模式下支持端口映射)
将192.168.60.21服务器的http服务端口改成8080
之后要将LVS服务器的调度的端口修改一下:
先删除:ipvsadm -d -t 172.20.0.200 -r 192.168.60.21
在从新添加:ipvsadm -a -t 172.20.0.200 -r 192.168.60.21:8080 -m
ipvsadm -Ln (查看定义的规则有没有添加上去)
添加权重:
ipvsadm -E -t 172.20.0.200:80 -s wrr (-E修改定义算法;-A是添加)
先删除一个:ipvsadm -d -t 172.20.0.200 -r 192.168.60.21
重新添加在加上权重:ipvsadm -a -t 172.20.0.200:80 -r 192.168.60.21 -m -w 3 (-w后面如果不写数字默认就是为1)
实验:LVS-DR模式 的实现 (此种模式下不能映射端口所以端口号是无法修改的)
在内核层面限制多个VIP地址的相互冲突:
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1: 仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告
实验结构拓扑图:(实现单网络的DR的LVS)此阶段使用的网络都是公网的地址
1 .首先后台的real server服务器的配置:(两台real server 都只留一个网卡)
RS1:
yum install httpd -y (安装包)
systemctl start httpd (启动服务)
echo “RS1” > /var/www/html/index.html (建立访问的主页面)
配置网卡信息:(按照拓扑图来配置)
DEVICE=ens33
IPADDR=192.168.60.21
PREFIX=24
GATEWAY=192.168.60.200
systemctl restart network (重启网络服务)
修改内核配置来防止VIP地址的相互冲突:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce (临时修改)
将VIP地址绑定到本机的回环网卡上:(可以不用添加新的网卡)
ip a a 192.168.60.20/32 dev lo 此种只是临时绑定重启服务就会失效的
RS2:
yum install httpd -y (安装包)
systemctl start httpd (启动服务)
echo “RS2” > /var/www/html/index.html (建立访问的主页面)
配置网卡信息:(按照拓扑图来配置)
DEVICE=ens33
IPADDR=192.168.60.22
PREFIX=24
GATEWAY=192.168.60.200
systemctl restart network (重启网络服务)
修改内核配置来防止VIP地址的相互冲突:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
将VIP地址绑定到本机的回环网卡上:(可以不用添加新的网卡)
ip a a 192.168.60.20/32 dev lo 此种只是临时绑定重启服务就会失效的
2 . 配置路由虚拟主机的网卡:
启动路由功能:
启用ip_forward功能:(新加的路由器) (在centos7上)
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p (让其生效)
vim/etc/sysctl.conf (在centos6上改为1 就可以了
3 . 配置LVS服务器的网卡配置:(VIP和DIP)
首先配置DIP的网卡地址和网关:
ip a a 192.168.60.20/24 ens33:1(将VIP绑定到DIP的网卡上;此种只是临时绑定重启服务就会失效的)
yum install ipvsadm (安装工具包)
ipvsadm -A -t 192.168.60.20:80 -s rr(定义规则;此IP地址为VIP的地址)
(添加后台服务的主机)
ipvsadm -a -t 192.168.60.20:80 -r 192.168.60.21 (-g不写默认是DR模式)
ipvsadm -a -t 192.168.60.20:80 -r 192.168.60.22
4 . 配置客户端的访问:(只配置一个172.20网段的一个网卡就行)要添加GATEWAY
配完网络后从客户端:ping 后台的两个服务器的IP地址应该是可以ping通的
curl 192.168.60.6 (测试调度是否成功)
实验:实现跨网络的DR的LVS(VIP与DIP/RIP不在同一网络 )
实验结构拓扑图:(此网络中10.0.0.100为VIP使用的一个公网的地址;然后LVS和RS1;RS2使用的都是私网地址来联通;同时都绑定公网的VIP 这样做可以节省公网地址。)
配置real server服务器的网卡及http服务:
1 .首先后台的real server服务器的配置:(两台real server 都只留一个网卡)
RS1:
yum install httpd -y (安装包)
systemctl start httpd (启动服务)
echo “RS1” > /var/www/html/index.html (建立访问的主页面)
配置网卡信息:(按照拓扑图来配置)
DEVICE=ens33
IPADDR=192.168.60.21
PREFIX=24
GATEWAY=192.168.60.20
systemctl restart network (重启网络服务)
修改内核配置来防止VIP地址的相互冲突:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce (临时修改)
将VIP地址绑定到本机的回环网卡上:(可以不用添加新的网卡)
ip a a 10.0.0.100/32 dev lo
RS2:
yum install httpd -y (安装包)
systemctl start httpd (启动服务)
echo “RS2” > /var/www/html/index.html (建立访问的主页面)
配置网卡信息:(按照拓扑图来配置)
DEVICE=ens33
IPADDR=192.168.60.22
PREFIX=24
GATEWAY=192.168.60.20
systemctl restart network (重启网络服务)
修改内核配置来防止VIP地址的相互冲突:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
将VIP地址绑定到本机的回环网卡上:(可以不用添加新的网卡)
ip a a 10.0.0.100/32 dev lo
2 . 配置路由虚拟主机的网卡:
先配置192.168.60.20 和172.20.49.200/16的IP地址
ip a add 10.0.0.200 /8 dev eth0 (将此IP和192.168.60.20绑在同一块网卡上)
启动路由功能:
启用ip_forward功能:(新加的路由器) (在centos7上)
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p (让其生效)
vim/etc/sysctl.conf (在centos6上改为1 就可以了
3 . 配置LVS服务器的网卡配置:(VIP和DIP)
首先配置DIP的网卡地址和网关:
ip a a 10.0.0.100/8 dev ens33:1(将VIP绑定到DIP的网卡上)
yum install ipvsadm (安装工具包)
ipvsadm -A -t 10.0.0.100:80 -s rr(定义规则;此IP地址为VIP的地址)
(添加后台服务的主机)
ipvsadm -a -t 10.0.0.100:80 -r 192.168.60.21 (-g不写默认是DR模式)
ipvsadm -a -t 10.0.0.100:80 -r 192.168.60.22
4 . 配置客户端的访问:(只配置一个172.20网段的一个网卡就行)要添加GATEWAY
配完网络后从客户端:ping 后台的两个服务器的IP地址应该是可以ping通的
curl 10.0.0.100 (测试调度是否成功)
实验LVS高可用的实现 (对后端服务器做健康检查)
当后台有某一个服务器宕机时,LVS将不在将客户端的访问数据包发向宕机的主机了。
ldirectord
ldirectord:监控和控制LVS守护进程,可管理LVS规则
包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
/etc/ha.d/ldirectord.cf 主配置文件
/usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版
/usr/lib/systemd/system/ldirectord.service 服务
/usr/sbin/ldirectord 主程序
/var/log/ldirectord.log 日志
/var/run/ldirectord.ldirectord.pid pid文件
安装包:实现LVS的高可用(在上述实验的基础上添加此服务可实现高可用性)
yum install ldirectord-3.9.6-0rc1.1.1.x86_64.rpm (安装包)
cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/(将配置文件复制一份出来)
vim /etc/ha.d/ldirectord.cf (修改配置文件)(需要将以前在ipvsadm里的规则都清空:ipvsadm -C)
修改过后的:
systemctl start ldirectord.service (启动此服务)
查看ipvsadm -Ln 发现已经自动生成定义的规则了。
在LVS服务器主机上安装http服务然后将主页面定义为sorry server
当所有后台主机都宕机是客户端在访问就会显示出sorry server的提示字样
echo “sorry server” > /var/www/html/index.html
此时如果将后台的两台http服务器都停止服务:systemctl stop httpd
就会显是LVS服务器本机提供的http服务提供sorry server
如果要加上dns解析的话:dns主机用外网IP172.20.81.11 然后加上路由器的网关让其连到此网络中
gateway=172.20.49.200 (就可以可)
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/102054