LVS基本使用

距离上一次博客文章有快一个季度了…看来我真懒,哦不主要原因是网站页面更新、更换主机、工作和学习上的原因所以没时间写博客不过从这一期开始又恢复正常啦!


首先在讨论lvs是什么东西之前还是谈谈关于当计算性能遇到瓶颈的时候应该怎么办?其实在计算能力遭遇瓶颈时,有两种解决方案:①向上扩展,顾名思义就是相当于给服务器更换零件,比如增加内存、买上新的cpu…或者不差钱的更换更好的服务器。②向外扩展,意思就是一台主机遇到瓶颈时再多添加一台主机加入工作。下面看看哪个划算:

首先就是向上扩展,向上扩展在初期还是非常划算的,但是当你到一定程度时,比如内存加满了、CPU价格上升到一定比例每提升一个内核就等增加好几倍的价格时那么向外扩展的优势就体现了!所以为啥在企业环境中特别依赖集群。不过集群只是一个笼统的概念,集群也是有分类的。

关于集群的分类:
① LB:负载均衡的集群,Load Balance

负载均衡当然就是让所有集群同时工作,这样能够分摊主机性能的一种集群。

②HA:高可用集群,High Availability

高可用当然就是让一个服务通过多台主机做备份,当一个主机宕机了以后通过仲裁选择其他主机进行顶替的一种集群。关于高可用性公式: 可用性=无故障时间*(所有故障时间+修复时间)

③HP:高性能集群,High Performance

高性能集群就是将多台主机中的计算能力结合起来,运算同一个任务。这与LB集群不同,LB主机的计算能力是不能进行集中运算是将多个小任务指派到不同主机进行集群工作。

什么是LVS?
lvs是由淘宝叫章文嵩博士发明,全名叫做linux virtual server。工作在网络模型的第四层,现早已被收入进内核,LVS根据请求报文的目标IP和PORT将其转发至后端主机集群中的某一台主机(这个需要更具挑选算法)工作流程属于比较简单的LB集群,LVS全部都是在内核中进行工作无需走向用户空间,所以完成10000并发连接简直就是小菜一碟。

LVS的组成部分:
一共有两个部分组成定义集群:ipvsadm/ipvs(IP虚拟服务)
①ipvsadm:类似于shell与ipvs通过命令进行交互。
②ipvs:工作内核中netfilter INPUT上

lvs支持TCP UDP AH EST AH-EST SCTP等诸多协议。

当然LVS还是并不只是单纯的通过请求的IP和PORT进行转发,其实还有分有很多类型。

关于LVS的转发类型:
①lvs-nat模型:多目标的DNAT(类似iptables)的地址伪装,它通过修改报文的目标IP地址(同时可能会修改目标端口)至挑选出某RS(real server)和RIP(real server ip)地址完成转发。请求过程:

client请求内容到VIP(virtual ip) -> VIP将请求的内容进行查看并确认端口不通过用户空间直接给DIP(director ip) -> DIP接到请求之后根据算法交给给予后端的real server -> RIP接受到请求以后通过调度器再交给client(图片由于怕画乱所以就没多画)。

②lvs-dr模型:dr全称;direct routing:它通过请求报文的目标MAC地址进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。请求过程:

client请求服务的公网地址到route -> route将报文通过switch交给VIP -> director通过MAC地址挑选RIP的local来进行转发,这样就保证请求和回去的地址不变 -> real server最后将请求交给switch并且给route最后交给client。

③lvs-tun模型:顾名思义就是lvs的tunnel反代时不修改请求报文的IP首部,而是通过在原有的IP首部(CIP<–>VIP)之外再封装一个IP首部(DIP<–>RIP),一般用于real server与调度器不在一个机房。请求过程:

client请求报文到达VIP -> VIP收到报文后直接交给DIP ->DIP收到后并没有改变原有地址反而只是在IP首部再封装一个地址发送给RIP -> RIP收到之后拆去原有报文并且将内容放入之后再放回公网中传递给client。

④lvs-fullnat模型:类似于lvs-tun在director通过同时修改请求报文的目标地址和源地址进行转发!请求过程:

client发起请求给VIP -> VIP收到请求之后分析端口等交给DIP -> DIP修改请求报文通过公网传递给RIP -> RIP收到请求后给DIP响应 -> DIP收到响应报文后再交给VIP -> VIP通过请求分析辨别client之后再回传。

说完了四种模型,哦不!其实只有三种模型,第四种模型lvs-fullnat是淘宝开发的并没有收入近内核,所以想要使用第四种模型得编译内核模块,第四种模型其实算是比较理想的,结合了nat和tun两种模式。然后说说关于调度算法:

关于本文使用的调度算法:

这里我就介绍关于静态调度算法的其中两个,动态算法就介绍一个。其余的可以在http://www.linuxvirtualserver.org/zh/lvs4.html 中查看。

静态算法:

RR:round robin轮调方法;轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。缺点:是不考虑每台服务器的处理能力。

WRR:weighted rr 加全的轮调;由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。

动态算法:

LC:least connection 最小连接数,哪一台主机连接较少的用户就给哪台服务器但此算法忽略了服务器的性能问题,有的服务器性能好,有的服务器性能差。公式:

overhead=active*256=incative (挑选最小值)

其实关于动态和静态算法的区别就是:一个追求开始平衡,还有一个追求结果平衡!可惜的是使用任何算法都有相对不平衡之处所以只有最合适的没有最好的!

使用ipvsadm配置lvs-nat模型:

配置模型:

上面写好了“外网”vip:172.16.1.10以及内网:192.168.1.0网段。首先我们给directory调度器做准备:

[root@localhost ~] cd /etc/sysconfig/network-scripts/ #首先在虚拟机加入网卡后定义配置文件
[root@localhost network-scripts] vi ifcfg-enp0s8 #配置一块新网卡
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
NAME="enp0s8"
UUID="739b26ef-9196-4165-938a-63af1b154a0b"
DEVICE="enp0s8"
ONBOOT="yes"
IPADDR="192.168.1.10"
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="223.6.6.6"
[root@localhost network-scripts] systemctl restart network #重启网络服务
[root@localhost ~] ip addr show
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
 valid_lft forever preferred_lft forever
 inet6 ::1/128 scope host
 valid_lft forever preferred_lft forever
2: enp0s3: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether 08:00:27:ac:9d:0e brd ff:ff:ff:ff:ff:ff
 inet 172.16.1.9/24 brd 172.16.1.255 scope global dynamic enp0s3
 valid_lft 1184sec preferred_lft 1184sec
 inet 172.16.1.10/24 brd 172.16.1.255 scope global secondary enp0s3
 valid_lft forever preferred_lft forever
 inet6 fe80::a00:27ff:feac:9d0e/64 scope link
 valid_lft forever preferred_lft forever
3: enp0s8: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether 08:00:27:b6:b0:29 brd ff:ff:ff:ff:ff:ff
 inet 192.168.1.10/24 brd 192.168.1.255 scope global enp0s8
 valid_lft forever preferred_lft forever
 inet6 fe80::a00:27ff:feb6:b029/64 scope link
 valid_lft forever preferred_lft forever
#咋会多出一个地址...估计是dhcp多分配的?好了先把他删了!
[root@localhost ~] ip addr del 172.16.1.9/24 dev enp0s3 #删除172.16.1.9
[root@localhost ~] ip addr show
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
 valid_lft forever preferred_lft forever
 inet6 ::1/128 scope host
 valid_lft forever preferred_lft forever
2: enp0s3: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether 08:00:27:ac:9d:0e brd ff:ff:ff:ff:ff:ff
 inet 172.16.1.10/24 brd 172.16.1.255 scope global enp0s3
 valid_lft forever preferred_lft forever
 inet6 fe80::a00:27ff:feac:9d0e/64 scope link
 valid_lft forever preferred_lft forever
3: enp0s8: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether 08:00:27:b6:b0:29 brd ff:ff:ff:ff:ff:ff
 inet 192.168.1.10/24 brd 192.168.1.255 scope global enp0s8
 valid_lft forever preferred_lft forever
 inet6 fe80::a00:27ff:feb6:b029/64 scope link
 valid_lft forever preferred_lft forever
[root@localhost ~] vi /etc/sysctl.conf #现在配置ipv4网卡之间转发数据
net.ipv4.ip_forward=1 #加入这句话
[root@localhost ~]# sysctl -p #启用配置文件
net.ipv4.ip_forward = 1

随后对两个real server配置httpd服务并且放上网页文件:

[root@localhost ~] vi /etc/sysconfig/network-scripts/ifcfg-eth0 #修改网络配置文件
DEVICE=eth0
HWADDR=08:00:27:48:78:91
TYPE=Ethernet
UUID=4d0aab16-d51c-4138-81c0-65f7106890db
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.11
NETMASK=255.255.255.0
GATEWAY=192.168.1.10 #注意网关配置在DIP不要配置真实网关!
DNS1=223.6.6.6
[root@localhost ~] yum install -y httpd #这我就不说啥意思了吧?
[root@localhost ~] vi /var/www/html/index.html #创建一个网页文件作为访问
welcome to 192.168.1.11 real-server 1
[root@localhost ~] service httpd start #启动服务
#192.168.1.12配置相同这里就不叙述了。

接下来我们接着进入directory进行配置:

[root@localhost ~] curl 192.168.1.11 #查看real server的httpd启动正常能获取网页
welcome to 192.168.1.11 real-server 1
[root@localhost ~] curl 192.168.1.12
welcome to 192.168.1.12 real-server 2
[root@localhost ~]# yum install -y ipvsadm 
#安装ipvsadm由于调度算法已经集成在内核中只需要安装与其交互的包即可
[root@localhost ~] ipvsadm -A -t 172.16.1.10:80 -s rr 
#增加一个调度器并且指明打开的端口!其中rr代表使用轮询算法
[root@localhost ~] ipvsadm -a -t 172.16.1.10:80 -r 192.168.1.11 -m
#增加在这个调度器中的real server -m表示使用nat的类型!
[root@localhost ~] ipvsadm -a -t 172.16.1.10:80 -r 192.168.1.12 -m
[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.1.10:80 rr
 -> 192.168.1.11:80 Masq 1 0 0
 -> 192.168.1.12:80 Masq 1 0 0

这样就算添加完毕了,现在我们打开一个游览器检验一下看看:

#直接在directory上面执行curl命令查看结果:
[root@localhost ~] curl 172.16.1.10:80
welcome to 192.168.1.12 real-server 2
[root@localhost ~] curl 172.16.1.10:80
welcome to 192.168.1.11 real-server 1
[root@localhost ~] curl 172.16.1.10:80
welcome to 192.168.1.12 real-server 2
[root@localhost ~] curl 172.16.1.10:80
welcome to 192.168.1.11 real-server 1
#你看这样就负载均衡了!

lvs-nat的模型就说到这里了,当然关于lvs-dr的模型还没说呢由于内容太长放到一期里面实在让人“亚历山大”。所以我把lvs-dr模型的配置&FWN(防火墙标记)&session保持放到下一次说。并且附上lvs的实用性!

Comments

Leave a Reply

Your email address will not be published. Name and email are required