LVS负载均衡群集

一、LVS简介

LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。

(https://cloud.tencent.com/developer/article/2054205)

群集:

cluster,集群、群集

多台主机构成,表现为一个整体,只提供一个访问入口(域名、IP地址),相当于一台大型计算机,与集群相反的叫分布式

目的:满足互联网对站点性能、响应速度、稳定性、可靠性的高要求

特点:多台主机构成,都干同一件事,对外展现为一个整体

二、群集分三类

1.负载均衡群集(load balance cluster)LB
  • 提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体性能

  • LB的负载分配依赖于主节点的分流算法,将来自客户机的访问请求分担给多个服务器节点,从而缓解整个系统的负载压力。例如,“DNS轮询” “反向代理”等

典型代表:软件类:LVS(基于内核转发)、Nginx(基于软件转发)、HAProxy等;硬件类:F5、绿盟等

2.高可用群集(high availability cluster)HA
  • 提高应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,达到高可用 (HA)的容错效果(几个九,99.9%)

  • HA的工作方式包括双工和主从两种模式,双工即所有节点同时在线主从则只有主节点在线,但当出现故障时从节点能自动切换为主节点例如,“故障切换”“双机热备”等

典型代表:keepalived、heartbeat

3.高性能运算群集(high performance computer cluster)HPC
  • 以提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力

  • 高性能依赖于“分布式运算”、“并行计算”,通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力。例如,“云计算”“网格计算”等

通过云计算或分布式计算来获取高性能的CPU、内存等资源,来提高整体运算能力

三、负载均衡的结构类型

几个九,三个九(99.9%)五个久(99.999%)

第一层,负载调度器(load balabcer或director)

访问整个群集系统的唯一入口,对外使用所有服务器共有的VIP地址,也称为群集IP 地址。通常会配置主、备两台调度器实现热备份,当主调度器失效以后能够平滑替换至备用调度器,确保高可用性。

第二层,服务器池(Server Pool)

群集所提供的应用服务、由服务器池承担,其中每个节点具有独立的RIP地址(真实IP),只处理调度器分发过来的客户机请求。当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池。

第三层,共享存储(Share Storage)

为服务器池中的所有节点提供稳定、一致的文件存取服务,确保整个群集的统一性共享存储可以使用NAS设备,或者提供NFS共享服务的专用服务器

资源池方便了集群里每个服务器调用相同资源,即为共享存储。

四、负载均衡集群工作模式

1.地址转换(NAT模式)
  • 类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口

  • 服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式

调度机会做网关,承载双向流通压力;有一定的安全性

调度器会作为所有节点服务器的默认网关,也是客户端的访问入口和节点服务器返回响应消息的出口,也就是说调度器会承载双向数据流量的负载压力,可能会成为整个群集的性能瓶颈。由于节点服务器都处于内网环境,使用私网IP地址,所有具有一定的安全性。

2.IP隧道(TUN模式)
  • 采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器

  • 服务器节点分散在互联网中的不同位置具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信

调度器仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。但是由于节点服务器需要部署在不同位置的公网环境中,需要具有独立的公网IP,调度器与节点服务器是通过专用的IP隧道实现相互通信的,因此IP隧道模式的成本较高,安全性较低,且IP隧道需要额外的封装和解封装,性能会受到一定影响

3.直接路由(DR模式)
  • 采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络

  • 负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道

调度器仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。(与NAT模式的区别)

节点服务器与调度器是部署在同一个物理网络内,因此不需要建立专用的IP隧道。(与TUN模式的区别)

DR模式是企业首选的LVS模式

 modprobe ip_vs
 cat /proc/net/
 ls /usr/lib/modules/3.10.0-1160.71.1.el7.x86_64/kernel/net/netfilter/ipvs
 ​
 awk -F . '{print $1}'
 [root@localhost ~]#for i in `ls /usr/lib/modules/3.10.0-1160.71.1.el7.x86_64/kernel/net/netfilter/ipvs`;
 do k=`echo $i | awk -F . '{print $1}'`;
 modprobe $k;
 done
 ​
 ls ip_vs.ko.xz | grep -o "^[^.]*"

LVS的负载调度算法

轮询(round robin)

将收到的访问请求按照顺序轮流分配给各节点

加权轮询(weighted round robin)

  • 权重值高的优先获得任务,分配的请求数更高

  • 保证性能强的服务器承担更多访问流量

最少连接(least connections)

  • 将收到的访问请求优先分给连接数最少的节点

加权最少连接(weighted least connections)

连接数/权重=num,num越小越先被分配

LVS调度算法

rr轮询 wrr加权轮询 sh源地址哈希 dh目的地址哈希 lc最小连接 wlc加权最小连接 lblc基于地址的最小连接

LVS-NAT模式配置步骤:

1)配置NFS共享存储

2)节点服务器安装web服务(apache、nginx、tomcat),注意:默认网关要指向调度器的IP地址,测试的时候关闭连接保存

3)调度服务器要设置IP路由转发功能和设置SNAT等iptables规则,安装ipvsadm工具,配置虚拟服务器和真实节点服务器相关配置

4)客户端测试的时候,网关要指向调度器的IP地址

使用ipcsadm工具,工具选项:

 ipvsadm 工具选项说明:
 ​
 -A:添加虚拟服务器
 -D:删除整个虚拟服务器
 -s:指定负载调度算法(轮询: rr、加权轮询: wrr、最少连接: c、加权最少连接: wlc)
 -a:表示添加真实服务器(节点服务器)
 -d:删除某一个节点
 -t:指定 VIP地址及 TCP端口
 -r:指定 RIP地址及 TCP端口
 -m:表示使用 NAT群集模式
 -g:表示使用 DR模式
 -i:表示使用 TUN模式
 -w: 设置权重(权重为 时表示暂停节点)
 -P 60: 表示保持长连接60秒(默认关闭连接保持)
 -l:列表查看 Lvs 虚拟服务器(默认为查看所有 )
 -n:以数字形式显示地址、端口等信息,常与"-l"选项组合使用。ipvsadm -ln [-t VIP:PORT]

五、LVS-NAT部署实战

前提准备,关闭防火墙,不然会出现403禁止

负载调度器:内网关 ens33:192.168.177.10,外网关 ens36:12.0.0.10 Web节点服务器1:192.168.177.104 Web节点服务器2:192.168.177.105 NFS服务器:192.168.177.106 客户端:12.0.0.120

1.部署共享存储

(NFS服务器:192.168.177.106)

06号机器做NFS共享端

 systemctl stop firewalld.service
 systemctl disable firewalld.service
 setenforce 0
 ​
 yum install nfs-utils rpcbind -y
 systemctl start rpcbind.service
 systemctl start nfs.service
 ​
 systemctl enable nfs.service
 systemctl enable rpcbind.service
 ​
 mkdir /opt/kgc /opt/benet
 chmod 777 /opt/kgc /opt/benet
 echo '内容' > /opt/kgc/index.html
 echo '内容' > /opt/benet/index.html
 [root@localhost ~]# rpm -q rpcbind nfs-utils
 rpcbind-0.2.0-42.el7.x86_64
 nfs-utils-1.3.0-0.48.el7.x86_64
 ​
 [root@localhost opt]#vim /etc/exprots
 /opt/ky31 192.168.177.0/24(rw,sync,no_root_squash)
 /opt/ky32 192.168.177.0/24(rw,sync,no_root_squash)
 ​
 [root@localhost opt]# systemctl enable --now rpcbind nfs
 ​

验证

 06号机上
 [root@localhost opt]# showmount -e
 Export list for localhost.localdomain:
 /opt/ky32 192.168.177.0/24
 /opt/ky31 192.168.177.0/24
 04机上
 [root@localhost ~]# showmount -e 192.168.177.106
 Export list for 192.168.177.106:
 /opt/ky32 192.168.177.0/24
 /opt/ky31 192.168.177.0/24
 05机上
 [root@localhost ~]# showmount -e 192.168.177.106
 Export list for 192.168.177.106:
 /opt/ky32 192.168.177.0/24
 /opt/ky31 192.168.177.0/24
 ​
2.配置节点服务器

(192.168.177.105、192.168.177.104)

04号机,安装nginx,服务名nginx

 cd /etc/yum.repos.d/
 mkdir repo.bak
 mv *.repo repo.bak
 vim nginx.repo
 [nginx]
 name=nginx repo
 baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
 gpgcheck=1
 enabled=1
 gpgkey=https://nginx.org/keys/nginx_signing.key
 module_hotfixes=true
 ###1、安装、启动
 yum install -y nginx
 systemctl start httpd.service
 systemctl enable httpd.service
 ​
 vim /etc/nginx/conf.d/default.conf #进入配置文件找默认根目录
 #根目录在/usr/share/nginx/html
 #移走根目录源文件
 cd /usr/share/nginx/html/
 mv * /opt/
 ###2、挂载到根目录
 mount 192.168.177.106:/opt/ky31 /usr/share/nginx/html/
 # 文件再移回来
 mv /opt/* /usr/share/nginx/html/
 ####永久挂载
 vim /etc/fstab
 192.168.177.106:/opt/ky31 /usr/share/nginx/html nfs defaults,_netdev 0  0

05号机,安装apache,服务名httpd

 ###1、安装
 yum install -y httpd
 vim /etc/httpd/conf/httpd.conf
 ​
 #95行
 ServerName www.yml.com:80
 #添加关闭长连接命令,提升实验流畅性
 KeepAlive off
 ​
 ###2、挂载到根目录
 mount 192.168.177.106:/opt/ky32 /var/www/html/
 systemctl enable --now httpd
 ​
 ####永久挂载
 vim /etc/fstab
 192.168.177.106:/opt/ky32 /var/www/html nfs defaults,_netdev 0  0

验证:

3.配置负载调度器

(内网关 ens33:192.168.177.103,外网关 ens36:12.0.0.10)

03号机网关服务器,配置双网卡

 ​
 cd /etc/sysconfig/network-scripts/
 cp ens-33 ens-36
 [root@localhost network-scripts]#vim ifcfg-ens36#192.168.177.103
 [root@localhost network-scripts]#vim ifcfg-ens33#12.0.0.10
 #注释网关、DNS服务器地址
 ​

测试

网关服务器再开启IP转发功能

#vim /etc/sysctl.conf
#写入
net.ipv4.ip_forward=1
[root@localhost ~]#sysctl -p
net.ipv4.ip_forward = 1 #仅仅给网关增加路由转发功能还不够

节点服务器04号、05号将网关改成网关服务器的地址(192.168.177.103)

vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=192.168.177.103
#刷新
systemctl restart network

实现内网访问外网:

(1)网关配置SNAT转发规则
# 网关服务器上
iptables -nL
iptables -F#清除规则
iptables -F -t nat#清除nat表规则
#添加snat
[root@localhost ~]#iptables -t nat -A POSTROUTING -s 192.168.177.0/24 -o ens36 -j SNAT --to 12.0.0.10
#36:12.0.0.10;33:192.169.177.103
(2)加载LVS内核模块
[root@localhost ~]#cd /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/
[root@localhost ipvs]#ls
ip_vs_dh.ko.xz ip_vs_lblc.ko.xz ip_vs_nq.ko.xz ip_vs_sed.ko.xz ip_vs_wrr.ko.xz
ip_vs_ftp.ko.xz ip_vs_lblcr.ko.xz ip_vs_pe_sip.ko.xz ip_vs_sh.ko.xz
ip_vs.ko.xz ip_vs_lc.ko.xz ip_vs_rr.ko.xz ip_vs_wlc.ko.xz
#使用for循环加载所以模块 [root@localhost ipvs]#for i in ` ls /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ | grep -o "^[^.]*"`
> do
> modprobe $i
> done
#查看
[root@localhost ipvs]#cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
(3)安装ipvs工具
yum install -y ipvsadm

04号机上永久挂载nfs
vim /etc/fstab
192.168.177.106:/opt/ky31 /var/www/html nfs defaults,_netdev 0 0
#启动
#先失败,缺文件,看日志
9月 08 23:57:33 localhost.localdomain bash[57712]: /bin/bash: /etc/sysconfig/ipvsadm: 没有那个文件或目录
#解决方法——创建文件
touch /etc/sysconfig/ipvsadm
#或
ipvsadm-save /etc/sysconfig/ipvsadm
(4)配置负载均衡,利用工具

大致三步

1、先看是否已经有策略
ipvsadm -ln
存在则删除ipvsadm -C
2、进行配置
[root@localhost ~]#ipvsadm -A -t 12.0.0.10:80 -s rr
[root@localhost yum.repos.d]#ipvsadm -a -t 12.0.0.10:80 -r 192.168.177.104:80 -m
[root@localhost yum.repos.d]#ipvsadm -a -t 12.0.0.10:80 -r 192.168.177.105:80 -m -A用于确定具体服务器
-D删除整个虚拟服务器
-t指定虚拟服务器的vip地址(与外网对接的ip地址)
-s指定调度算法(rr:轮询、wrr:加权轮询、lc:最少连接、wlc:加权最少连接)
-p 60指定长连接,等待60秒(默认关闭)
ipvsadm -a -t 12.0.0.10:80 -r 192.168.177. -s rr
-a确定真实服务器
-t指定虚拟服务器的IP地址与端口号
-r指定真实服务器的IP地址与端口号
-m使用NAT模式
-g使用DR模式
-i使用TUN模式
-w设置权重(为0表示暂停节点)
-l列表查看LVS虚拟服务器(默认查看所有)
-n以数字形式显示地址、端口等信息(常与"-l"共同使用)
3、激活
[root@localhost ~]#ipvsadm
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
-> 192.168.177.104:http Masq 1 0 0
-> 192.168.177.105:http Masq 1 0 0

验证:客户机(12.0.0.120)访问网关

测试时需要关闭NGINX上的长连接

04号机安装的Nginx

04机上
cd /etc/httpd/conf/
vim httpd.conf
KeepAlive 0;

后记:ipvsadm工具

策略配置是临时的,工具一关闭策略就消失

#保存
ipvsadm-save > /opt/ipvsadm#任意文件
#删除
[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 localhost.localdomain:http rr
-> 192.168.177.104:http Masq 1 0 0
-> 192.168.177.105:http Masq 1 0 0
#删除单条策略-d
[root@localhost ~]#ipvsadm -d -t 12.0.0.10:80 -r 192.168.177.105:80 -m [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 localhost.localdomain:http rr
-> 192.168.177.104:http Masq 1 0 0 #删除全部策略-D
[root@localhost ~]#ipvsadm -D -t 12.0.0.10:80
[root@localhost ~]#ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

恢复

[root@localhost ~]#ipvsadm-restore < /opt/ipvsadm#之前保存的文件位置

[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 localhost.localdomain:http rr
-> 192.168.177.104:http Masq 1 0 0
-> 192.168.177.105:http Masq 1 0 0
 

LVS负载均衡群集——其一的更多相关文章

  1. LVS负载均衡群集部署——DR模式

    LVS负载均衡群集部署--DR模式 1.LVS-DR概述 2.部署实验 1.LVS-DR概述: LVS-DR(Linux Virtual Server Director Server)工作模式,是生产 ...

  2. LVS负载均衡群集部署——NAT模式

    LVS负载均衡群集部署--NAT模式 1.群集应用概述 2.NAT模式LVS负载均衡群集部署 1.群集应用概述: 存在的问题: 互联网应用中,随着站点对硬件性能.响应速度.服务稳定性.数据可靠性等要求 ...

  3. 21.LVS负载均衡群集-DR群集

    LVS负载均衡群集-DR群集 目录 LVS负载均衡群集-DR群集 数据包流向分析 DR模式的特点 LVS-DR中的ARP问题 IP地址冲突 解决办法 路由根据ARP表项,会将新来的请求报文转发给Rea ...

  4. 20.LVS负载均衡群集—NAT模式实例

    LVS负载均衡群集-NAT模式实例 目录 LVS负载均衡群集-NAT模式实例 群集引用概述 群集的含义 问题 解决方法 企业群集分类 群集的三种类型 负载均衡群集(Load Balance Clust ...

  5. NAT模式 LVS负载均衡群集部署

    NAT模式 LVS负载均衡群集部署的操作步骤 实验环境准备: 负载调度器:内网关 ens33:172.16.10.1,外网关 ens37:12.0.0.1 Web节点服务器1:172.16.10.10 ...

  6. LVS负载均衡群集

    概述 群集的类型:无论是哪种服务器,都至少包括两台节点服务器,而对外表现为一个整体,只提供一个访问入口(域名或IP地址),相当于一台大型计算机.根据群集所针对的目标差异,可以分为以下三个类型: 1.负 ...

  7. 搭建Lvs负载均衡群集

    一.Lvs详解 lvs内核模型 1.模型分析 用户访问的数据可以进入调度器 匹配调度器分配的虚拟IP|IP+端口(路由走向) 根据调度器的算法确定匹配的服务器 2.调度条件:基于IP.基于端口.基于内 ...

  8. LVS负载均衡群集(NAT)

    ----构建NAT模式的LVS群集----------client---------------LVS----------------WEB1-----------WEB2------------NF ...

  9. LVS负载均衡集群--DR模式部署

    目录: 一.LVS-DR数据包流向分析 二.DR 模式的特点 三.LVS-DR中的ARP问题 四.DR模式 LVS负载均衡群集部署 一.LVS-DR数据包流向分析 1.为方便进行原理分析,将clien ...

  10. LVS负载均衡集群--NAT模式部署

    目录: 一.企业群集应用概述 二.负载均衡群集架构 三.负载均衡群集工作模式分析 四.关于LVS虚拟服务器 五.NAT模式 LVS负载均衡群集部署 一.企业群集应用概述 1.群集的含义 Cluster ...

随机推荐

  1. 一文帮你搞定H5、小程序、Taro长列表曝光埋点

    对于很多前端同学来说,"埋点"常常是一个不愿面对却又无法逃避的话题.为什么这么说呢,相信很多前端同学都深有体会:首先埋点这个事基本是前端"独享"的,服务端基本不 ...

  2. Seeion相关

    存储会话数据有两种方式: Cookie 1) 存储在浏览器端,通过服务器发送cookie数据 2) 使用cookie存储会话数据,相对不安全(可以cookie查到一些用户安全) 3) 从存储数据类型来 ...

  3. ASP.NET 6 使用工作单元操作 MongoDB

    大家好,我是Edison. 最近工作中需要用到MongoDB的事务操作,因此参考了一些资料封装了一个小的组件,提供基础的CRUD Repository基类 和 UnitOfWork工作单元模式.今天, ...

  4. Centos7安装JDK1.8(详解版)

    一.检查并卸载OpenJDK 1.卸载centos原本自带的openjdk 运行命令如下: rpm -qa | grep java 2.然后通过    rpm -e --nodeps   后面跟系统自 ...

  5. Linux 使用grep过滤字符串中的指定内容

    命令示例:echo port 1234 123 | grep -oP 'port\s+\K\d+' 返回: 1234 这条命令使用 grep 工具来在文本中查找 "Port " 后 ...

  6. VS Code好用插件: Easy Less

    插件 编译less并输出CSS文件 输出文件

  7. 【技术积累】Linux中的命令行【理论篇】【六】

    as命令 命令介绍 在Linux中,as命令是一个汇编器,用于将汇编语言源代码转换为可执行的目标文件.它是GNU Binutils软件包的一部分,提供了一系列用于处理二进制文件的工具. 命令说明 as ...

  8. 为什么 API 治理需要内部倡导

    API 治理旨在帮助人们通过 API 实现最大价值.但是,只有了解 API 是什么以及 API 的重要性,并且认识到 API 治理是在帮助他们而不是监管他们,才能实现这一目标.这就是为什么在任何 AP ...

  9. Python 潮流周刊#16:优雅重要么?如何写出 Pythonic 的代码?

    你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中两则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...

  10. 深入理解Linux内核——内存管理(2)

    提要:本系列文章主要参考MIT 6.828课程以及两本书籍<深入理解Linux内核> <深入Linux内核架构>对Linux内核内容进行总结. 内存管理的实现覆盖了多个领域: ...