系统学习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内容分发网络---网页缓存加速

相关推荐
路溪非溪9 分钟前
关于Linux内核中头文件问题相关总结
linux
海绵不是宝宝8171 小时前
连接远程服务器上的 jupyter notebook,解放本地电脑
服务器·jupyter·github
Lovyk2 小时前
Linux 正则表达式
linux·运维
Fireworkitte3 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9004 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char4 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
繁星¹⁸⁹⁵5 小时前
通过update-alternatives可以实现cuda的多版本切换
服务器
淮北也生橘126 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
开航母的李大8 小时前
软件系统运维常见问题
运维·服务器·系统架构·运维开发
华强笔记9 小时前
Linux内存管理系统性总结
linux·运维·网络