Linux集群技术之LB之LVS

简介: 时间:2018.3.1作者:李强参考:man,info,magedu讲义,万能的internet实验环境:VMware® Workstation 12 Pro ,Centos 6.9,Centos 7.4,SecureCRT Version 8.1.4声明:以下英文纯属个人翻译,英文B级,欢迎纠正,以下内容纯属个人理解,并没有对错,只是参考,盗版不纠,才能有限,希望不误人子弟为好。

时间:2018.3.1
作者:李强
参考:man,info,magedu讲义,万能的internet
实验环境:VMware® Workstation 12 Pro ,Centos 6.9,Centos 7.4,SecureCRT Version 8.1.4
声明:以下英文纯属个人翻译,英文B级,欢迎纠正,以下内容纯属个人理解,并没有对错,只是参考,盗版不纠,才能有限,希望不误人子弟为好。
版本:v1-2018.3.11

1、 集群相关概念

大容量网站相关技术概念
一个网站的体验度,注册用户数>在线用户数>并发数
而并发数量达到一定值的时候,用户打开一个页面所需的时间就是体验度
当一台服务器无法满足用户体验度的时候,2中方式

scale up 向上扩展,提高更强大的机器处理能力,有上限,成本高

scale out 向外扩展,增加多台设备负载

所谓凡事有2面性,因此scale out 带来的问题就是基于何种方式把响应发给多台服务器,多台服务器之前如何保证数据的同步性。

解决问题的解决方案,不停的升级改变,形成一定的架构。
各种应用场景,各种需求下,使用的是不一样的架构,不一样的解决方案。

解决老问题的同时又必然会带来新的问题,
通过前端调度器/负载均衡设备等多种称呼的设备,来解决如何将相应转发给多台服务器,但是产生的问题就是这台LB设备存在SPOF的问题,因此LB要做HA,多台服务器如果有设备出现问题如法相应要怎么解决,这就需要LB能够用户健康检查的机制,及时将故障设备剔除服务池,当故障恢复后再自动加入到服务池提供服务

解决的问题
1、如何解决把何种方式响应发给多台服务器
2、当服务器无法响应时怎么办
3、基于无连接的http协议访问,session如何保存。
  • cluster分类:

    LB(load balance)
    权重

    LB Cluster的实现
    
        硬件:
             F5
             Citrix NetScaler
             A10
             等如浪潮inspair,深信服sangfor国产的硬件设备
        软件:
            lvs:Linux Virtual Server
            nginx:支持四层调度
            haproxy:支持四层调度
            ats
            perbal
            pound
    
            各种软件适用于各种平台,需求都不一样等等
            但是万变不离其宗的是原理都是一样的,只不过在处理方式上,功能性能上各有千秋罢了,所以一开始的解决方案带给我了理解处理问题的思路后,其实许多其他也只是其功能的扩展或者增强而已。
    
        会话保持
        调度算法
        健康检查

    HA(high available)

    SPOF single point of failtrue
    
    heartbeat
    keepalived

    HPC(high-)

分布式部署

CDN

2、LVS

2.1 LVS介绍

  • 官网

    [http://www.linuxvirtualserver.org]

  • 工作原理

    VS根据请求报文的目的IP地址和协议及端口将其调度转发至某RS,根据调度算法来选择RS
    VS为virtual server,RS为real server

    就是个老鸨子,有人来了请求,小班的有一批人,大班的有一批人,一批人中业务熟练就多给几个人,老鸨子就是LVS。
    计算机是人的思想产物,人的思想产物造就了社会系统,同样适用于计算机系统。

    LVS类似于iptables中
    内核中用ipvs实现
    通过ipvsadm来配置先关的调度策略
    ipvs工作与类似iptables中的netfilter的INPUT前,当数据包来了之后,在INPUT前做了ipvs,然后根据报文的ip地址和端口信息然后截胡,将其按照ipvsadm指定的转发规则,重新发给响应的RS服务器。

    所以LVS工作在OSI模型的四层,

  • LVS的优缺点

    优点:
    1、性能好
    2、应用在并发链接很多的情况下使用
    缺点:
    1、功能单一,只能基于4层调度
    2、不能检查后端的RS的健康状态

2.2 LVS相关概念

VS
RS
CIP:client ip
VIP:virtual server ip
DIP:director ip
RIP:real server ip

lvs: ipvsadm/ipvs

ipvsadm:用户空间的命令行工具,规则管理器
用于管理集群服务及RealServer
ipvs:工作于内核空间netfilter的INPUT钩子上的框架
  • lvs集群的类型:

    lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
    lvs-dr:操纵封装新的MAC地址
    lvs-tun:在原请求IP报文之外新加一个IP首部
    lvs-fullnat:修改请求报文的源和目标IP

  • 1、LVS-NAT模式

工作原理:

主要是数据到达VS后,VS根据VSIP和调度算法,去服务地址池中去查找哪些节点提供此服务,然后将数据包的Dip改为RSip,可能还会改变Dport。然后RS上的网关需指向DIP。

VS最终对用户做响应

应用场景:

1、此模式对RS修改较少,
  • 2、LVS-DR模式

工作原理:

主要是数据回去不经过VS,CIP数据到网关,然后网关去找VIP地址,数据到达VIP之后,VIP根据调度算法,转发给响应的RIP,此时目标MAC构建为RIP的MAC地址,此时数据转发出去,不经过TCP/IP的ip层检查。不会经过网关,通过交换机时查看mac表,然后转发给RIP,因此VS和RS必须在同一个交换机下,但是不用在同一个ip网络中,然后RIP收到ip地址,查看mac是自己的,然后再看DIP是VIP,为本机的lo地址,所以处理响应,然后响应时,通过查找路由表,源ip为VIP,源mac为RS MAC,目的ip为CIP,目的mac为CMAC

换句话只有VS的VIP是真实的对外提供arp响应的,RS的VIP是虚拟的值只是用于对VS转发来的报文进行本地处理和本地路由转发,可以不经过来时的路,因为VS直接通过目的MAC为RS转发给RS,当报文从VS的接口发出后直接到达交换机,交换机通过MAC table去进行二层转发到RS上,RS收到报文后发现目的ip为本机lo的地址,则进行处理,然后封装报文,源ip为vip,目的ip为cip,然后通过路由转发。因此前提VS和RS必须在同连接到同一个广播域的物理设备上。否则通过二层转发,vs不能将数据包发给rs。

RS最终对用户做响应

修改ARP不处理:

要使RS的VIP称为虚的VIP,不对外提供arp的响应和发布,

1、arptables工具

2、sysctl修改内核参数

3、在路由器上做arp静态帮助,发往vip的数据包只发给VS,但是rs的内核参数依然要改,要不然如windows os上如果ip地址冲突会报警的。而且会有一些不必要的影响。

应用场景:

1、对服务器操作较多。
2、VS和RS不能跨广播域
  • 3、LVS-TUN模式

工作原理:

方式和DR类似,不同的是不是封装目的MAC地址,而是通过在IP报文首部前加上新的IP首部(源ip为DIP,目的ip为RIP),将报文发往调度的RS,RS直接响应给客户端。

应用场景:

1、VS和RS可以不在同一广播域。
2、VS对外提供真实的VIP地址
3、
  • 4、LVS-FULLNAT模式

工作原理:

此类型kernel默认不支持
同时修改请求报文的源ip和目的ip地址进行转发,CIP改为DIP,VIP改为RIP

应用场景:

1、VS和RS可以跨网段,这个我在浪潮负载上做的就是LVS-NAT和LVS-FULLNAT模式。
FULLNAT就要给VIP做一个NAT地址池,此处用于将CIP改为地址池的中的地址,RS指定的网关为源网关只要能到达NAT地址池中的地址也就是DIP即可。RS服务器本身也不需要修改内核arp参数,配置VIP地址。
  • 5、LVS工作模式对比分析

    LVS-NAT和LVS-FULLNAT:请求报文和响应报文都要经过VS,因为有nat session

    LVS-DR和LVS-TUN:

2.3 调度算法

ipvs scheduler

根据其调度时是否考虑服务器的负载情况分为两种:静态和动态方法,共10种
  • 静态方法:

    1、RR:RoundRobin 轮询

    2、WRR:Weigh RoundRobin 加权

    3、SH:Source Hash 源地址哈希

    4、DH:Destination Hash 目的地址哈希,应用于RS前有多台防火墙时

  • 动态方法:

通过计算RS的overload,负载越小,优先转发

1、LC:Least Connnections

    overload=active*256+inactive

2、WLC:Weighted LC,默认调度算法

    overload=(active*256+inactive)/weight

3、SED:Shortest Expection Delay

    overload=(active+1)*256/weight

4、NQ:Never Queue

5、LBLC:Locality-Based LC

6、LBLCR:
  • 另一种解释

我又要开始扯了,调度算法就像工厂里干活一样。
接了一批活,然后有一批人,那么怎么分配活给这些工人呢,活就是客户端的请求,一批工人就是服务器RS,分配怎么干活的就是VS调度器了。老板接活员工干,有4种静态的方法分配工作。

1、轮询的方式:就是流水线。
2、加权的方式:这个员工干的快,多给他些活干,加工资
3、源地址哈希:这个A公司的活你干过你熟悉,你来
4、目的地址哈希:这个是给B公司的活你干活你熟悉,你来

以上不考虑员工死活的做法,老板早晚得倒闭
所以有根据员工工作量的情况来分配的方法

1、谁现在工作最少给谁优先多些活干,但是没有考虑到你给他活,但是它干的慢啊
2、因此在上个基础上又有了新的解决方案,wlc,权重高又工作量少的优先干
3、

LVS实现 ipvsadm/ipvs

ipvs为内核中代码,ipvsadm为用户空间命令,用来配置LVS

yum install ipvsadm
  • 格式
Usage:
  ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
  ipvsadm -D -t|u|f service-address
  ipvsadm -C
  ipvsadm -R
  ipvsadm -S [-n]
  ipvsadm -a|e -t|u|f service-address -r server-address [options]
  ipvsadm -d -t|u|f service-address -r server-address
  ipvsadm -L|l [options]
  ipvsadm -Z [-t|u|f service-address]
  ipvsadm --set tcp tcpfin udp
  ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
  ipvsadm --stop-daemon state
  ipvsadm -h

Commands:
Either long or short options are allowed.
  --add-service     -A        add virtual service with options
  --edit-service    -E        edit virtual service with options
  --delete-service  -D        delete virtual service
  --clear           -C        clear the whole table
  --restore         -R        restore rules from stdin
  --save            -S        save rules to stdout
  --add-server      -a        add real server with options
  --edit-server     -e        edit real server with options
  --delete-server   -d        delete real server
  --list            -L|-l     list the table
  --zero            -Z        zero counters in a service or all services
  --set tcp tcpfin udp        set connection timeout values
  --start-daemon              start connection sync daemon
  --stop-daemon               stop connection sync daemon
  --help            -h        display this help message
  • 选项

    集群服务相关:

    -A|E:添加/修改集群服务

    -t:tcp
    -u:udp
    -f:firewall_mark
    service_address 
        -t:ip:port
        -u:ip:port
        -f:firewall_mark
    -s:指定调度算法 默认wlc
    -p:president connection timeout

    -D:删除集群服务
    -C:清空定义的集群服务
    -L|l:查看集群服务
    -n: 数字形式
    --stats:
    --rate:
    -c:connnection

    -Z:清零集群服务的统计信息

    RS相关:

    -a|e:添加/修改指定集群服务的节点

    -t|u|f service_address:指名添加到那个集群服务
    -r service_address:指定RS的地址,ip[:port]当允许端口映射时,可以指定端口
    -g|i|m:指定LVS模式类型 -g gateway,DR模式;-i ipip,TUN模式;-m manquerade,NAT模式,默认-g
    -w:weight当调度算法有权重时使用

    -d:删除指定集群服务的节点/real server

    备份(到标准输出)

    ipvsadm -S
    ipvsadm-save

    恢复(从标准输入)

    ipvsadm -R
    ipvsadm-restore

2.4 会话保持

1、session绑定:始终将统一请求的链接调度到同一服务器,没有容错能力,有损调度效果

2、session同步:在RS之间同步session,RS上有所有集群的session,大规模集群模式下不适用

3、session服务器:部署一台session服务器,专门存放session信息。存在SPOF,需要做HA

2.5 LVS持久性连接

对共享同一组RS的多个集群服务,需要统一进行绑定,无法使用lvs sh算法进行调度。

实现无论使用任何调度算法,在一段时间内(默认360s ),能够实现将来自同一个地址的请求始终发往同一个RS

PCC:每客户端持久,来自同一客户端访问某个VIP的所有链接统一转发个某个RS,范围太大
PPC:每端口持久,来自同一客户端访问某个VIP的某个端口的连接统一转发给某个RS,范围太小
PFMC:每防火墙标记持久,基于firewall mark的,将来自同一客户端访问某个VIP的多个端口的连接统一转发给某个RS,

ipvsadm -A -t 172.18.0.1:0 -p 200
ipvsadm -A -t 172.18.0.1:80 -p 200
ipvsadm -A -f 1 -p 200 

对应以上三种持久性连接配置
ipvsadm  -vnL --persistent-conn 查看持久性连接信息

2.6 LVS高可靠性

1 Director不可用,整个系统将不可用;SPoF Single Point of Failure

解决方案:高可用

    keepalived heartbeat/corosync

2 某RS不可用时,Director依然会调度请求至此RS

解决方案: 由Director对各RS健康状态进行检查,失败时禁用,成功时启用

    keepalived heartbeat/corosync ldirectord

检测方式:
    (a) 网络层检测,icmp
    (b) 传输层检测,端口探测
    (c) 应用层检测,请求某关键资源

3、RS全不用时:backup server, sorry server

  • ldirectord

 ldirectord:监控和控制LVS守护进程,可管理LVS规则

 包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm yum install ldirectord

 文件:

/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文件

Ldirectord配置文件示例

checktimeout=3
checkinterval=1
autoreload=yes
logfile=“/var/log/ldirectord.log“  #日志文件
quiescent=no #down时yes权重为0,no为删除
virtual=5  #指定VS的FWM或IP:port
real=172.16.0.7:80 gate 2
real=172.16.0.8:80 gate 1
fallback=127.0.0.1:80 gate #sorry server
service=http
scheduler=wrr
checktype=negotiate
checkport=80
request="index.html"
receive=“Test Ldirectord"
  • 实例

    参考普通笔记之LVS之DR,NAT模式配置

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
23天前
|
存储 负载均衡 索引
linux7安装elasticsearch-7.4.0集群配置
linux7安装elasticsearch-7.4.0集群配置
109 0
|
27天前
|
Linux 数据安全/隐私保护 虚拟化
Linux技术基础(1)——操作系统的安装
本文是龙蜥操作系统(Anolis OS) 8.4 的安装指南,用户可以从[龙蜥社区下载页面](https://openanolis.cn/download)获取ISO镜像。安装方法包括物理机的光驱和USB闪存方式,以及虚拟机中的VMware Workstation Pro设置。安装过程涉及选择语言、配置安装目标、选择软件集合和内核,设置Root密码及创建新用户。安装完成后,可通过文本模式或图形化界面验证系统版本,如Anolis OS 8.4,标志着安装成功。
|
30天前
|
Linux 数据处理 C++
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(一)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
69 0
|
30天前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
31 1
|
30天前
|
消息中间件 Linux 数据处理
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(二)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
30 1
|
4月前
|
Kubernetes Shell Linux
linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本
linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本
58 0
|
3月前
|
监控 Linux Shell
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)
在线上排查问题时,查询日志、查看系统配置和分析操作系统信息是至关重要的。这些操作可以帮助我们深入了解软件和服务的兼容性,并解决潜在的问题。在本次学习中,我们将介绍并深入学习一些我在处理类似问题时常用的指令。通过掌握这些指令,你将能够更加高效地定位和解决线上问题,提高系统的稳定性和性能。让我们一同进入这个学习过程吧!
43 0
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)
|
4月前
|
存储 Java Linux
【Zookeeper】基于3台linux虚拟机搭建zookeeper集群(二)
【Zookeeper】基于3台linux虚拟机搭建zookeeper集群
73 1
【Zookeeper】基于3台linux虚拟机搭建zookeeper集群(二)
|
25天前
|
弹性计算 Linux Shell
Linux技术基础(2)——文本处理
文本处理实验:探索[Vim](https://developer.aliyun.com/adc/scenario/aced2264751f4866a8340de4cf9db0fa)的命令、输入和底线模式,学习文本编辑快捷操作,如光标移动、删除、复制和粘贴。了解如何使用底线命令模式进行文件保存、退出及搜索替换。同时,掌握`cat`、`more`、`less`、`head`、`tail`等文本查看命令,以及`stat`、`wc`、`file`、`diff`等文件处理命令。利用`grep`、`sed`、`awk`和`cut`进行文本搜索、替换和分析。
|
3月前
|
安全 Linux 测试技术
深入Kali Linux:高级渗透测试技术详解
深入Kali Linux:高级渗透测试技术详解
160 0