当前位置: 首页 > news >正文

Linux集群--lvs

下面介绍的是Linux集群


一、Linux集群基础

1、Linux集群类型:LB、HA、HP、DS

(1)、LB:负载均衡集群

  缺陷:单点故障,其调度器会成为性能瓶颈

(2)、HA:高可用集群

  平均无故障时间(MTBF)、平均故障修复时间(MTTR)。

  有效值==MTBF/(MTBF+MTTR) -------------提高可用性公式

(3)、HP:高性能集群

(4)、DS:分布式系统集群

  功能:分布式处理、分布式存储


2、Linux集群调度器:硬件(F5)、软件(lvs)。


3、负载均衡

(1)、传输层的负载均衡:四层交换

  应用协议工具:lvs、nginx、haproxy

(2)、应用层的负载均衡:七层交换

  应用协议工具:httpd、nginx、haproxy

(3)、FastCGI负载均衡:------------性能好,没httpd稳定

  应用协议工具:httpd、nginx

(4)、mysql的负载均衡:

  管理工具:mysql-proxy



二、lvs --------------Linux虚拟服务器

虚拟服务器:vs ------------调度器

真实服务器:rs(Real Server)----------后端服务器


CIP:客户端 ip,请求发送方 ip地址

VIP:虚拟服务器 ip,客户端访问的地址

DIP:调度器 ip

RIP:真实服务器的 ip


1、lvs基础

lvs是基于套接字(ip:port)来实现数据分发的。lvs,根据目标套接字,调度数据报文到后端真实服务器(rs)上,调度时,通过不同的算法来调度响应的服务器。


lvs使用的调度规则链:INPUT

iptables 和 lvs 的规则,不能同时使用,至少INPUT规则链不能同时使用。


lvs 的内核组件:ipvs ----------接收 ipvsadm 的管理命令,支持TCP、UDP、SCTP、AH、ESP、AH_ESP协议

      用户空间工具为:ipvsadm ------------集群服务和 rs 管理


2、lvs的集群类型:lvs-nat、lvs-dr、lvs-tunnel。

(1)、lvs-nat -----------多目标IP地址的DNAT

  client ---------> DIP ---------- >RIP ------------> RS(目标地址、目标端口)

                  (同一网段、私有IP)


  具体步骤:

  client ------> VIP --------> INPUT ------> DIP ------> RIP ------>RS


  lvs-nat:(注意)

  1、RIP和DIP在同一个网段,并应该是私有IP地址,RS的网关指向DIP。

  2、请求报文和响应报文,都必须通过director转发器转发,易引发性能瓶颈、单点故障。

  3、可以实现端口重定向,即VIP、DIP端口号可以不同。

  4、vs必须是Linux系统,而RS可以是任意的操作系统。



(2)、lvs-dr(默认类型) ----------重要

  dr:直接路由(注意判断网关)----------------响应报文不经过转发器


  具体步骤:

  client -------> 路由器 ----------> 交换机 ---------> VS -----------> RS ---------------> 交换机 

(CIP+VIP)                                            (RIP、DIP同一网段)

  -------->路由器 ---------> client  

  步骤:

  1、客户机将CIP+VIP(源CIP,目的VIP)报文发给路由器;

  2、路由器将CIP+VIP报文发给交换机;

  3、交换机根据目的地址为VIP,找到接收端为转发器VS;VS有VIP、DIP。

     RS也有VIP地址,但是RS的arp_ignore=1/2,表示入栈接口为指定的接口,在此指定入栈接口为VS;

  4、VS接收CIP+VIP报文,发现VIP地址是集群服务的,将报文中转给对应的RS;

     VS有DIP接口、VIP标签接口(别名接口);

  5、RS因为有VIP地址,所以能接收CIP+VIP报文;RS的VIP在环回接口上,不和外部通信;

     即:CIP+VIP报文不是从RIP直接发送出去,而是通过一条这路由到VIP的环回接口上走一圈,使发送的源地址变为VIP;

  6、RS发送VIP+CIP给交换机;

     因为RS内,arp_announce=2,决定了出栈地址,在此指定出栈为对应交换机;

  7、交互机转发VIP+CIP报文发送给路由器;

  8、路由器再将VIP+CIP报文发送给客户端;

     客户端接收到VIP+CIP报文,就像直接从VS发来的一样,不会意识到有RS的存在。



  lvs-dr:(注意)

  1、通过对请求报文封装一个数据链路层首部(MAC地址)。

  2、重新封装的源MAC地址,是DIP所在网络的MAC地址。

               目的MAC地址,是调度选出来的RS的RIP接口的MAC地址。

  3、源IP地址和源PORT,目的IP地址和目的PORT,在整个报文转发过程中保持不变

  4、交换机 -------> VS:将目标地址为VIP的报文发往VS,方法:在路由器上静态绑定IP地址和MAC地址。

    交换机 --------> RS:交换机到RS的方法,有两种:在RS上使用arptables,RS的内核参数(arp_announce、arp_ignore)

  5、不支持端口重定向

  6、RS为Linux

  7、RS上必须配置RIP和VIP,并且VIP应该配置在lo接口的lable上



(3)、lvs-tun ----------只经过一次VS

  tunnel:隧道封装,VS和RS之间的数据传输。

          不修改请求报文的ip首部(CIP/VIP),而是在之外再封装一个IP首部(DIP/RIP)。

  具体步骤:        

  client ----------> VS --------> RS ---------> client(只经过一次VS)


  lvs-tun:(注意)

  1、CIP,VIP,DIP,RIP都应该是公有IP地址

  2、RS的网关无法指向DIP,因此响应报文不会经过Director转发,而是直接发往CIP

  3、不支持端口重定向

  4、RS必须支持隧道协议

  5、RS上必须配置RIP和VIP



(4)、lvs-fullnat -----------非标准类型(VS的开销更大,但可增加一定的安全性)

  同时修改请求报文的源IP地址、目的IP地址,实现报文转发。

  CIP --------->DIP

  VIP --------->RIP

  即:CIP/VIP -------> DIP/RIP


  lvs-fullnat:(注意)

  1、CIP、VIP为公有地址,DIP、RIP为私有地址。DIP、RIP可不在同一网段。

  2、RS对收到的请求报文的响应报文的目的地址是DIP,所以请求报文和响应报文都必须经过Director

  3、支持端口重定向



3、lvs的调度算法

根据是否与RS的负载状态有关,分为:静态算法(无关)、动态算法(有关)。

(1)、静态算法:与算法本身有关

    RR:轮询算法

    WRR:加权轮询算法

    SH:源地址哈希算法(源地址绑定)

    DH:目标地址哈希(正向代理服务器) ---------缓存方式实现


(2)、动态算法:与RS当前负载状态有关,RS的负载:Overhead。

    LC:最少连接数算法(选择Overhead值小的)------------存在【起点问题】

   *WLC(默认算法):加权最小连接算法 -------------存在【起点问题】

    SED:最短期望延迟算法 -------------解决了起点问题,存在【连续请求问题】

    NQ:无序列排队算法 ------------开始据RS权重依次分配一个,保证一个活动连接,然后再SED

    LBLC:基于本地的最少连接数算法 ----------------动态DH(正向代理)

    LBLCR:带有复制功能的LBLC算法 ------------带复制的动态DH(正向代理)


4、ipvsadm -------------编写ipvs规则

ipvs规则:作用于内核空间的TCP/IP协议栈上 -------------INPUT链上


ipvsadm命令:

(1)、集群相关

  【添加】集群相关格式:

  ipvsadm -A -t|u|f service-address [-s scheduler] [-p [timeout]]

  常用选项:

  -t:基于TCP的集群,其后地址为VIP地址

  -u:基于UDP的集群,其后地址为VIP地址

  -f:基于防火墙标记的集群,其后地址为mangle表中的标记

  -s:集群调度算法

  -p:持久连接


  【修改】集群格式:ipvsadm -E -t|u|f service-address [-s scheduler] [-p [timeout]]

  常用选项:

  -E:删除集群


  【删除】集群格式:ipvsadm -D -t|u|f service-address

  常用选项:

  -D:删除指定集群


  【清除】集群:ipvsadm -C

  常用选型:

  -C:清空集群,所有清空


(2)、集群中的RS相关:

  【添加】RS:ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight]

  常用选项:

  -r:添加的RS的,IP地址和端口

  -w:权重


  -g:dr集群 ----------默认

  -i:tunnel集群

  -m:nat集群

  

  【修改】其中的RS:ipvsadm -e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

  常用选项:

  -e:修改集群中RS


  【删除】其中的RS:ipvsadm -d -t|u|f service-address -r server-address

  常用选项:

  -d:删除集群中的RS


(3)、查看集群信息

  格式:ipvsadm -L|l [options]:

  常用选项:

  -c:集群中各连接状态

  --stats:集群的统计数据信息

  --rate:传输速率相关

  --timeout:超时时长


(4)、保存、重载ipvs的规则

  保存格式:ipvsadm -S [-n]

  # ipvsadm -S [-n] > /PATH/TO/IPVS_RULE_FILE

  # ipvsadm-save > /PATH/TO/IPVS_RULE_FILE

  

  重载格式:

  # ipvsadm -R < /PATH/FROM/IPVS_RULE_FILE

  # ipvsadm-restore < /PATH/FROM/IPVS_RULE_FILE



5、lvs-nat集群实现过程:

  调度器配置:----------------支持端口重定向

    # ipvsadm -A -t 172.16.72.1:80 -s rr

    # ipvsadm -a -t 172.16.72.1:80 -r 192.168.100.8:8080 -m -w 1

    # ipvsadm -a -t 172.16.72.1:80 -r 192.168.100.9 -m -w 2


  RS服务器配置:

  正常配置ip地址,注意网关指向调度器的DIP。



6、lvs-dr集群的实现过程:

  调度器配置:------------两块网卡

  一块网卡:作为主接口,配置DIP

  另一块网卡:作为网络标签,配置VIP,用于接收报文。-----------注意配置广播地址,即只是自己使用。

    # ifconfig eno16777736:0 172.16.72.101 netmask 255.255.255.255  broadcast 172.16.72.101 up


  RS服务器配置:

  网卡主接口:配置RIP

  调整内核参数:

    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore --------入栈接口

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

    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce -------出栈接口

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

  设置VIP:

    # ifconfig lo:0 172.16.72.101 netmask 255.255.255.255  broadcast 172.16.72.101 up

  设置直接路由:

    # route add -host 172.16.72.101 dev lo:0



7、防火墙标记集群的实现过程:

  打标记:iptables -t mangle -A PREROUTING -d VIP -p tcp --dport PORT -j MARK --set-mark 6

  建防火墙标记集群:ipvsadm -A -f FWM -s rr


8、LVS持久连接:

  常做的端口持久端口为:443、80

  # iptables -t mangle -A PREROUTING -d VIP -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6



     本文转自little_ding 51CTO博客,原文链接:http://blog.51cto.com/12496428/1972830,如需转载请自行联系原作者








相关文章:

  • 容器技术贯穿什么基础的设施睿云智合Wise2C的体现
  • 在electron中实现跨域请求,无需更改服务器端设置
  • Java的多进程运行模式分析
  • Enterprise Library Step By Step系列(十):缓冲应用程序块——进阶篇
  • 在ISA 2006企业版环境下配置存储服务器(CSS)
  • Android基于Cling开发DLNA应用
  • linux备份和mysql登陆自动输入密码
  • 软件自动化部署脚本
  • 深度神经网络(DNN)的正则化
  • 敏捷个人手机应用:如何使用时中法目标
  • Vue.js系列之三模板语法
  • docker compose部署服务
  • SQL2005中时,Diagrams的问题
  • PreparedStatement--摘抄自http://blog.chinaunix.net/u/28512/showart_221625.html
  • Map集合的四种遍历方式
  • python3.6+scrapy+mysql 爬虫实战
  • Druid 在有赞的实践
  • JavaScript DOM 10 - 滚动
  • leetcode386. Lexicographical Numbers
  • maya建模与骨骼动画快速实现人工鱼
  • Redis中的lru算法实现
  • Redux 中间件分析
  • Spring核心 Bean的高级装配
  • 浮动相关
  • 简单数学运算程序(不定期更新)
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 一道面试题引发的“血案”
  • 带你开发类似Pokemon Go的AR游戏
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (10)STL算法之搜索(二) 二分查找
  • (2015)JS ES6 必知的十个 特性
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (k8s中)docker netty OOM问题记录
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)hibernate配置管理
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (一一四)第九章编程练习
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • /run/containerd/containerd.sock connect: connection refused
  • @angular/cli项目构建--http(2)
  • [ C++ ] STL---stack与queue
  • [ JavaScript ] JSON方法
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • []error LNK2001: unresolved external symbol _m
  • [20190416]完善shared latch测试脚本2.txt
  • [BT]BUUCTF刷题第8天(3.26)
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)