LVS定义

linux virtual server,linux虚拟服务器,从linux内核2.6版本开始作为内核的模块集成在linux内核中,使用时此功能只需要加载该模块即可,可以实现负载均衡集群搭建的功能

LVS结构

  • 负载调度层 由一台或者多台调度器组成,在调度器上加载LVS对应的内核模块,生成虚拟IP,客户端与虚拟IP进行通信,调度器接收到客户端的请求之后,根据配置的调度器算法将请求交给合适的后端节点
  • 服务器节点集群 用来接收调度器转发过来的客户端的请求,然后处理并响应
  • 共享存储层 用来保证服务节点之间的数据的一致性

LVS调度模式

  • NAT 网络地址转换,客户端通过虚拟IP与调度器给客户端进行通信(客户端发送的请求包源IP为客户端的IP地址,目的IP为集群的虚拟IP)调度器接收到该请求包时根据自身配置的调度算法选出一台处理该请求的后端服务节点,并将客户端发来的请求包转发给该服务节点(调度器在转发请求包之前,将请求包的目的IP改为后端web节点的IP地址,源IP为客户端的IP),后端服务节点接收到调度器转发的请求包并处理,将响应包发送给调度器(响应包源IP为后端节点的IP),调度器接收到响应包对源IP进行转换,转换为集群的虚拟IP之后,调度器再将该响应包转发
  • DR 直接路由。调度器与后端节点都需要配置虚拟IP,客户端通过虚拟IP与调度器实现通信(客户端发送的请求包源IP为客户端IP,目的是IP的虚拟IP),调度器根据自身配置的调度算法选择一台合适的服务节点来处理该请求,此时调度器将客户端的请求包的目的MAC转换为选择的后端服务节点的MAC地址,并将该请求交给服务节点,服务节点处理完该请求后直接通过虚拟IP向响应包发送给客户端,不需要再经过调度器, 在该模式下需要注意2个问题: 1、客户端发送的arp请求只能由调度器响应,后端web节点不能响应 2、服务节点使用物理网卡的IP发送arp请求,使用本地回环网卡的虚拟IP发送响应包
  • TUN IP隧道。客户端通过虚拟IP与调度器进行通信,调度器接收到客户端发送的请求包之后,会对该请求包进行二次封装,源IP为调度器的真实IP,目的IP为后端节点的IP地址,并将该请求包转发给通过调度算法选出的合适的后端服务节点,后端服务节点处理完该请求包之后,直接响应客户端,不再经过调度器

调度算法

  • 静态调度算法:根据算法本身定义进行调度 rr(round roubin):轮询,将客户端发来的请求依次交给后端的服务节点 wrr(weight round robin):加权轮询,给后端节点设置权重值,权重值越高的阶段的节点处理的请求就越多 sh:源地址散列,对客户端请求包的源IP进行hash计算,得出客户端最近一次访问服务节点并将请求交给该节点 dh:目标地址散列,对客户端请求包的目的IP进行hash计算,得出客户端最近一次访问服务节点并将请求交给该节点
  • 动态调度算法:根据算法以及服务节点自身负载能力进行调度 lc(least connections):最少连接数,调度器将请求交给此时连接数最少的服务节点 wlc(weight least connections):加权最少连接数,给后端节点设置不同的权重值,调度器通过权重值以及后端节点的连接数的综合考虑来分配请求 lblc:基于局部的最少连接,通过DH得到的服务节点没办法处理客户端的请求时,调度器会在节点集群中找出此时连接数最少的一台节点来处理该请求 lblcr:带复制的基于局部的最少连接,通过DH得到的服务节点没办法处理客户端的请求时,调度器会在节点组中找出一台处理该请求,如果节点组中的服务节点都不能处理该请求,则从节点集群中找出一台连接数最少的节点加入节点组并处理请求

ipvsadm命令详解

ipvsadm是ipvs的管理器,需要yum安装。

基本用法:

ipvsadm COMMAND [protocol] service-address [scheduling-method] [persistence options]

ipvsadm COMMAND [protocol] service-address server-address [packet-forwarding-method] [weight options]

第一条命令用于向LVS系统中添加一个用于负载均衡的virtual server(VS);第二条命令用来修改已经存在的VS的配置,service address用来指定涉及的虚拟服务即虚拟地址,server-address指定涉及的真实地址。

命令参数:

  • ``` -A –add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。 ```
  • ``` -E –edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。 ```
  • ``` -D –delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。 ```
  • ``` -C –clear 清除内核虚拟服务器表中的所有记录。 ```
  • ``` -R –restore 恢复虚拟服务器规则 ```
  • ``` -S –save 保存虚拟服务器规则,输出为-R 选项可读的格式 ```
  • ``` -a –add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器 ```
  • ``` -e –edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录 ```
  • ``` -d –delete-server 删除一条虚拟服务器记录中的某条真实服务器记录 ```
  • ``` -L|-l –list 显示内核虚拟服务器表 ```
  • ``` -Z –zero 虚拟服务表计数器清零(清空当前的连接数量等) ```
  • ``` –set tcp tcpfin udp 设置连接超时值 ```
  • ``` –start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。 ```
  • ``` –stop-daemon 停止同步守护进程 ```
  • ``` -h –help 显示帮助信息 ``` 其他的选项:
  • ``` -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 标记过的服务类型。 ```
  • ``` -s –scheduler scheduler 使用的调度算法,有这样几个选项 rr | wrr | lc | wlc | lblc | lblcr | dh | sh | sed | nq,默认的调度算法是: wlc. ```
  • ``` -p –persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。 ```
  • ``` -M –netmask netmask persistent granularity mask ```
  • ``` -r –real-server server-address 真实的服务器[Real-Server:port] ```
  • ``` -g –gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式) ```
  • ``` -i –ipip 指定LVS 的工作模式为隧道模式 ```
  • ``` -m –masquerading 指定LVS 的工作模式为NAT 模式 ```
  • ``` -w –weight weight 真实服务器的权值 ```
  • ``` –mcast-interface interface 指定组播的同步接口 ```
  • ``` -c –connection 显示LVS 目前的连接 如:ipvsadm -L -c ```
  • ``` –timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L –timeout ```
  • ``` –daemon 显示同步守护进程状态 ```
  • ``` –stats 显示统计信息 ```
  • ``` –rate 显示速率信息 ```
  • ``` –sort 对虚拟服务器和真实服务器排序输出 ```
  • ``` –numeric -n 输出IP 地址和端口的数字形式 ```

LVS部署

NAT模式

实验环境

  • 开启路由转发
  • 关闭防火墙、沙盒
角色LVSWeb 1Web 2Client
IP地址192.168.1.100 192.168.10.100192.168.1.101192.168.1.102192.168.10.101
网关开启路由转发192.168.1.100192.168.1.100192.168.10.100

开启路由转发(LVS)

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

加载LVS模块

[root@localhost ~]# modprobe ip_vs

安装LVS命令行工具

[root@localhost ~]# mount /dev/cdrom /media/
[root@localhost ~]# cd /media/Packages/
[root@localhost Packages]# rpm -ivh ipvsadm-1.27-7.el7.x86_64.rpm

创建集群

[root@localhost ~]# ipvsadm -A -t 192.168.10.100:80 -s 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.10.100:80 rr

将节点加入集群

[root@localhost ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.1.101:80 -m
[root@localhost ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.1.102:80 -m

保存集群状态

[root@localhost ~]# ipvsadm -S

修改nginx配置文件(web1/2服务器)

# 修改此参数等于0即可
  keepalive_timeout 0;

重启nginx服务

[root@localhost ~]# nginx -s reload

修改前端页面

[root@localhost ~]# echo "Web1 192.168.1.101" > /usr/local/nginx/html/index.html
[root@localhost ~]# echo "Web2 192.168.1.102" > /usr/local/nginx/html/index.html

测试访问(Client )

[root@localhost ~]# curl 192.168.1.100
Welcome to Web1:192.168.1.101
[root@localhost ~]# curl 192.168.1.100
Welcome to Web2:192.168.1.102
[root@localhost ~]# curl 192.168.1.100
Welcome to Web1:192.168.1.101
[root@localhost ~]# curl 192.168.1.100
Welcome to Web2:192.168.1.102

DR模式

实验环境

  • 关闭防火墙、沙盒
角色LVSWeb 1Web 2Client
IP地址192.168.1.11192.168.1.22192.168.1.33192.168.1.44
虚拟IP 192.168.1.100

添加虚拟IP(LVS)

[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:1
[root@localhost network-scripts]# vim ifcfg-ens33:1
# 修改以下参数即可
NAME=ens33:1
DEVICE=ens33:1
IPADDR=192.168.1.100
# 重启网卡
[root@localhost network-scripts]# systemctl restart network

加载ip_vs模块

[root@localhost ~]# modprobe ip_vs

安装LVS命令行工具

[root@localhost ~]# yum -y install ipvsadm

创建集群

[root@localhost ~]# ipvsadm -A -t 192.168.1.100:80 -s rr

将节点加入集群

向虚拟服务器中添加web服务器的真实IP,这样客户端在访问虚拟IP的时候就能访问到web服务器 -g表示使用DR模式

[root@localhost ~]# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.22 -g
[root@localhost ~]# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.33 -g

保存节点状态

[root@localhost ~]# ipvsadm -S

添加虚拟IP(Web1 / Web2)

[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:1
[root@localhost network-scripts]# vim ifcfg-lo:1
# 修改为以下参数
DEVICE=lo:1
IPADDR=192.168.1.100
NETMASK=255.255.255.255
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
ONBOOT=yes
NAME=web1    # web2的名称为web2
# 重启网卡
[root@localhost network-scripts]# systemctl restart network

添加内核参数

[root@localhost ~]# vim /etc/sysctl.conf 
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1      # 关闭本地循环的arp请求
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2    # 开启ens33网卡的arp请求
[root@localhost ~]# sysctl -p     # 立即生效

安装nginx

修改nginx配置文件

# 修改此参数等于0即可
  keepalive_timeout 0;

重载nginx配置文件

[root@localhost ~]# nginx -s reload

修改nginx前端页面(Web1)

[root@localhost ~]# echo "Welcome to Web1:192.168.1.22" > /usr/local/nginx/html/index.html

修改nginx前端页面(Web2)

[root@localhost ~]# echo "Welcome to Web1:192.168.1.33" > /usr/local/nginx/html/index.html

测试访问(客户端)

# 访问虚拟IP
[root@localhost ~]# curl 192.168.1.100
Welcome to Web1:192.168.1.22
[root@localhost ~]# curl 192.168.1.100
Welcome to Web1:192.168.1.33
[root@localhost ~]# curl 192.168.1.100
Welcome to Web1:192.168.1.22
[root@localhost ~]# curl 192.168.1.100
Welcome to Web1:192.168.1.33
Last modification:July 23rd, 2020 at 09:53 pm
如果觉得我的文章对你有用,请随意赞赏