lvs的原理概述与搭建实现

Amount Of Article Reading: times

通过 vmare 实现 linux 虚拟机集群的搭建,通过 vmware 的 nat 模式与 window 主机进行通信, lvs 三种模式的原理概述。lvs 调度方法。了解用户态和内核态以及两者间的切换(即为何将 ipvs 放入内核)。搭建 DR 类型的实现。

1. 前置

  • 软件列表
    • vmware workstation pro
    • centos6 minimal
  • 预先知识
    • linux 基础
    • vi/vim 基本使用
    • 计算机网络基础

2. linux 集群搭建

2.1. 模版 minimal 系统安装

  • 新建虚拟机
  • 选择自定义安装
  • !!在安装客户机操作系统时,选择稍后安装操作系统
    • 否则会自动安装 vmware-tool 软件
    • 但因为 centos6 minimal 并没有图形界面,会卡死导致
  • 选择客户机操作系统,linux-> centos 64 位(根据系统类型选择)
  • 命名虚拟机。此后虚拟机都会通过该虚拟机克隆,最好命名清楚。此处命名为 centos0
  • 选择安装位置,可以自定义
  • 选择 NAT 模式
  • 最大磁盘大小:随便
    • 注意:可以分大些,最大磁盘大小只是最多能真有多少
    • 不会预先分配空间
    • 实际占用可能 1G 不到
    • 可以适当分大些
  • 之后一路确定
  • 完成后,再点击 CD/DVD 选择 linux 系统映像文件

  • 启动系统,进行安装
  • 此处选择自定义安装

  • 分区:
    • /boot 200MB
    • swap 2G
    • / 剩下所有
  • 之后根据提示完成安装即可

2.2. 模版 minimal 系统配置

2.2.1. 配置文件说明

linux 中的默认网卡配置在 /etc/sysconfig/network-scripts/ifcfg-eth0 里,ifcfg-eth0 是网卡 eth0 的配置,eth0 是默认网卡。
同时也有一个 ifcfg-lo 配置文件,是本地回环地址 127.0.0.1 对应网卡。
输入命令 ifconfig 可以发现 linux 存在两个网卡,分别是 ech0 和 lo。但 lo 并未分配 mac 地址,因为只是本地回环

可以通过创建ifcfg-网卡名来新增网卡配置

然后就是 /etc/udev/rules.d/70-persistent-net.rules文件,内容:

# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:0c:2b:31", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

该文件是通过读取硬件信息自动生成(因此之后会将该文件删除后在进行克隆,由 vmare 分配的 mac,在系统启动时会重新生成)的, 可以在 vmware 中查看虚拟机设置中的 网络适配器–>高级 查看 vmware 分配的 mac 地址。 同时注释中也提到只可以修改NAME=key,来为网卡接口配置。

  1. 网卡配置信息和 mac 地址的对应关系可以在/etc/sysconfig/network-scripts/ifcfg-eth0中进行配置,也就是添加HWADDR一项。
  2. 也可以在/etc/udev/rules.d/70-persistent-net.rules中。也就是修改NAME一项

图示:

此处选择后者进行 mac 地址的配置。因为之后通过拷贝创建其他系统时,所有配置文件都会被复制, 为了防止 mac 重复, 这里会删除ifcfg-eth0中的 mac 地址,通过第二种方式来配置网卡接口对应 mac。 同时删除/etc/udev/rules.d/70-persistent-net.rules 文件

  • 如果虚拟机保留 /etc/udev/rules.d/70-persistent-net.rules 这个文件,在通过该虚拟机克隆的时候:
    • 1,文件被带到新的虚拟机中
    • 2,mac 地址会产生重复,同时重复的那条也没有硬件对应。同时会新增一条 mac 地址

      可以之后拿子虚拟机试试。(vmware 虚拟机–>网络适配器–>高级 中中可以更改 mac 地址)

    • 3,ech0 不可用
    • 因此要在克隆前删除该文件(模版机重启后也会重新生成该文件)
    • 然后在子机器重新启动时自动生成该文件

2.2.2. 配置流程

  • 步骤:
    • 配置 ip 地址
      • vi /etc/sysconfig/network-scripts/ifcfg-eth0,通过 vi 进行编辑
      • 注释或删除 mac 地址
      • ONBOOT 设置为 yes,即开机激活网卡
      • 修改 BOOTPROTO 为 static,关闭 dhcp,使用手工配置

        通过自行指定 ip 而不使用 DHCP 是为了搭建集群后更容易访问。否则每次都要通过 ifconfig 查看分配的 ip

      • 注释或删除 UUID (可选)
      • 查看虚拟网络适配器中 nat 模式中的子网 ip
      • 添加分配 ip(根据子网 ip),掩码(255.255.255.0)信息
      • 添加网关(子网 ip 最后一段改为.2)
      • 添加 dns 解析地址
      • 示例:
        DEVICE=eth0  # 网卡接口名称
        # HWADDR=00:0C:29:8C:B7:11  # mac地址
        TYPE=Ethernet # 网卡类型
        # UUID=76056e74-5a1d-4c53-bde8-38b40e21303e
        ONBOOT=yes #系统启动时是否激活 yes|no
        BOOTPROTO=static # 启用地址协议 –static:静态协议 –bootp:协议 –dhcp:协议 -none:不指定协议[最好指定]
        NM_CONTROLLED=yes
        IPADDR=192.168.187.101 # 分配的ip地址  网络号为192.168.187.0,可以取192.168.187.1,192.168.187.2意外的其他ip(原因在nat模式讲解处)
        NETMASK=255.255.255.0 # 子网掩码地址
        GATEWAY=192.168.187.2 # 网卡网关地址,之后对详细说明
        DNS1=114.114.114.114 # DNS1地址
        
      • 重新加载配置文件service network restart
      • ifconfig 检查,ping 检查,没问题的话进行下一步
    • 关闭防火墙
      • service iptables stop 关闭防火墙
      • chkconfig 可以查看开启运行和关闭服务清单(3 代表命令行模式)
      • chkconfig iptables off 禁用防火墙
    • 关闭安全检查
      • vi /etc/selinux/config
        • SELINUX=disabled
      • 作用;
        • 比如虚拟机内部时间错误的话,内核级别会把虚拟机置成只读
        • 还有各种各种功能限制
    • 删除70-persistent-net.rulesrm -f /etc/udev/rules.d/70-persistent-net.rules
    • poweroff 关机
    • 为模版虚拟机拍摄快照

2.3. 克隆以及配置

2.3.1. 克隆

  • 选择模板机快照
  • 点击克隆
  • 从现有快照克隆
  • 创建链接快照
  • 重命名为 centos01,选择虚拟机位置
  • 克隆完成
  • 再重复三次

注意:在 vmare 中查看 mac 地址的话,mac 地址在重启时才会更新

2.3.2. 克隆机配置

  • 四个虚拟机修改 ipvi /etc/sysconfig/network-scripts/ifcfg-eth0

    最后只要不是 1 和 2 就行,此处从 100 开始

    • 修改 ip 地址为 xxx.xxx.xxx.101
      • service network restart
    • 修改 ip 地址为 xxx.xxx.xxx.102
      • service network restart
    • 修改 ip 地址为 xxx.xxx.xxx.103
      • service network restart
    • 修改 ip 地址为 xxx.xxx.xxx.104
      • service network restart
  • 四个虚拟机修改主机名vi /etc/sysconfig/network

    如果进入公司的话,这部分交给运维做较好,主机名不要随便修改。

    • 修改 hostname 为 node0001
      • 重启
    • 修改 hostname 为 node0002
      • 重启
    • 修改 hostname 为 node0003
      • 重启
    • 修改 hostname 为 node0004
      • 重启

修改 hosts 是为了更方便访问

  • 四个虚拟机修改 hosts vi /etc/hosts

    # 添加一下四条 不一定是187,要根据自己vmware中的配置
    192.168.187.101 node0001
    192.168.187.102 node0002
    192.168.187.103 node0003
    192.168.187.104 node0004
    
  • window 修改 host

    # 添加一下四条 不一定是187,要根据自己vmware中的配置
    192.168.187.101 node0001
    192.168.187.102 node0002
    192.168.187.103 node0003
    192.168.187.104 node0004
    
  • 四个虚拟机拍摄快照

    以后搞崩了系统可以还原

3. vmare-nat 模式原理

4. lvs

4.1. 定义及术语

简介:LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器,是一个由章文嵩博士发起的自由软件项目,官方站点是:http://www.linuxvirtualserver.org。现在LVS已经是Linux标准内核的一部分。

特点: lvs 解析到第四层传输层,只关心 port,状态。

交换机解析到第二层链路层,只关心 mac 地址。路由器解析到第三层网络层,只关心 ip 和路由表。
nginx 需要解析到第七层应用层。nginx 也可以做负载均衡服务器,但因为内解析更多,速度相对于 lvs 更慢

目标:通过 LVS 提供的负载均衡技术和 Linux 操作系统实现一个高性能,高可用的服务器群集,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能

术语

  1. DS:Director Server。指的是前端负载均衡器节点。
  2. RS:Real Server。后端真实的工作服务器。
  3. VIP:Virtual Service IP,向外部直接面向用户请求,作为用户请求的目标的 IP 地址。
  4. DIP:Director Server IP,主要用于和内部主机通讯的 IP 地址。
  5. RIP:Real Server IP,后端服务器的 IP 地址。
  6. CIP:Client IP,访问客户端的 IP 地址

架构: CIP 发送数据包到负载均衡服务器(CIP–>VIP),负载均衡服务器根据指定的调度算法,将数据包转发到 RIP(DIP–>RIP)
数据包只通过负载均衡服务器进行转发,类似路由,不会进行三次握手和四次挥手
在实际应用中,所有 RS 中的服务器互为镜像

4.2. 种类

4.2.1. D_NAT 地址转换

请求数据包流程: (CIP–>VIP 是指 ip 数据报中的源 ip 和目的 ip)

响应数据包流程:

为何响应数据包也需要经过 lvs?
客户端发送的数据包为 CIP–>VIP,所以会接收的数据包为 VIP–>CIP。而 RS 发送的数据包为 RIP–>CIP,不修改源 ip 的话无法被客户端接收

4.2.2. DR 直接路由

使用最多

出现缘由: 网络 io 具有非对称性,比如下载文件时,一个 http 访问可能响应上 G 的文件,因此以往经常会通过限制上传速度而满足下载速度。但企业服务器对上传速度有较高要求,若依旧使用 D_NAt 模式,CIP–VIP 间的硬件设施会限制上传速度

模式优化: 三个 VIP 是一个地址,只不过内部 VIP 地址仅仅为了 RIP 在接收数据包后不丢弃。这个网络中只有一个 VIP

流程;

4.2.3. TUN 隧道

如果是 vpn,client 就是用户使用的手机或电脑,负载均衡服务器就是中国香港的服务器, RS 就是外网服务器。

5. lvs-DR 的具体实现

5.1. 原理

具体拓扑图

  • 红线:客户访问负载均衡服务器
  • 蓝线:负载均衡服务器转发数据包到真是后端服务器
  • 黄线:后端服务器返回响应数据包

5.2. 实现流程

5.2.1. 管理工具:

lvs 已经嵌入到 linux 内核中,为 ipvs 模块,为了对该模块进行管理,安装 ipvsadm 工具 yum install ipvsadm

5.2.2. 内部 vip 设置:

  • /proc/sys/net/ipv4/ip_forword
    • 0:默认值,在收到数据包的地址如果不是本机地址,默认会丢弃。(计算机作为边缘部分,本身不需要转发数据包)
    • 1:计算机会进行转发(也就是路由器功能,此处为了转发给后端服务器,所以要进行开启)
  • arp_ignore: 定义接收到 ARP 请求时的响应级别

    /proc/sys/net/ipv4/conf/all
    /proc/sys/net/ipv4/conf/eth0 两个目录都要
    默认 0 级别,会暴露内部 vip

    • 0:只要本地配置的有相应地址,就给予响应;
    • 1:仅在请求的目标(MAC)地址配置请求 到达的接口上的时候,才给予响应;

一个网卡可以绑定多个地址,而为了配置内部 vip,要将 vip 配置在一块外部不可能访问到的网卡上。 ifconfig 查询网络配置可以发现,除了 eth0 网卡外,还有本地回环地址对应网卡 lo。因此可以把内部 vip 配置在 lo 网卡上。

  • arp_announce:定义将自己地址向外通告时的通告级别

    /proc/sys/net/ipv4/conf/all
    /proc/sys/net/ipv4/conf/eth0 两个目录都要
    默认会自动往外通告,更新 arp 表,

    • 0:将本地任何接口上的任何地址向外通告;

      比如 eth0 绑定两个 ip,ip1 向 ip1 对应网络中广播本机所有 ip,ip2 向 ip2 对应网络中广播本机所有 ip
      这样会也会把 eth0 把内部 vip 广播出去

    • 1:试图仅向目标网络通告与其网络匹配的地址;
    • 2:仅向与本地接口上地址匹配的网络进行通告;

      比如eth0绑定两个ip,ip1只能向ip1对应网络中广播,ip2只能向ip2对应网络中广播

5.2.3. 调度算法

  • 静态:
    • rr:轮循
    • wrr:
    • dh:
    • sh:
  • 动态调度方法:
    • lc: 最少连接
    • wlc: 加权最少连接
    • sed: 最短期望延迟
    • nq: never queue
    • LBLC: 基于本地的最少连接
    • DH:
    • LBLCR: 基于本地的带复制功能的最少连接
  • 默认方法:wlc

每次转发请求lvs都会进行记录,用于调度算法

5.2.4. 实际流程

  • 负载均衡服务器配置(此处选用192.168.187.101)
    • 设置VIP ifconfig eth0:8 192.168.187.100/24
    • 开启数据包转发 echo 1 > /proc/sys/net/ipv4/ip_forward

      因为是系统内核配置,只能通过重定向方式修改,且立即生效

  • 两个后端服务器配置(192.168.187.102 , 192.168.187.103)
    • 配置arp转发设置:
      • 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
    • 设置内部VIPifconfig eth0:8 192.168.187.100 netmask 255.255.255.255
      掩码为四个255原因:
      最长匹配原则,所以环回接口配置 vip 有四个 255。192.168.187.100 会发送到本地环回接口
      同时 192.168.187.xxx 的不会走本地环回接口(因为四个 255,ip 就是网络号)
      
  • 两台后端服务器设置测试环境
    • yum install httpd -y
    • vi /var/www/html/index.html
      • 添加内容:from 192.168.187.XXX
    • service httpd start

      直接访问后端服务器ip可以访问
      访问VIP不可以访问(还没配置lvs)

  • lvs配置
    • yum install ipvsadm -y
    • ipvsadm -A -t 192.168.187.100:80 -s rr

      lvs 服务器可以监控不同的端口号,即不同集群,所以要先设置VIP,再为VIP设置RIP
      添加VIP,使用轮询方式调度(为了更容易体现出调度过程)

    • ipvsadm -a -t 192.168.187.100:80 -r 192.168.187.102 -g

      为指定VIP添加后端服务器

    • ipvsadm -a -t 192.168.187.100:80 -r 192.168.187.103 -g

      为指定VIP添加后端服务器

    • ipvsadm -ln

      显示lvs状态(vip以及对应rip,以及调度情况)

    • 浏览器刷新: 访问vip

      可以发现网页内容再两个后端服务器间切换

    • ipvsadm –lnc

      查看分发记录

    • netstat -natp

      查看握手记录
      会发现负载均衡服务器并没有参与握手(因为只是处理和转发数据包)
      而后端服务器只和window(192.168.187.1)握手了

5.2.5. 命令列表:

  • 管理集群服务
    • 添加:-A -t|u|f service-address [-s scheduler]
      • -t: TCP协议的集群
      • -u: UDP协议的集群
        • service-address: IP:PORT
      • f: FWM: 防火墙标记
        • service-address: Mark Number
      • 修改:-E
      • 删除:-D -t|u|f service-address
  • 管理集群服务中的RS
    • 添加: -a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
      • -t|u|f service-address:事先定义好的某集群服务
      • -r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
      • [-g|i|m]: LVS类型
        • -g: DR
        • -i: TUN
        • -m: NAT
      • [-w weight]: 定义服务器权重
    • 修改:-e
    • 删除:-d -t|u|f service-address -r server-address

      例: ipvsadm -d -t 172.16.100.1:80 -r 192.168.10.8 –g ipvsadm -d -t 172.16.100.1:80 -r 192.168.10.9 -g

    • 查看
      • -L|l
      • -n: 数字格式显示主机地址和端口
      • –stats:统计数据
      • –rate: 速率
      • –timeout: 显示tcp、tcpfin和udp的会话超时时长
      • -c 显示当前的ipvs连接状况
  • 删除所有集群服务
    • -C:清空ipvs规则
  • 保存规则
    • -S

      ipvsadm -S > /path/to/somefile

  • 载入此前的规则:
    • -R

      ipvsadm -R < /path/form/somefile

6. 其他

博客

中文 lvs 手册