系统学习Linux-LVS集群

集群概述

负载均衡技术类型

四层负载均衡器 也称为 4 层交换机,主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡,如常见的 LVS、F5 等;

七层负载均衡器 也称为 7 层交换机,位于 OSI 的最高层,即应用层,此负载均衡器支持多种协议,如HTTP、FTP、SMTP 等。7 层负载均衡器可根据报文内容,配合一定的负载均衡算法来选择后端服务器,即"内容交换器"。如常见的 HAProxy、Nginx。

负载均衡实现方式

硬件负载均衡产品:F5 、深信服 、Radware

软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server)

LVS结构

三层结构:负载调度器、服务器池、共享存储

架构对象:

VS:Virtual Server,也称为 Director,负载均衡服务器

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

VIP:Director 向外部提供服务的 IP

DIP:Director 向内部与 RS 通信的 IP

RIP:真实服务器的 IP

CIP:客户端的 IP

LVS工作模式

LVS-NAT(NAT模式)

LVS-DR(直接路由模式)(应用最广泛)

LVS-TUN(IP隧道(Tunnel)模式,不常用)

FULL-NAT模式(双向转换模式,不常用)

LVS负载均衡算法

静态负载均衡:

rr(round robin,轮询 )

wrr(weight round robin,加权轮询)

sh(source hashing,源地址散列算法(HASH))

dh(destination hashing,目标地址 HASH)

动态负载均衡:

lc(leash-connection,最少连接 )

简单算法:active * 256 + inactive (谁的小选谁)

wlc(加权最少连接)

简单算法:(active * 256 + inactive) / weight(谁的小选谁)

sed(最少期望延迟)

简单算法:(active + 1) * 256 / weight (谁的小选谁)

nq(never queue,永不排队)

LBLC(基于局部性的最少连接 )

LBLCR(基于局部性的带复制功能的最少连接)

ipvsadm命令详解

|----|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| -A | 添加虚拟服务节点 |
| -D | 删除虚拟服务节点 |
| -L | 查看虚拟服务节点列表 |
| -a | 添加真实服务节点 |
| -d | 删除真实服务节点 |
| -l | 查看真实服务节点列表 |
| -t | 指定虚拟服务器IP地址 |
| -s | 指定调度算法 |
| -r | 指定真实服务器节点IP地址 |
| -w | 指定权重值 |
| -g | 直接路由模式(默认) |
| -i | 隧道模式(不常用) |
| -m | NAT模式 |
| 案例 | ipvsadm -A -t 207.175.44.110:80 -s rr ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.2:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.3:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.4:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.5:80 -m |

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 基础配置 |
| systemctl stop firewalld.service systemctl stop NetworkManager setenforce 0 sed -i "s/ONBOOT=no/ONBOOT=yes/" /etc/sysconfig/network-scripts/ifcfg-ens33 cat /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network |
| 修改主机名 |
| 关闭防火墙 |
| 关闭Selinux |
| 关闭Networkmanager |
| 配置IP地址 |

LVS配置案例

实现NAT模型搭建

负载调度器配置

配置IP地址

增加一块网卡

配置ens33和ens37网卡添加路由转发

cpp 复制代码
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
#网卡1配置
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.31.4
PREFIX=24
GATEWAY=192.168.31.2
DNS1=192.168.31.2
[root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens37
#网卡2配置
TYPE=Ethernet
BOOTPROTO=static
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=192.168.217.100
PREFIX=24
GATEWAY=192.168.217.3
DNS1=192.168.217.3

[root@localhost ~]# vim /etc/sysctl.d/route.conf 
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p /etc/sysctl/route.conf

查看网卡

修改宿主机

测试网通性

LVS2、LVS3(web1、web2)

安装nginx

cpp 复制代码
#LVS2机器上nginx1网页配置
[root@localhost html]# yum -y install nginx
[root@localhost html]# systemctl start nginx
[root@localhost html]# ss -anl | grep :80
nl     UNCONN     0      0         0:805                    *                   
nl     UNCONN     0      0         0:805                    *                   
tcp    LISTEN     0      128       *:80                    *:*                  
tcp    LISTEN     0      128    [::]:80                 [::]:*    

#网络源安装完成后修改网关联到LVS主机ens37上
[root@localhost html]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.31.5
PREFIX=24
GATEWAY=192.168.217.100
DNS1=192.168.31.2
[root@localhost html]# ifdown ens33 && ifup ens33
成功断开设备 "ens33"。
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7)

#写网页内容一会测试用
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# echo nginx1 index.html 
nginx1 index.html
[root@localhost html]# echo nginx1 > index.html 

#LVS3机器上nginx2网页
[root@localhost html]# yum -y install nginx
[root@localhost html]# systemctl start nginx
[root@localhost html]# ss -anl | grep :80
nl     UNCONN     0      0         0:809                    *                   
nl     UNCONN     0      0         0:809                    *                   
nl     UNCONN     0      0        15:809                    *                   
nl     UNCONN     0      0        15:809                    *                   
nl     UNCONN     0      0        16:809                    *                   
tcp    LISTEN     0      128       *:80                    *:*                  
tcp    LISTEN     0      128    [::]:80                 [::]:*           

#网络源安装完成后修改网关联到LVS主机ens37上
[root@localhost html]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.31.6
PREFIX=24
GATEWAY=192.168.217.100
DNS1=192.168.31.2
[root@localhost html]# ifdown ens33 && ifup ens33
成功断开设备 "ens33"。
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7)

#写网页内容一会测试用
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# echo nginx2 index.html 
nginx1 index.html
[root@localhost html]# echo nginx2 > index.html 

回到LVS1继续配置

通信与配置后主机安装

yum install -y ipvsadm

加载ip_vs模块并检测

启动ipvsadm服务

systemctl start ipvsadm

启动会报错少目录文件

创建目录

cpp 复制代码
#创建目录后可以启动但没有文件
[root@localhost ~]# mkdir /etc/sysconfig/ipvsadm
[root@localhost ~]# systemctl start ipvsadm
[root@localhost ~]# ipvsadm -A -t 192.168.217.100:80 -s rr
[root@localhost ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  localhost.localdomain:http rr
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.217.100:80 rr
#移动到ipvadm配置负载分配策略
root@localhost sysctl.d]# ipvsadm -A -t 192.168.217.100:80 -s rr
[root@localhost sysctl.d]# ipvsadm -a -t 192.168.217.100:80 -r 192.168.31.5:80 -m
[root@localhost sysctl.d]# ipvsadm -a -t 192.168.217.100:80 -r 192.168.31.6:80 -m
[root@localhost sysctl.d]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.217.100:80 rr
  -> 192.168.31.5:80              Masq    1      0          0         
  -> 192.168.31.6:80              Masq    1      0          0   
[root@localhost sysctl.d]# ipvsadm-save > /etc/sysconfig/ipvsadm/ipvsadm 
[root@localhost sysctl.d]# cd /etc/sysconfig/ipvsadm/
[root@localhost ipvsadm]# ls
ipvsadm
    

配置好后测试ctrl+f5刷新会从web1和web2一直跳转


实现DR模型搭建

DR模型原理

LVS-DR的工作原理就是:通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址,源IP/PORT,以及目标IP/PORT均保持不变

LVS-DR:直接路由的特点

Director和各RS上都配置使用VIP

(1)确保前端路由将目标IP为VIP的请求报文发往Director

(a)在前端网关做静态绑定

(b)在RS上使用arptables

(c)在RS上修改内核参数以限制ARP通告和应答级别

arp_announce

arp-ignore

(2)RS的RIP可以使用私网地址,也可以是公网地址,RIP与DIP在同一IP网络,RIP的网关不能指向DIP,以确保响应报文不会经由Director

(3)RS跟Director要在同一个物理网络

(4)请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client

(5)不支持端口映射


还用刚才的试验机所以要关闭网卡2 清空数据还原成新的主机

cpp 复制代码
[root@localhost ~]#  ipvsadm -C
[root@localhost ~]#  ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

删除ens37配置文件

留一块ens33的配置文件网卡

删除ipvsadm的配置文件 并创建新的ipvsadm配置文件

cpp 复制代码
[root@localhost ~]# rm -rf /etc/sysconfig/ipvsadm
[root@localhost ~]# touch /etc//sysconfig/ipvsadm

删除路由转发功能

cpp 复制代码
[root@localhost ~]# cd /etc/sysctl.d/
[root@localhost ~]# rm -rf route.conf

复制网卡配置ens33:0

cpp 复制代码
[root@localhost sysctl.d]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]# vim ifcfg-ens33:0
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.31.200
PREFIX=24
#GATEWAY=192.168.31.2
#DNS1=192.168.31.2
[root@localhost network-scripts]# systemctl restart network

配置负载分配策略

cpp 复制代码
[root@localhost network-scripts]# ipvsadm -A -t 192.168.31.200:80 -s rr
[root@localhost network-scripts]# ipvsadm -a -t 192.168.31.200:80 -r 192.168.31.5:80 -g
[root@localhost network-scripts]# ipvsadm -a -t 192.168.31.200:80 -r 192.168.31.6:80 -g
[root@localhost network-scripts]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.31.200:80 rr
  -> 192.168.31.5:80              Route   1      0          0         
  -> 192.168.31.6:80              Route   1      0          0     

保存策略

cpp 复制代码
[root@localhost network-scripts]# ipvsadm-save > /etc/sysconfig/ipvsadm

接下来配置两台web

先将两台web服务器上注销网关与DNS

cpp 复制代码
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@localhost ~]# systemctl restart network

首先负载调度器配置

内核参数配置生效后才可以进行配置web节点配置

调整ARP参数

cpp 复制代码
[root@localhost ~]# vim /etc/sysctl.conf 
[root@localhost ~]# sysctl -p
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

配置虚拟ip地址

注意:web服务器虚拟地址为32位子网验码

cpp 复制代码
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# ls
ifcfg-ens33    ifdown-ib    ifdown-routes    ifup-aliases  ifup-isdn    ifup-sit          network-functions
ifdown-ippp  ifdown-sit       ifup-bnep     ifup-plip    ifup-Team         network-functions-ipv6
ifcfg-lo       ifdown-ipv6  ifdown-Team      ifup-eth      ifup-plusb   ifup-TeamPort
ifdown         ifdown-isdn  ifdown-TeamPort  ifup-ib       ifup-post    ifup-tunnel
ifdown-bnep    ifdown-post  ifdown-tunnel    ifup-ippp     ifup-ppp     ifup-wireless
ifdown-eth     ifdown-ppp   ifup             ifup-ipv6     ifup-routes  init.ipv6-global
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.31.200
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback:0
[root@localhost network-scripts]# systemctl  restart network
[root@localhost network-scripts]# ip a
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 192.168.31.200/32 brd 192.168.31.200 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:12:94:c3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.5/24 brd 192.168.31.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe12:94c3/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:45:34:d8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:45:34:d8 brd ff:ff:ff:ff:ff:ff

web服务器分别添加回环路由

cpp 复制代码
[root@localhost network-scripts]# route add -host 192.168.31.200/32 dev lo:0
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.31.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.31.200  0.0.0.0         255.255.255.255 UH    0      0        0 lo

这样重启就没有了 写到etc下的bashrc或

写下来就可以访问了

ctrl+f5

也可以先tcpdump抓包

tcpdump -i ens33:0 >> ./tcpdump.txt

查找看http的包

或者用Wireshark抓包软件 可以看到全是200网段看不到web1、2的ip地址

课下了解内容CDN内容分发网络---网页缓存加速

相关推荐
耶啵奶膘6 分钟前
uniapp-是否删除
linux·前端·uni-app
2401_850410831 小时前
文件系统和日志管理
linux·运维·服务器
XMYX-02 小时前
使用 SSH 蜜罐提升安全性和记录攻击活动
linux·ssh
一只哒布刘3 小时前
NFS服务器
运维·服务器
二十雨辰4 小时前
[linux]docker基础
linux·运维·docker
饮浊酒4 小时前
Linux操作系统 ------(3.文本编译器Vim)
linux·vim
lihuhelihu5 小时前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算
矛取矛求5 小时前
Linux系统性能调优技巧
linux
山东布谷科技官方5 小时前
布谷直播源码部署服务器关于数据库配置的详细说明
运维·服务器·数据库·直播系统源码·直播源码·直播系统搭建·直播软件开发
One_Blanks5 小时前
渗透测试-Linux基础(1)
linux·运维·安全