LVS服务原理以及搭建(理论+干货)

阅读:548 2019-03-19 14:44:07 来源:新网

一、lvs简介

lvs是linuxvirtualserver的简写,意即linux虚拟服务器,是一个虚拟的服务器集群系统,目的在于使用集群技术和linux操作系统实现一个高性能、高可用的服务器。它具有良好的可靠性,可拓展性和可操作性。从而以低廉的成本实现最优的性能。

二、lvs的体系架构

使用lvs架设的服务器集群系统有三个部分组成:最前端的负载均衡层(loaderbalancer),中间的服务器群组层,用serverarray表示,最底层的数据共享存储层,用sharedstorage表示。在用户看来所有的应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。

lvs的各个层次的详细介绍:

loadbalancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(directorserver)组成,lvs模块就安装在directorserver上,而director的主要作用类似于一个路由器,它含有完成lvs功能所设定的路由表,通过这些路由表把用户的请求分发给serverarray层的应用服务器(realserver)上。同时,在directorserver上还要安装对realserver服务的监控模块ldirectord,此模块用于监测各个realserver服务的健康状况。在realserver不可用时把它从lvs路由表中剔除,恢复时重新加入。

serverarray层:由一组实际运行应用服务的机器组成,realserver可以是web服务器、mail服务器、ftp服务器、dns服务器、视频服务器中的一个或者多个,每个realserver之间通过高速的lan或分布在各地的wan相连接。在实际的应用中,directorserver也可以同时兼任realserver的角色。

sharedstorage层:是为所有realserver提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过nfs网络文件系统共享数据,但是nfs在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如redhat的gfs文件系统,oracle提供的ocfs2文件系统等。

从整个lvs结构可以看出,directorserver是整个lvs的核心,目前,用于directorserver的操作系统只能是linux和freebsd,linux2.6内核不用任何设置就可以支持lvs功能,而freebsd作为directorserver的应用还不是很多,性能也不是很好。对于realserver,几乎可以是所有的系统平台,linux、windows、solaris、aix、bsd系列都能很好的支持。

三、lvs模式

ip负载均衡技术:

负载均衡技术有很多实现方案,有基于dns域名轮流解析的方法、有基于客户端调度访问的方法、有基于应用层系统负载的调度方法,还有基于ip地址的调度方法,在这些负载调度算法中,执行效率最高的是ip负载均衡技术。

lvs的ip负载均衡技术是通过ipvs模块来实现的,ipvs是lvs集群系统的核心软件,它的主要作用是:安装在directorserver上,同时在directorserver上虚拟出一个ip地址,用户必须通过这个虚拟的ip地址访问服务。这个虚拟ip一般称为lvs的vip,即virtualip。访问的请求首先经过vip到达负载调度器,然后由负载调度器从realserver列表中选取一个服务节点响应用户的请求。

当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的realserver节点,而realserver节点如何返回数据给用户,是ipvs实现的重点技术,ipvs实现负载均衡机制有三种,分别是nat、tun和dr,详述如下:

vs/nat:即(virtualservervianetworkaddresstranslation)

也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟ip地址)改写成选定的realserver地址,同时报文的目标端口也改成选定的realserver的相应端口,最后将报文请求发送到选定的realserver。在服务器端得到数据后,realserver返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟ip地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。可以看出,在nat方式下,用户请求和响应报文都必须经过directorserver地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈。

vs/tun:即(virtualserverviaiptunneling)

也就是ip隧道技术实现虚拟服务器。它的连接调度和管理与vs/nat方式一样,只是它的报文转发方法不同,vs/tun方式中,调度器采用ip隧道技术将用户请求转发到某个realserver,而这个realserver将直接响应用户的请求,不再经过前端调度器,此外,对realserver的地域位置没有要求,可以和directorserver位于同一个网段,也可以是独立的一个网络。因此,在tun方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。

vs/dr:即(virtualserverviadirectrouting)

也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与vs/nat和vs/tun中的一样,但它的报文转发方法又有不同,vs/dr通过改写请求报文的mac地址,将请求发送到realserver,而realserver将响应直接返回给客户,免去了vs/tun中的ip隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求directorserver与realserver都有一块网卡连在同一物理网段上。

四、lvs调度算法(算法原理查看:http://www.linuxvirtualserver.org/zh/lvs4.html)

lvs的调度算法决定了如何在集群节点之间分布工作负荷。当director调度器收到来自客户端访问vip的上的集群服务的入站请求时,director调度器必须决定哪个集群节点应该处理请求。director调度器用的调度方法基本分为两类:

固定调度算法:rr,wrr,dh,sh

动态调度算法:wlc,lc,lblc,lblcr

lvs调度算法的生产环境选型:

1、一般的网络服务,如http,mail,mysql等常用的lvs调度算法为:

a.基本轮询调度rr

b.加权最小连接调度wlc

c.加权轮询调度wrc

2、基于局部性的最小连接lblc和带复制的给予局部性最小连接lblcr主要适用于webcache和dbcache

3、源地址散列调度sh和目标地址散列调度dh可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一。

实际适用中这些算法的适用范围很多,工作中最好参考内核中的连接调度算法的实现原理,然后根据具体的业务需求合理的选型。

五、实际搭建

术语vip:虚拟服务器地址

dip:转发的网络地址

–1,和rip通信:arp协议,获取realserver的rip:mac地址

–2,转发client的数据包到rip上(隐藏的vip)

rip:后端真实主机(后端服务器)

cip:客户端ip地址

vip:虚拟主机ip

lvs/dr(尚学堂周老师的ppt比较详细,我吧细节再屡一下):

1、准备3台虚拟机,使eth0在同一个网段上,使dip和rip在统一网段

2、配置lvs的vip

ifconfigeth0:0192.168.249.100/24

(24代表该ip的子网掩码为255.255.255.0)

3、调整rs的响应。通告级别(每一台rs都配)

echo1>/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho2>/proc/sys/net/ipv4/conf/eth0/arp_announceecho1>/proc/sys/net/ipv4/conf/all/arp_ignoreecho2>/proc/sys/net/ipv4/conf/all/arp_announce

4、配置rs的vip(每一台rs都配)

ifconfiglo:8192.168.249.100netmask255.255.255.255

5、启动rs上的httpd

yum-yinstallhttpd

在httpd服务的默认路径/var/www/html/下新建一个入口访问页

测试两台rs能否访问

6、lvs——ipvsadm

yum-yinstallipvsadmipvsadm-a-t192.168.249.100:80-srripvsadm-a-t192.168.249.100:80-r192.168.249.120-g-w1(-w表示设置权重)ipvsadm-a-t192.168.249.100:80-r192.168.249.130-g-w1

ipvsadm–ln显示内核服务器列表

浏览器刷新:访问vip

ipvsadm-lnc显示lvs的连接详情

到这里基本的服务已经配置完了

注意:这套配置中,vip、通告级别、以及httpd在服务器重启后,都需要重新设置

当然也可以设置httpd为开机启动:chkconfighttpdon

使vip永久生效用,设置子网卡:

vi/etc/sysconfig/network-scripts/ifcfg-lo:8device=lo:8ipaddr=192.168.249.100netmask=255.255.255.25

但是,重启之后必须手动重新设置通告级别,所以还是比较麻烦

7、因此编写如下启动配置脚本(分为lvsserver脚本和realserver脚本):

7.1、配置lvs的dr模式lvsserver脚本,如下:

#!/bin/bash#配置lvs的vip=192.168.249.100#(注意,lvsserver那台机器2个ip,一个是vip,一个是本身ip例如192.168.249.110)rip1=192.168.249.120rip2=192.168.249.130#ripn=192.168.249.nvport=80rport=80usage(){echo"usage:`basename$0`请输入:(start|stop|status)"exit1}if[$#-ne1];thenusageficase"${1}"instart)echo"startlvsofdirectorserver"echo1>/proc/sys/net/ipv4/ip_forward#表示允许数据包转发#setthevip配置lvs的vip/sbin/ifconfigeth0:0$vipbroadcast$vipnetmask255.255.255.255up/sbin/routeadd-host$vipdeveth0:0#clearipvstable清空ipvs规则/sbin/ipvsadm-c#addlvsvipandport/sbin/ipvsadm-a-t$vip:$vport-srr#addripandport/sbin/ipvsadm-a-t$vip:$vport-r$rip1:$rport-g-w1/sbin/ipvsadm-a-t$vip:$vport-r$rip2:$rport-g-w1/sbin/ipvsadm-l-necho"startsuccess!!!";;stop)echo"closelvsdirectorserver"/sbin/ipvsadm-c/sbin/ifconfigeth0:0downecho"closed!!!";;status)/sbin/ipvsadm-l-n;;*)usageesac

7.2、realserver脚本如下:(每台realserver都单独有自己的一个启动脚本,脚本内容一样)

#!/bin/bash#real_server配置脚本lvs的dr模式ripserver脚本vip=192.168.249.100#vip'sbroadcast虚拟服务器的广播地址broadcast=192.168.249.255usage(){echo"usage:`basename$0`请输入:(start|stop)"exit1}if[$#-ne1];thenusageficase$1instart)echo"reparingforrealserver"echo"1">/proc/sys/net/ipv4/conf/all/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/all/arp_announceecho"1">/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/eth0/arp_announce/sbin/ifconfiglo:8$vipnetmask255.255.255.255broadcast$broadcastup/sbin/routeadd-host$vipdevlo:8echo"startsuccess!!!";;stop)/sbin/ifconfiglo:8downecho"0">/proc/sys/net/ipv4/conf/all/arp_ignoreecho"0">/proc/sys/net/ipv4/conf/all/arp_announceecho"0">/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho"0">/proc/sys/net/ipv4/conf/eth0/arp_announceecho"stoprealserver";;*)usageesac

7.3开机自启动

如果觉得每次开机后还得执行脚本来启动服务配置,那么就可这直接将脚本设为开机启动,具体如下图

将要开机执行的脚本全路径写在/etc/rc.local文件末尾,下次开机启动的时候将会自动执行你添加的脚本。

***常用ipvsadm命令:

-a–add-service在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也

就是增加一台新的虚拟服务器。

-e–edit-service编辑内核虚拟服务器表中的一条虚拟服务器记录。

-d–delete-service删除内核虚拟服务器表中的一条虚拟服务器记录。

-c–clear清除内核虚拟服务器表中的所有记录。

-r–restore恢复虚拟服务器规则

-s–save保存虚拟服务器规则,输出为-r选项可读的格式

-a–add-server在内核虚拟服务器表的一条记录里添加一条新的真实服务器

记录。也就是在一个虚拟服务器中增加一台新的真实服务器

-e–edit-server编辑一条虚拟服务器记录中的某条真实服务器记录

-d–delete-server删除一条虚拟服务器记录中的某条真实服务器记录

-l|-l–list显示内核虚拟服务器表

-z–zero虚拟服务表计数器清零(清空当前的连接数量等)

–settcptcpfinudp设置连接超时值

–start-daemon启动同步守护进程。他后面可以是master或backup,用来说

明lvsrouter是master或是backup。在这个功能上也可以采用keepalived的

vrrp功能。

–stop-daemon停止同步守护进程

-h–help显示帮助信息

其他的选项:

-t–tcp-serviceservice-address说明虚拟服务器提供的是tcp的服务

[vip:port]or[real-server-ip:port]

-u–udp-serviceservice-address说明虚拟服务器提供的是udp的服务

[vip:port]or[real-server-ip:port]

-f–fwmark-servicefwmark说明是经过iptables标记过的服务类型。

-s–schedulerscheduler使用的调度算法,有这样几个选项

rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,

默认的调度算法是:wlc.

-p–persistent[timeout]持久稳固的服务。这个选项的意思是来自同一个客

户的多次请求,将被同一台真实的服务器处理。timeout的默认值为300秒。

-m–netmasknetmaskpersistentgranularitymask

-r–real-serverserver-address真实的服务器[real-server:port]

-g–gatewaying指定lvs的工作模式为直接路由模式(也是lvs默认的模式)

-i–ipip指定lvs的工作模式为隧道模式

-m–masquerading指定lvs的工作模式为nat模式

-w–weightweight真实服务器的权值

–mcast-interfaceinterface指定组播的同步接口

-c–connection显示lvs目前的连接如:ipvsadm-l-c

–timeout显示tcptcpfinudp的timeout值如:ipvsadm-l–timeout

–daemon显示同步守护进程状态

–stats显示统计信息

–rate显示速率信息

–sort对虚拟服务器和真实服务器排序输出

–numeric-n输出ip地址和端口的数字形式

六、上面提到开机启动脚本,下面顺便聊一下定时执行shell脚本

例如每分钟要执行一次test.sh脚本

crontab-l每个用户都有各自不同的计划任务列表,用各自的帐户登录后运行

crontab-e查看到各任务的计划任务情况,可以修改自己的计划任务

(*/1****为cron表达式,这个表示每分钟执行一次,具体的可以百度一下哦)

其中*/1****/user/script/test.sh(一定要绝对路径)

保存后,必须重新启动crond服务,不然不会生效

servicecrondrestar

我的脚本是:

echo"测试开机调用,现在时间:`date'+%y/%m/%d%h:%m:%s'`">>/user/script/log.txt

查看定时执行效果:

这样一个简单的定时任务就ok了

***crontab常用命令简绍

crontab-u//设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数。

crontab-l//列出某个用户cron服务的详细内容

crontab-r//删除没个用户的cron服务

crontab-e//编辑某个用户的cron服务

需要将crond设置为系统启动后自动启动的服务,可以在/etc/rc.d/rc.local中,在末尾加上servicecrondstart

基本用法:

crontab-l列出当前的crontab任务

crontab-d删除当前的crontab任务

crontab-e(solaris5.8上面是crontab-r)编辑一个crontab任务,ctrl_d结束

crontabfilename以filename做为crontab的任务列表文件并载入

crontabfile的格式:crontab文件中的行由6个字段组成,不同字段间用空格或tab键分隔。前5个字段指定命令要运行的时间分钟(0-59)小时(0-23)日期(1-31)月份(1-12)星期几(0-6,其中0代表星期日)

补充:在使用crontab的时候,要特别注意的是运行脚本中能够访问到的环境变量和当前测试环境中的环境变量未必一致,一个比较保险的做法是在运行的脚本程序中自行设置环境变量(export)。

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服