负载均衡之lvs

怎甘沉沦 提交于 2019-12-16 11:33:34

1.负载均衡 VS 反向代理区别

1.1 功能(原理)

  • 负载均衡 lvs 请求做转发
  • 反向代理 Nginx Haproxy 代替(代理)用户去请求 ,得到响应再反回给用户

image.png

1.2 4层与7层

7层协议
应用层 协议: http https
表示层
会话层
传输层 tcp/udp 端口
网络层 IP地址
数据链路层**** MAC地址
物理层 010101001 比特
物理层,数据链路层,网络层,传输层的单位:
比特bit,帧frame,包packet,段segment

  • 4层 LVS nginx(1.9版本支持) haproxy
  • 7层 nginx haproxy

2.ARP协议


2.1 arp解析过程

https://www.cnblogs.com/csguo/p/7542944.html

DNS 域名----->ip地址 域名解析服务/系统

ARP ip------->MAC地址 地址解析协议(Address Resolution Protocol)

2.2 arp解析原理

  1. 发出广播消息 查询ip对应的mac地址

  2. 对应的机器会用单播的方式把自己的mac告诉对方

  3. 用户自己留1个arp缓存

  • 每个主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系。
  • 主机(网络接口)新加入网络时(也可能只是mac地址发生变化,接口重启等), 会发送免费ARP报文把自己IP地址与Mac地址的映射关系广播给其他主机。
  • 网络上的主机接收到免费ARP报文时,会更新自己的ARP缓冲区。将新的映射关系更新到自己的ARP表中。
  • 某个主机需要发送报文时,首先检查 ARP 列表中是否有对应 IP 地址的目的主机的 MAC 地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送 ARP 数据包,该数据包包括的内容有:源主机 IP 地址,源主机 MAC 地址,目的主机的 IP 地址等。
  • 当本网络的所有主机收到该 ARP 数据包时:
(A)首先检查数**据包中的 IP 地址是否是自己的 IP 地址**,如果**不是,则忽略该数据包。**

(B)如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖。

(C) 然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。
  • 源主机收到 ARP 响应包后。将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。

2.3 arp解析过程-抓包

[root@m01 ~]# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
172.16.1.51              ether   00:0c:29:c7:5d:dd   C                     eth1
10.0.0.1                 ether   00:50:56:c0:00:08   C                     eth0
10.0.0.254               ether   00:50:56:e1:eb:34   C                     eth0
[root@m01 ~]# arp -d 10.0.0.51  #删除MAC

[root@db01 ~]# ping 10.0.0.61 -c 1  #db01上ping

[root@m01 ~]# ping 10.0.0.51 -c 1   #m01上ping

image

2.4 Linux下抓包

arp解析过程:wireshark抓包流程

[root@m01 ~]# yum install -y wireshark  #下载抓包软件
[root@m01 ~]# tshark -i eth1 -f arp
Running as user "root" and group "root". This could be dangerous.
Capturing on 'eth1'
  1 0.000000000 Vmware_2e:aa:48 -> Broadcast    ARP 42 Who has 172.16.1.51?  Tell 172.16.1.61
  2 0.000263929 Vmware_c7:5d:dd -> Vmware_2e:aa:48 ARP 60 172.16.1.51 is at 00:0c:29:c7:5d:dd

[root@m01 ~]# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
172.16.1.51              ether   00:0c:29:c7:5d:dd   C                     eth1
10.0.0.1                 ether   00:50:56:c0:00:08   C                     eth0
10.0.0.51                ether   00:0c:29:c7:5d:d3   C                     eth0
10.0.0.254               ether   00:50:56:e1:eb:34   C                     eth0

tshark (wireshark) :

**-i ** 指定网卡 默认第1个网卡(非lo)

-f 指定过滤规则

-w 保存抓包的内容到文件中

抓包过滤语法 man wireshark-fifilter

arp欺骗

小故事源文链接:csguo

image.png

预防:
1.mac地址与ip地址绑定
2.使用企业安全软件

4. LVS介绍

LVS也叫做Linux虚拟服务器(Linux Virtual Server)创始人-章文嵩,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,目前是负载均衡性能最好的集群系统。

相关链接:https://www.cnblogs.com/aubin/p/7718739.html

四种工作模式原理:https://blog.csdn.net/Running_free/article/details/77981201

LVS由于太nb 被写入到了Linux内核中 ip_vs

通过 keepalived(配置文件)或ipvsadm (命令)进行控制

ipvsadm ipvs admin

中国的开源软件:

Sersync

Jumpserver

MyCAT

4.1 lvs相关名词

image.png

CIP:客户端IP (client IP)

VIP:Virtual IP 向外提供服务的IP;通常此IP绑定域名

DIP:与内部主机RIP通信的IP,在Director主机上

RIP:Real Server IP;内部真正提供服务的主机

Director:负责调度集群的主机 LVS;也简称调度器、分发

VS:Virtual Server,虚拟服务器,也称为Director、

RS:Real Server(lvs),真正的服务器,集群中各节点

4.2 lvs集群的模式类型

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

4.3LVS-DR模式(二层)

原理简述

当客户端向VIP发起请求时,[源CIP;目的VIP] 数据包通过路由器发送到Director。然后Director不修改其源IP 目的IP。经过调度后将目的MAC改为RS的MAC,RS收到数据之后发现目的IP为本机的L0接口就将其收下,然后处理数据后再将源IP改为L0目的IP为客户端CIP直接通过公网返回给客户端**

CIP—>VIP:源IP(客户端)→Director(修改为RS的mac)→目的IP(RS本地lo接口)

VIP—>CIP:源IP(RS本地lo接口)→通过公网→目的IP(客户端)

image.png

image.png

image

image

抑制RS端arp

image.png

image

LVS-DR模式的特点:

  1. LVS DR模式中 负责修改目标IP(VIP) mac地址 改为后端RS服务器的mac
  2. DR模式中 lvs主要处理用户的请求,响应通过后端RS服务器直接给用户
  3. LVS 与 后端RS服务器要在同一个局域网(网段)
  4. DR模式中 RS服务器要有公网ip地址
  5. 需要注意RS节点的VIP的绑定 (lo:vip/32) 和ARP抑制问题
  6. 由于DR模式的调度器仅进行了目的的MAC地址的改写,因此,调度器无法改变请求报文的目的端口。也就是说 LVS DR模式在二层数据链路层(MAC)工作,**NAT模式是在三层网络层(IP)和四层传输层(端口)**工作。

4.4 LVS-NAT模式(三层和四层)

原理简述

客户端向VIP发起请求连接,Director在经过调度之后选取RS,将本地端口与RS的端口做映射,然后RS返还数据Director将数据返还客户端

把客户端发来的数据包在Director调度器上将目的地址封装成其中一台RS的IP地址,并发至该RS来处理,RS处理完成后把数据包发给Director调度器,调度器再把数据包的源IP地址封装成为自己的IP,将目的地址封装成客户端IP地址,然后发给客户端。无论是进来的流量,还是出去的流量,都必须经过调度器。

CIP—>VIP—>RIP:源IP(客户端)→Director(客户端IP与RS做端口或IP映射)→目的IP(RS的IP)

RIP—>VIP—>CIP:源IP(RS的IP)→Director(将RS的IP映射为VIP)→目的IP(客户端IP)

image.png

image.png

image

image

特点:

  1. NAT Network Address Translation 网络地址转换
  2. 开启了内核转发功能 net.ipv4.ip_forward = 1 #/etc/sysctl.conf
  3. 通过NAT模式 可以实现 例如:端口转发 请求80 后端转发为8080
  4. lvs与后端RS服务器 可以不在一个局域网

4.5 LVS-TUNNEL 隧道模式

原理简述
客户端向VIP发送请求时,[源CIP;目的VIP],Director经过调度轮询后选择一个RS后使用隧道技术再次封装后向RS发送【源DIP;目的RIP [源CIP;目的VIP]】,RS通过隧道收到请求后拆开数据后得到[源CIP;目的VIP],发现目的IP为自己L0接口的IP得,后就把数据收下,找到数据后将数据直接通过公网返还给客户端[源VIP;目的CIP]

1.客户端将访问vip报文发送给LVS服务器;
2.LVS服务器将请求报文重新封装,发送给后端真实服务器;
3.后端真实服务器将请求报文解封,在确认自身有vip之后进行请求处理;
4.后端真实服务器在处理完数据请求后,直接响应客户端。

image

image

image

特点:

1.lvs和后端真实服务器上都要有vip。
2.不会成为瓶颈。
3.请求的报文不能太大。

优缺点:

1.快速

2.不安全,不能抵抗DOS攻击

image

4.6 FULL NAT转发模式

相关链接:https://blog.csdn.net/aaaaaab_/article/details/81331014

FULLNAT原理:
FULLNAT转发数据包是类似NAT模式,IN和OUT数据包都是经过LVS;唯一的区别:后端RS 或者交换机不需要做任何配置。
FULLNAT的主要原理是引入local address(内网ip地址),cip-vip转换为lip->rip,而 lip和rip均为IDC内网ip,可以跨vlan通讯

诞生原因:

在大规模的网络下,在淘宝的业务中,官方LVS满足不了需求;原因有3点,

  1. 刚才讲三种转发模式,部署成本比较高;
  2. 和商用的负载均衡比,LVS没有DDOS防御攻击功能;
  3. 主备部署模式,性能无法扩展;一个VIP下的流量特别大怎么办?

NAT模式与FULLNAT模式对比

相比NAT模式,FullNAT多了一个Local IP,IP地址转换时,源和目的IP都改了,即SNAT+DNAT。

图一为NAT模式 图二为FULLNAT模式

image

image

FULLNAT模式的优缺点:

FULLNAT一个最大的问题是:RS无法获得用户IP;为了解决这个问题我们提出了TOA的概念,主要原理是:将client address放到了TCP Option里面带给后端RS,RS上通过toa内核模块hack了getname函数,给用户态返回TCP Option中的client ip。

fullnat模式和nat模式相似,但是与nat不同的是nat模式只做了两次地址转换,fullnat模式却做了四次。

本地环回接口(或地址),亦称回送地址(loopback address)。
此类接口是应用最为广泛的一种虚接口,几乎在每台路由器上都会使用。常见于如下用途:
1 、作为一台路由器的管理地址
系统管理员完成网络规划之后,为了方便管理,会为每一台路由器创建一个loopback 接口,并在该接口上单独指定一个IP 地址作为管理地址,管理员会使用该地址对路由器远程登录(telnet ),该地址实际上起到了类似设备名称一类的功能。
但是通常每台路由器上存在众多接口和地址,为何不从当中随便挑选一个呢?
原因如下:由于telnet 命令使用TCP 报文,会存在如下情况:路由器的某一个接口由于故障down 掉了,但是其他的接口却仍旧可以telnet ,也就是说,到达这台路由器的TCP 连接依旧存在。所以选择的telnet 地址必须是永远也不会down 掉的,而虚接口恰好满足此类要求。由于此类接口没有与对端互联互通的需求,所以为了节约地址资源,loopback 接口的地址通常指定为32 位掩码

2 、使用该接口地址作为动态路由协议OSPF 、BGP 的router id 动态路由协议OSPF 、BGP 在运行过程中需要为该协议指定一个Router id ,作为此路由器的唯一标识,并要求在整个自治系统内唯一。由于routerid 是一个32 位的无符号整数,这一点与IP 地址十分相像。而且IP 地址是不会出现重复现象的,所以通常将路由器的router id 指定为与该设备上的某个接口的地址相同。由于loopback 接口的IP 地址通常被视为路由器的标识,所以也就成了router id 的最佳选择。
3、使用该接口地址作为BGP 建立TCP 连接的源地址
在BGP 协议中,两个运行BGP 的路由器之间建立邻居关系是通过TCP 建立连接完成的。
在配置邻居时通常指定loopback 接口为建立TCP 连接的源地址

5.LVS-DR模式搭建

5.1 准备环境
机器主机名 ip eth0 ip eth1
lb01 10.0.0.5 172.16.1.5
lb02 10.0.0.6 172.16.1.6
web01 10.0.0.7 172.16.1.7
web02 10.0.0.8 172.16.1.8

lb01 lb02上下载软件

yum install -y ipvsadm

#关闭nginx负载均衡与keepalived

systemctl stop nginx.service keepalived.service 

systemctl disable nginx.service keepalived.service 

image

web01 web02配置

#添加静态页面
curl 10.0.0.[7-8]/indexl.html
web01
web02

为web01和web02配置nginx文件(配置相同)

[root@web01 ~]# cat /etc/nginx/nginx.conf #查看

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;   #include指向到conf.d/下
}

[root@web01 ~]# cat /etc/nginx/conf.d/01-blog.conf #web01配置站点
server   {
    listen       80;
    server_name  blog.oldboy.com;
    access_log  /var/log/nginx/access_www.log  main;
    root   /app/nginx/html/blog;    #指定站点目录
    location / {
    index  index.php index.html index.htm;
    }
   location ~* \.(php|php5)$ {
       fastcgi_pass   127.0.0.1:9000;
       fastcgi_index  index.php;
       fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }
    }
[root@web01 ~]# nginx -t    #检查语法
[root@web01 ~]# systemctl restart nginx #重启nginx

web02相同配置

为web01和web02添加静态网页

[root@web01 ~]# cat /app/nginx/html/blog/index.html 
web01
<h1> nginx server 10.0.0.7 web01 <h1>

[root@web02 ~]# cat /app/nginx/html/blog/index.html 
web02
<h1> nginx server 10.0.0.8 web02 <h1>

在lb01上检查一下

[root@lb01 ~]# curl 10.0.0.[7-8]

[1/2]: 10.0.0.7 --> <stdout>
--_curl_--10.0.0.7
web01
<h1> nginx server 10.0.0.7 web01 <h1>

[2/2]: 10.0.0.8 --> <stdout>
--_curl_--10.0.0.8
web02
<h1> nginx server 10.0.0.8 web02 <h1>

5.2 LVS-DR模式部署

LVS

加载内核模块

modprobe ip_vs #直接运行ipvsadm -ln

[root@lb01 ~]# ipvsadm -ln 
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags 
  -> RemoteAddress:Port            Forward Weight ActiveConn InActConn 
[root@lb01 ~]# lsmod |grep ip_vs #检查内核模块
ip_vs                   145497 0 
nf_conntrack            133095 1 ip_vs 
libcrc32c                12644 3 xfs,ip_vs,nf_conntrack

5.3 LVS服务器配置语句与参数

lb01 lb02

ip addr add 10.0.0.3/24 dev eth0 label eth0:0   #添加虚拟IP

ipvsadm -C  #清空规则

ipvsadm --set 30 5 60   #设置tcp超市时间

ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20  #创建池塘,设置轮询模式与报错时间

ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1    #添加RS服务器web01,选择模式并设置权重

ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1    #添加RS服务器web02,选择模式并设置权重

ipvsadm -ln     #查看LVS的配置情况

ipvsadm
-C 清除所有规则
-A nginx创建池塘
-t tcp协议
-s scheduler 轮询算法 wrr(加权轮询)
-p persistent 会话报错的时间 20秒 默认是300s
-a 添加RS服务器(nginx server)
-r 指定RS服务器 ip
-g –gatewaing 使用DR模式 (-Directing Routing)
-w weight 权重

image

#lb01与lb02配置后的情况

[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr persistent 20
  -> 10.0.0.7:80                  Route   1      0          0         
  -> 10.0.0.8:80                  Route   1      0          0  

[root@lb02 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr persistent 20
  -> 10.0.0.7:80                  Route   1      0          0         
  -> 10.0.0.8:80                  Route   1      0          0  

为保证配置后的规则防止清除,恢复

[root@lb01 ~]# ipvsadm-save -n  #查看规则
-A -t 10.0.0.3:80 -s wrr -p 20
-a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
-a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
[root@lb01 ~]# #ipvsadm-save -n >/root/ipvsadm.rules    #将lvs规则追加到文件
[root@lb01 ~]# ipvsadm -C   #清除规则测试
[root@lb01 ~]# ipvsadm -ln  #查看规则已经没有了
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lb01 ~]# cat /root/ipvsadm.rules  #查看之前备份的规则
-A -t 10.0.0.3:80 -s wrr -p 20
-a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
-a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
[root@lb01 ~]# ipvsadm-restore </root/ipvsadm.rules     #将备份的规则归还
[root@lb01 ~]# ipvsadm -ln  #再次查看已经恢复
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr persistent 20
  -> 10.0.0.7:80                  Route   1      0          0         
  -> 10.0.0.8:80                  Route   1      0          0         

5.4 RS服务器配置参数语句

web01 web02

ip addr add 10.0.0.3/32 dev lo label lo:1   #添加本地回环地址 虚拟IP

[root@web01 ~]# ip a s lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 10.0.0.3/32 scope global lo:1  #此IP为本地回环地址
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever 


cat >>/etc/sysctl.conf<<EOF #配置内核转发

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

EOF

sysctl -p   #让其生效

5.5 测试lvs负载均衡注意事项:
  1. 不要再lvs本地进行测试
  2. lvs使用在高并发,
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!