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

版权声明:本文为yunshuxueyuan原创文章

如需转载请标明出处: https://my.oschina.net/yunshuxueyuan/blog

QQ技术交流群:299142667

一、 LVS简介

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

二、 LVS的体系架构

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

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

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

Server Array层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。

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

从整个LVS结构可以看出,Director Server是整个LVS的核心,目前,用于Director Server的操作系统只能是Linux和FreeBSD,linux2.6内核不用任何设置就可以支持LVS功能,而FreeBSD作为 Director Server的应用还不是很多,性能也不是很好。对于Real Server,几乎可以是所有的系统平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。

三、 LVS模式

IP负载均衡技术:

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

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

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

VS/NAT: 即(Virtual Server via Network Address Translation)

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

VS/TUN :即(Virtual Server via IP Tunneling)

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

VS/DR: 即(Virtual Server via Direct Routing)

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

四、 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主要适用于web cache和DB cache

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

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

五、 实际搭建

术语   VIP: 虚拟服务器地址

DIP: 转发的网络地址

– 1,和RIP通信:ARP协议,获取Real Server的RIP:MAC地址

– 2,转发Client的数据包到RIP上(隐藏的VIP)

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

CIP: 客户端IP地址

VIP: 虚拟主机IP

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

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

2、配置lvs的VIP

Ifconfig eth0:0 192.168.249.100/24 

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

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

echo 1  > /proc/sys/net/ipv4/conf/eth0/arp_ignore

echo 2  > /proc/sys/net/ipv4/conf/eth0/arp_announce

echo 1  > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 2  > /proc/sys/net/ipv4/conf/all/arp_announce

4、配置RS的VIP(每一台RS都配)

Ifconfig lo:8 192.168.249.100 netmask 255.255.255.255

5、启动RS上的httpd

yum -y install httpd

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

测试两台RS 能否访问

6、LVS——ipvsadm

yum -y install ipvsadm

ipvsadm -A -t 192.168.249.100:80 -s rr

ipvsadm -a -t 192.168.249.100:80 -r 192.168.249.120 -g -w 1 (-w 表示设置权重)

ipvsadm -a -t 192.168.249.100:80 -r 192.168.249.130 -g -w 1

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

浏览器刷新: 访问vip

ipvsadm -lnc  显示lvs的连接详情

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

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

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

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

vi /etc/sysconfig/network-scripts/ifcfg-lo:8

DEVICE=lo:8

IPADDR=192.168.249.100

NETMASK=255.255.255.25

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

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

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

#!/bin/bash

#配置lvs的

VIP=192.168.249.100 #(注意,lvs server那台机器2个ip,一个是vip,一个是本身ip例如192.168.249.110)

RIP1=192.168.249.120

RIP2=192.168.249.130

#RIPn=192.168.249.n

VPORT=80

RPORT=80

Usage (){  

echo "Usage:`basename $0` 请输入:(start|stop|status) "  

    exit 1  

}  

if [ $# -ne 1 ];then  

Usage  

fi

case "${1}" in

start)

echo "start LVS of DirectorServer"

echo 1 > /proc/sys/net/ipv4/ip_forward  #表示允许数据包转发

     # set the vip  配置lvs的VIP

     /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up  

     /sbin/route add -host $VIP dev eth0:0  

# clear ipvs table 清空ipvs规则  

     /sbin/ipvsadm -C

# add lvs vip and port  

     /sbin/ipvsadm -A -t $VIP:$VPORT -s rr

# add rip and port  

    /sbin/ipvsadm -a -t $VIP:$VPORT -r $RIP1:$RPORT -g -w 1  

     /sbin/ipvsadm -a -t $VIP:$VPORT -r $RIP2:$RPORT -g -w 1

/sbin/ipvsadm -L -n

echo "start success!!!"

;;

stop)

echo "close LVS DirectorServer"  

        /sbin/ipvsadm -C  

        /sbin/ifconfig eth0:0 down

echo "closed !!!"

;;

status)

/sbin/ipvsadm -L -n

;;

*)

Usage

esac

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

#!/bin/bash

#real_server配置脚本  lvs的dr模式RIP server脚本

VIP=192.168.249.100  

#vip's broadcast  虚拟服务器的广播地址

BROADCAST=192.168.249.255

Usage () {  

    echo "Usage:`basename $0` 请输入:(start|stop)"  

    exit 1  

}    

if [ $# -ne 1 ];then  

    Usage  

fi

case $1 in  

    start)  

        echo "reparing for Real Server"  

        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore  

        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce  

        echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore  

        echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce  

        /sbin/ifconfig lo:8 $VIP netmask 255.255.255.255 broadcast $BROADCAST up  

        /sbin/route add -host $VIP dev lo:8

echo "start success!!!"  

        ;;           

    stop)  

        /sbin/ifconfig lo:8 down  

        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore  

        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce  

        echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_ignore  

        echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_announce  

        echo "stop Real Server"  

        ;;        

    *)  

        Usage  

esac

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 虚拟服务表计数器清零(清空当前的连接数量等)

–set tcp tcpfin udp 设置连接超时值

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

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

VRRP 功能。

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

-h –help 显示帮助信息

其他的选项:

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

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

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

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

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

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

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

默认的调度算法是: wlc.

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

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

-M –netmask netmask persistent granularity mask

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

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

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

-m –masquerading 指定LVS 的工作模式为NAT 模式

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

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

-c –connection 显示LVS 目前的连接 如:ipvsadm -L -c

–timeout 显示tcp tcpfin udp 的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服务,不然不会生效

service crond restart

我的脚本是:

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 中,在末尾加上 service crond start

基本用法:

crontab  -l    列出当前的crontab任务

crontab  -d   删除当前的crontab任务

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

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

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

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

版权声明:本文为yunshuxueyuan原创文章

如需转载请标明出处: https://my.oschina.net/yunshuxueyuan/blog

QQ技术交流群:299142667

LVS服务原理以及搭建(理论+干货)的更多相关文章

  1. LVS服务原理以及搭建

    一.LVS简介 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,目的在于使用集群技术和Linux操作系统实现一个高性能.高可用的服务器.它 ...

  2. DHCP服务原理与搭建(Linux系统+路由器,二选一方案)

    大家都知道上网的最基本前提是要在终端上设置IP.子网掩码.网关.DNS等地址信息,在家里或者在办公室很多时候打开电脑后发现就可以上网,并没有手动设置IP.掩码.DNS地址也能上网,这是什么原因呢?其实 ...

  3. lvs负载均衡的搭建

       lvs负载均衡的搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.         在部署环境前,我们需要了解一下一些协议 一.什么是arp 地址解析协议,即ARP(Addr ...

  4. Redis cluster集群:原理及搭建

    Redis cluster集群:原理及搭建 2018年03月19日 16:00:55 阅读数:6120 1.为什么使用redis? redis是一种典型的no-sql 即非关系数据库 像python的 ...

  5. MongoDB 分片的原理、搭建、应用

    一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这 ...

  6. Atiti.ui原理与gui理论

    Atiti.ui原理与gui理论 1. 概论2 2. ui的类型2 2.1. RMGUI vs IMGUI2 2.2. Cli2 2.3. Gui2 2.4. Nui natural user int ...

  7. MongoDB 分片的原理、搭建、应用 !

    MongoDB 分片的原理.搭建.应用   一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处 ...

  8. 【MySQL主从复制原理及搭建全过程】

    目录 准备工作 主从复制原理 开始搭建主从复制 本文将使用mariaDB数据库实现主从复制,其步骤与MySQL数据库无差异. MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护, ...

  9. MongoDB 分片的原理、搭建、应用 (转)

    一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这 ...

随机推荐

  1. pb传输优化浅谈

    在正式切入今天要谈的优化之前,先碎碎念一些自己过去这几年的经历.很久没有登录过博客园了,今天也是偶然兴起打开上来看一下,翻看了下自己的随笔,最后一篇原创文章发布时间是2015年的4月,今天是2017年 ...

  2. Python爬虫-爬小说

    用途 用来爬小说网站的小说默认是这本御天邪神,虽然我并没有看小说,但是丝毫不妨碍我用爬虫来爬小说啊. 如果下载不到txt,那不如自己把txt爬下来好了. 功能 将小说取回,去除HTML标签 记录已爬过 ...

  3. <iOS 组件与框架> -- UIKit Dynamics

    UIKit Dynamics 结合 『iOS 组件与框架 』一书.总结的知识点与demo demo 地址: GitHub地址 一.概述 1.UIKit Dynamics 是 iOS 7 新增的内容.其 ...

  4. [0] DDD领域驱动设计(二) 之 值对象

    DDD中实体对象与值对象的解释比较抽象.主要根据持续性与 ID 识别来区分. ID并非某一对象的直观自然属性,而是在分析建模之 后,赋给模型中的实体类,来达到跟踪,区别,存储目的的一个特值. 结合项目 ...

  5. Java IO学习笔记总结

    Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...

  6. Oracle Database Transaction Isolation Levels 事务隔离级别

    Overview of Oracle Database Transaction Isolation Levels Oracle 数据库提供如下事务隔离级别: 已提交读隔离级别 可串行化隔离级别 只读隔 ...

  7. 探索Windows命令行系列(3):命令行脚本基础

    1.实用功能 1.1.为脚本添加注释 1.2.控制命令的回显 1.3.使用数学表达式 1.4.向脚本传递参数 2.使用变量 2.1.变量的命名及定义 2.2.调用变量 2.3.变量的作用域 3.结构语 ...

  8. js函数验证方式:验证是否是数字,支持小数,负数

    验证 datatype="/^\d+(\.\d+)?$/" validatform验证是否是数字 支持小数点 datatype="d" 貌似支持小数 js函数验 ...

  9. 【原创】Kafka Consumer多线程实例续篇

    在上一篇<Kafka Consumer多线程实例>中我们讨论了KafkaConsumer多线程的两种写法:多KafkaConsumer多线程以及单KafkaConsumer多线程.在第二种 ...

  10. Swift计算字符数量

    通过调用全局 countElements 函数并将字符串作为参数进行传递可以获取该字符串的字符数量. let unusualMenagerie = "Koala