LVS由浅入深

什么是集群

  • 集群是一组相互独立的、通过高速网络互联的计算机,它们构成一个组,并且以单一系统的模式加以运行

  • 管理(Cluster就是一组计算机,它作为一个整体向用户提供一组网络资源,这些单个的计算机系统就是集群的节点Node)

  • 一组通过高速网络互联的计算组,并以单一系统的模式加以管理

  • 将很多服务器集中起来一起,提供同一种服务,在客户端看来就象是只有一个服务器

  • 可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益

  • 任务调度是集群系统中的核心技术

集群目的

  • 提高性能

    • 如计算密集型应用,如:天气预报、核试验模拟
  • 降低成本
    • 相对百万美元级的超级计算机,价格便宜
  • 提高可扩展性
    • 只要增加集群节点即可
  • 增强可靠性
    • 多个节点完成相同功能,避免单点失败

    集群分类

  • 负载均衡集群:
    • Load Balance集群,简称LB,当一台服务器无法满足需求的时候,两台或多台服务器同时为客户端

    • 提供服务,以分担需求,提供轮询工作查询

      • 传输层实现:
        • LVS
      • 应用层实现:
        • nginx,haproxy,httpd,perlbal,ats,varnish
  • 高可用集群:
    • High Availability集群,简称HA,比如一台服务器出现故障的时候,但是不影响客户端的体验,另外

    • 一台服务器担当这台服务器的工作

      • vrrp:keepalived

      • AIS:hearbeat,corosyunc/pacemaker,cman,OpenAIS

  • 高性能集群:

    • High Perfermance Computing集群,简称HPC,一台计算机是4路,那么100台计算机同时就是400CPU
      • 单点;单台服务器

      • 分布式存储或并行处理

      • 三项对比:

        • LB:拓展非常方便,伸缩性强,缺点是Balancer可能是瓶颈。

        • HA[SLA]:平均无故障时间/(平均无故障时间+平均修复时间)=99.9% (9越多越好)

        • HPC:

          • 构建高可扩展性系统的重要原则:在系统内部尽量避免串行和交互化

初识LVS

  • Linux 虚拟服务器(LVS)是章文嵩在国防科技大学就读博士期间创建的

  • LVS可以实现高可用的、可伸缩的Web、Mail、Cache和Media等网络服务

  • 最终目标是利用Linux操作系统和LVS集群软件实现一个高可用、高性能、低成本的服务器应用集群

  • LVS:(linux Virtual Server)

    • Linux虚拟服务器,是一个虚拟的服务器是中国最早的自有软件项目之一。

LVS的出现

单台服务器无法满足用户需求时,必须集群吗?

  • 细致的解决方案:
    • 纵向拓展(更换大CPU,加内存条,绑定双网卡)
      • 优点:解决单台服务器的性能问题

      • 缺点:无法解决单点的问题

      • 瓶颈:单台的有硬件瓶颈

  • 横向拓展(并排放一起,同时承载数据,完成运算)

    • 例子:DNS Server 智能DNS
      • 优点:可以承载大量的数据运算,存储

LVS的四种工作模式

集群的宗旨:

可伸缩性(Scalability),可靠性(Reliability),可管理性(Manageability)

高可用分布式的总结:

  • 分层

  • 分割

  • 分布式

    • 分布式应用
    • 分布式静态资源
    • 分布式数据和存储
    • 分布式计算

硬件集群和软件集群

  • 硬件:F5 BIG-IP负载均衡器 https://f5.com
    • Citrix NetScaler
    • A10
    • Array
    • Redware
  • 软件:LVS(工作在OSL第四层,传输层) Nginx(工作在OSI第七成,应用层)
    • haproxy
    • nginx
    • ats(apache traffic server)
    • perlabl(高性能的WEB服务器负载器)

LVS集群组成

  • 前端:负载均衡层
    • 由一台或多台负载调度器构成
  • 中间:服务器群组层
    • 由一组实际运行应用服务的服务器组成
  • 底端:数据共享存储层
    • 提供共享存储空间的存储区域

基于工作的协议层次划分:

  • 传输层:
    • LVS(测试可以承载400-500W的高并发),haproxy(mode tcp)并发3W到极限连接
  • 应用层:
    • haproxy,nginx,ats,perlbal
  • LVS网站

英文地址:http://www.linuxvirtualserver.org
中文地址:http://www.zh.linuxvirtualserver.org 或者 http://www.linux-vs.org/zh/

LVS的四种转发方式:

  • NAT(网络地址映射)

  • IP Tunneling(IP 隧道)

  • Direct Routing(直路由)

  • Full-NAT模式

  • 不同的转发模式决定了不用的Cluster的网络结构

集群中的IP名称缩写

名称 英文缩写 介绍
虚拟IP地址(Virtual-IP-address) VIP VIP为Director用户客户端提供服务器的IP地址
真实IP地址(Real-Server-ip-address) RIP 在集群下面的节点上使用的IP地址
DirectorIP地址(Director-ip-address) DIP Director用于连接外网的IP地址,物理网卡上的IP地址
客户端IP地址(Client-ip-address) CIP 客户端用户请求集群服务器的IP地址,改地址用作发送给集群请求的源IP地址

基于NAT(natfilter)模式

LVS-Nat

  • 多目标的DNAT(iptables)

  • 它通过修改请求报文的目标IP地址(同时可能会修改目标端口)

  • 至挑选出某RS的RIP地址实现转发

特性:

  • (1)RS和DIP应该使用私网地址,且RS得网关要指向DIP

  • (2)请求和响应报文都要经由director转发,在极高的负载的场景中,director可能会成为系统瓶颈。

  • (3)支持端口映射

  • (4)RS可以使用任意的OS

  • (5)RS的RIP和Director的DIP必须在同一IP网络

LVS-DR(direct routing)

它通过修改请求报文的目标MAC地址进行转发

  • (1)保证前端路由器将目标IP问哦VIP的请求报文发送给director
    • 解决方案:
      • 静态绑定

      • ARPtables 广播防火墙

      • 修改RS主机内核的参数

  • (2)RS的RIP可以使用私有地址:但也可以使用公网地址

  • (3)RS跟Director必须在同一物理网络中

  • (4)请求报文经由Director调度,但响应报文一定不能经过Director

  • (5)不支持端口映射

  • (6)RS可以大多数OS

  • (7)RS的网关不能指向DIP

LVS组成

  • ipvsadm:用户空间的命令行工具,用于管理集群的服务。

  • ipvs:工作内核中netfilter INPUT钩子上。

  • 支持TCP,UDP,EST,AH_EST,SCTP等诸多协议

  • 只适用少量的服务器负载,大于20台容易导致director死机

LVS arch:

调度器:director,dispatcher,balancer
RS:RealServer

LVS Type

  • lvs-NAT MASQUERADE

  • lvs-dr(Direct routing) 直接路由方式

  • lvs-tun(Ip tunneling) 隧道

  • lvs-fullnat() 基于NAT的二次开发

LVS-NAT和LVS-DR的区别

  • lvs-nat:请求和响应都经由director

  • lvs-dr:仅请求报文经由director,响应报文是由RS直接响应给Client

部署LVS-NAT

安装前准备

OS 主机名 eth0 eth2
centos7 LVS-manager 192.168.4.51 201.1.1.8
centos7 web-1 192.168.4.52 201.1.1.1
centos7 web-2 192.168.4.53 201.1.1.2
centos7 mysql 192.168.4.53 0.0.0.0

安装ipvsadm

yum -y install ipvsadm

HTTP:stateless 构建WEB服务器的必须性
session保持
session绑定:将来自于同一用户的请求,始终定向一个Web Server,自行维护一个绘画追踪表(IP级别)
source IP_hash 源地址哈希机制,
cookie hash 任何会话访问的时候都插入一个cookie(进程级别(精细))
session集群
session服务器

配置指定网关

nmtui       #开启网卡指定网关

ifdown eth0;ifup eth0       #重起网卡
route -n

写入配置与测试

ipvsadm -A -t 201.1.1.8:80 -s rr        #创建一个VIP,并设置他的算法模式为rr
ipvsadm -a -t 201.1.1.8:80 -r 192.168.4.52 -m -w 2      设置一个真实的IP地址
ipvsadm -a -t 201.1.1.8:80 -r 192.168.4.53 -m   同上

测试

ipvsadm -Ln     #查看当前的lvs情况
curl -I http://201.1.1.8/web.html       测试

lvs scheduler

  • 静态方法:仅根据算法本身进行调度
    • RR:round robin,轮调
    • WRR:weighted RR,权重轮询
    • SH:source hash,源地址哈希,实现session保持的机制,将来自同意IP请求调度到同一RS(缺点有损负载机制)
    • DH:destination hash,目标地址哈希,将对同一个目标的请求始终发往同一个RS
  • 动态方法:根据算法及各RS的当前负载状态进行调度
    • 计算主机当前的负载Overhead越小的进行负载

    • LC:Least Connection 负载最小的进行连接

      — Overhead=Action(活动连接数)*265+Inactive(非活动连接数)

    • WLC:Weighted LC

      — Overhead=(Action*256+Inaction)/Weighted(权重)

    • SED:Shortest Expection Delay 最短期望延迟

      — Overhead=(Action+1)*256/Weighted

    • NQ:Never Queue 永不排对的算法

      — SED算法改进

    • LBLC:Locality-Based LC ,即为动态的DH算法

      — 正向代理情形下的cache server调度

    • LBLCR:locality-Based Least-Connection with Replication,带复制功能的LBLC算法

      — 在LBLC基础上,如果2台RS一台9/10的负载,一台是1/10的负载要平衡两台之间的负载。
      — 负载少的需要去负载高的缓存里面取一些放置到本地的服务器中分发器再重新分发。

lvs的集群服务

tcp,udp,ah,esp,ah_esp,sctp(前两种是重点)
(1)一个IPVS主机可以同时定义多个cluster service:tcp udp
(2)一个cluster service上至少应该一个 real server
定义时:指明lvs-type,以及lvs scheduler

ipvsadm的用法

ipvsadm -A --add-service [-s scheduler]     #在内核的虚拟服务器表中添加一条新的虚拟服务器记录。[调度算法,静态/动态]
    -E --edit-service                   #编辑内核虚拟服务器中的一条记录
    -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 标记过的服务类型。 

ipvsadm的相关命令

ipvsadm -D --delete-service 删除内核中虚拟服务器的记录
ipvsadm -C --clear 清除内核中的所有记录
ipvsadm -L|l --list 查看显示内核虚拟服务器表

service-address:地址有三种情形
    tcp:-t  ip:prot 
    udp:-u  ip:prot
    fwm:-f mark 防火墙标记说明从我这过的

管理集群服务中的RS
    service-address:
    IP:Prot

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
    -a 在内核虚拟服务器表中添加一条新的真实服务器记录
    -e 编辑一条虚拟服务记录中的某条真实服务器记录
----------------------------------------------
    -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 标记过的服务类型。 
--------------------------------------------------
    -g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)DR模型 
    -i --ipip 指定LVS 的工作模式为隧道模式 TUN
    -m --masquerading 指定LVS 的工作模式为NAT 模式 

ipvsadm -d -t|u|f service-address -r server-address
    保存和重载
        ipvsadm -R
        ipvsadm -S [-n]
    其他命令
        ipvsadm L|l [options]
            -n:numeric,基于数字格式显示地址和端口
            -c:connection,显示所有的ipvs连接
            --stats:统计所有的数据
            --rate:统计速率
            --sort;排序
            --exact:显示精确值,不做单位换算

修改规则
方法一:
vim /etc/sysconfig/ipvsadm
    ipvsadm -C
    ipvsadm -R < /etc/sysconfig/ipvsadm
    ipvsadm -L -n 查询参数配置
方法二:
    ipvsadm -E -t DIP -s scheduler
    ipvsadm -e -t Dip -r RIP:PROT
    ipvsadm -L -n 查询参数配置

删除操作
    ipvsadm -d -t DIP -r Rip:prot  对于RS
    ipvsadm -D -t DIP:prot  对于DR

配置Lvs-NAT
DR,RS*2:都配置两块网卡。
    (1)DR->公网  VIP
    (2)DR->GATEWAY   DIP
    (3)RS_dns->DIP
RS_GATEWAY->DIP
    (4)开启路由服务:
vim /etc/sysconf.conf
    net.ipv4.ip_forward=1
        sysconf -p  加载配置文件
        cat /proc/sys/net/ipv4/ip_fprward  查看是否成功1=成功
(5)关闭selinux,关闭iptables
        systemctl disable selinux
        iptables -F
(6)配置ipvsadm
        yum -y install ipvsadm httpd
        ipvsadm -A -t VIP:prot -s rr
        ipvsadm -a -t VIP:prot -r RIP:prot -m
        ipvsadm -a -t VIP:prot -r RIP:prot -m   
        ipvsadm -L -n 查看状态
(7)检验
        curl http://VIP:port  轮询说明成功

部署LVS-DR模式

  • 1.清理原来的配置

  • 2.配置VIP

  • 3.在web服务上修改相应的内核参数

  • 4.配置LVS-DR规则

OS 主机名 eth0 lo:0
centos7 LVS-manager 192.168.4.51 192.168.4.100
centos7 web-1 192.168.4.52 192.168.4.100
centos7 web-2 192.168.4.53 192.168.4.100
centos7 mysql 192.168.4.53 0.0.0.0

清理规则

ipvsadm -Ln 
ipvsadm -D -t ip:80

配置VIP

cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:0    #子网卡,共用一个网卡接口
    TYPE=Ethernet
    BOOTPROTO=none
    NAME=eth0:0
    DEVICE=eth0:0
    ONBOOT=yes
    IPADDR=192.168.4.100
    PREFIX=24
ifup eth0:0     #起网卡

每一台配置本地回环口

vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.4.100
NETMASK=255.255.255.255
#如果写成了255.255.255.0将会导致该网段其他的主机不管配置
#192.168.4.0/24中任意的IP,都会出现地址冲突
NETWORK=192.168.4.100
BROADCAST=192.168.4.100
ONBOOT=yes
NAME=lo:0
ifup lo:0

修改web内核参数

sysctl -a |grep arp_ignore
sysctl -a |grep arp_announce
echo "net.ipv4.conf.all.arp_ignore = 1">> /etc/sysctl.conf
echo "net.ipv4.conf.lo.arp_ignore = 1">> /etc/sysctl.conf
echo "net.ipv4.conf.all.arp_announce = 2">> /etc/sysctl.conf
echo "net.ipv4.conf.lo.arp_announce = 2">> /etc/sysctl.conf
sysctl -p       #刷新规则

给ipvsadm添加命令

ipvsadm -A -t 192.168.4.100:80
ipvsadm -a -t 192.168.4.100:80 -r 192.168.4.52 -g
ipvsadm -a -t 192.168.4.100:80 -r 192.168.4.53

LVS由浅入深》有4个想法

  1. Thank you for some other informative blog. The place else may just I am getting that type of info written in such a perfect way? I’ve a venture that I am just now running on, and I’ve been at the look out for such info.

  2. Good web site! I really love how it is simple on my eyes and the data are well written. I’m wondering how I might be notified whenever a new post has been made. I’ve subscribed to your feed which must do the trick! Have a great day!

发表评论