定义: 集群是一组协同工作的服务器,各有分工,对外表现为一个整体。
集群的意义: 更好的利用现有资源实现服务的高度可用
集群扩展方式
集群与分布式的区别
(1)相同点:分布式和集群都是需要有很多节点服务器通过网络协同工作完成整体的任务目标。
(2)不同点:分布式是指将业务系统进行拆分,即分布式的每一个节点都是实现不同的功能。而集群每个节点做的是同一件事情。
单节点服务器运行服务
优点:
缺点:
多节点服务器(集群)运行服务
缺点:
优点:
在生产环境中衡量业务的标准:
IP和PV关系:
网站访问量,的衡量标准一个是IP,另一个是PV,常以日为标准,即日独立IP,和PV来计算。
访问数(IP):即InternetProtocol,指独立IP数。00:00-24:00内相同IP地址只被计算一次。
综合浏览量(PV):即PageView,即页面浏览量或点击量,用户每次刷新即被计算一次。
PV高不一定代表来访者多;PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量。比如一个网站就你一个人进来,通过不断的刷新页面,也可以制造出非常高的PV。

提供和节点个数成正比的负载能力,这种集群适合需要提供大负载访问量的服务,如Web。这类集群中比较著名的有Turbolinux Cluster Server、Linux Virtual Server。此类集群把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。
负载均衡集群中有一个分发器或者叫调度器,我们将其称之为Director,它处在多台服务器的上面,分发器根据内部所定义的规则或调度方式从下面的服务器群中选择一个以此来响应客户端发送的请求,从而解决高并发的问题。在扩展中可非常容易的使用Scale out扩展,从而实现集群的伸缩性,在业内常见开源解决方案有LVS、Haproxy、Nginx、ATS;
运行于两个或多个节点上,目的是在系统出现某些故障的情况下,最大限度地减少服务中断时间,保障应用程序持续提供服务的能力。这类集群中比较著名的有keepalived、TurbolinuxTurboHA、Heartbeat、Kimberlite 等。对于此类集群还有很多通俗的名称,如“双机热备”, “双机互备”等。
高可用集群是服务的可用性比较高,当我们某台服务器死机后不会造成我们的服务不可用。其工作模式则是将一个具有故障的服务转交给一个正常工作的服务器,从而达到服务不会中断。一般来说我们集群中工作在前端(分发器)的服务器都会对我们的后端服务器做一个健康检查,如果发现我们服务器宕机就不会对其在做转发,衡量标准:可用性=在线时间/(在线时间+故障处理时间),就是通常我们说的可用性99%、99.9%、99.99%等等,在业内的硬件的解决方案有 F5 ,在业内常见开源解决方案有Heartbeat、Keepalived、HaProxy等等;
> 在高可用性集群HA中,会出现脑裂的现象,即在 Master - Slave 中会有心跳检测功能,但有可能因为网络环境不稳定或者其他情况,导致Master - Slave发送心跳包的时长超过了最长有效时间,则会可能Slave会代替Master进行服务,但是原Master一直都在存活并且提供服务,那么集群HA就出现双Master的情况。即脑裂。
> HA 出现脑裂的情况时,会有电源交换机这种硬件设备,来实时检测,当 Backup 机器接替 Master,而Master 又还正常工作的情况下,电源交换机会将 Master 节点的电源直接关闭。
利用计算集群软件将多个节点的计算机联结在一起,完成通常只有超级计算机才能完的计算任务。
HP:高性能的集群是当某一个任务量非常大的时候,我们做一个集群共同来完成这一个任务。这种处理方式我们称为并行处理集群,并行处理集群是将大任务划分为小任务,分别进行处理的机制,常常用于大数据分析,海量资源整合,目前比较出名的就是Hadoop。
总之,在实际生产环境中我们都可以根据实际情况来挑选合适的集群解决方案,3种集群的侧重各有不同,LB集群着重在于提供服务并发处理能力,HA集群以提升服务在线的能力实现服务不间断,HP集群着重用于处理一个海量任务。
负载均衡集群 – LBC: 分担服务的总体压力
高可用集群 – HAC: 尽可能的保障服务状态的可用性
高性能运算集群 – HPC: 提供单台服务器提供不了的计算能力
集群概念:集群是一组协同工作的服务器,各有分工,对外表现为一个整体。
负载均衡集群 LBC:负担服务的总体压力
高可用集群 HAC:尽可能的保障服务状态的可用性
高性能运算集群 HPC:提供单台服务器提供不了的计算能力
LBC:负载均衡集群,每个子节点的工作任务是一致的,例如:在流水线中的一个生产车间有5个工人在同时做一件事。
HAC:高可用集群。负载均衡集群一般会与高可用集群结合使用,是 LBC 和 HPC 的组件。
HPC:高性能运算集群,例如:在运算一个复杂的程序时将运算进行拆分(1+2+3+4+5+6)分配给三台机器处理,例如1+2分给A,3+4分给B、5+6分给C。然后将A,B,C的计算结果进行运算后就得到最终结果了。简单理解:将计算量分摊给集群的各个机器进行计算处理。
> 负载均衡集群提升的是工作效率,高性能运算集群则是减轻单个任务消耗的时间,用于大型的计算服务(天气,人类DNA库)
参考文档:https://blog.csdn.net/qq_41582883/article/details/118734994
在高可用集群中,节点间无法互相检测到对方心跳而各自启动故障转移功能,分裂成独立的节点,节点之间彼此都认为对方出现了故障,从而争抢”共享资源”、争起”应用服务”。进而导致严重后果:
共享资源被瓜分、两边”服务”都起不来了;
两边”服务”都起来了,但同时读写”共享存储”,导致数据损坏。
服务器“脑裂”容易引起服务器集群逻辑关系混乱,导致主、备服务器误认为对方宕机而同时接管对方的业务,同时占用共享的文件系统,造成数据库争抢资源,引起数据库表文件的损坏,从而导致数据库服务的中断,对外业务暂停。
(1)高可用服务器之间心跳线路故障,导致无法正常的通信:
(2)心跳线本身就坏了(包括断了,老化);
(3) 网卡以及相关驱动坏了,IP配置及冲突问题;
(4)心跳线间连接的设备故障(交换机的故障或者是网卡的故障);
(5)仲裁的服务器出现问题;
(6)防火墙阻挡了心跳消息的传输;
(7)心跳网卡地址等信息配置的不正确,导致发送心跳失败;
(8)其他服务配置不当等原因,如心跳方式不同,心跳广播冲突、软件Bug等;
(9)keepalived配置文件中主备的virtual_router_id不一致也会导致裂脑问题发生;
(1)同时使用串行电缆和以太网电缆连接,添加冗余的心跳线,尽量减少“脑裂”发生机会。
(2)启用磁盘锁,正在服务一方锁住共享磁盘,“裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动"解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。
(3)设置仲裁机制:例如设置参考的IP,当心跳完全断开的时候,2个节点各自都ping一下参考的IP,不同则表明断点就出现在本段,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。通过第三方软件仲裁谁该获得资源。
(4)fence机制,当检测到裂脑时强行关闭一个心跳节点(需要Stonith、fence)
(5)仲裁机制+fence机制:Pacemaker+Corosync+合适的资源Agent
(6)对裂脑的监控报警,报警报在服务器接管之前,给人员处理留足够时间。例如:1分钟内报警,但是服务器此时没有接管,而是5分钟再进行接管;或者报警后不直接自动服务器接管,而是由人为人员控制接管

根据架构图可以知道,暴露的外网环境下的其实是负载均衡器,而负载均衡器也会做一个 HA 高可用的形式。
负载均衡器会将流量(按特定的算法,比如轮询,加权轮询,最少连接数,最少连接数慢启动时间,源IP哈希等)打到后台真正提供服务的 Web 服务器,Web 服务器的功能和配置是一样的,如果需要访问数据库服务器,那么Web也会将流量打到 后台的数据库服务器集群。

用户通过 Internet 互联网访问负载均衡器,通过负载均衡器来访问企业内网的真实服务器。
负载调度器:

ISO 七层模式以及TCP/IP模型越网上层,越智能,可以识别出比他低层的所有内容。
当每引用一个层级以后,那么其响应速度就会更慢。功能越复杂,消耗的资源就越多,响应速度也就越慢。
ISO 七层模型介绍:
真实服务器池:

LVS 只做简单数据的更改,比如IP地址的转换。并没有涉及到真实数据的流量转发,以及流量生产。
LVS 只是把必要的地址进行修改,把目标和源进行更改。就是源地址转换,目的地址转换。
云厂商的负载均衡器本质上也是间接或者直接使用 LVS。
LVS 只进行了一次 TCP 连接。数据并没有改变。
概述:
四层负载均衡工作在OSI模型中的四层,即传输层。四层负载均衡只能根据报文中目标地址和源地址对请求进行转发,而无法修改或判断所请求资源的具体类型,然后经过负载均衡内部的调度算法转发至要处理请求的服务器。四层负载均衡单纯的提供了终端到终端的可靠连接,并将请求转发至后端,连接至始至终都是同一个。LVS就是很典型的四层负载均衡。
七层负载均衡工作在OSI模型的第七层,应用层,所以七层负载均衡可以基于请求的应用层信息进行负载均衡,例如根据请求的资源类型分配到后端服务器,而不再是根据IP和端口选择。七层负载均衡的功能更丰富更灵活,也能使整个网络更智能。如上图所示,在七层负载均衡两端(面向用户端和服务器端)的连接都是独立的。
简言之,四层负载均衡就是基于IP+端口实现的。七层负载均衡就是通过应用层资源实现的。

Nginx 与客户端做一次TCP连接,Nginx 与 后端的真实服务器做了一次TCP连接。做了两次不同的完整的 TCP 连接。
Nginx 直接使用域名或者主机名,其命中率会更高。
分类:访问量
使用场景:
简单总结:LVS的调度粒度比较粗,模糊查询。Nginx调度粒度细,精确查询。
四层是TCP层,使用IP+端口四元组的方式。只是修改下IP地址,然后转发给后端服务器,TCP三次握手是直接和后端连接的。只不过在后端机器上看到的都是与代理机的IP的 ESTABLISHED 而已,LVS中没有握手。
7层代理则必须要先和代理机三次握手后,才能得到7层(HTTP层)的具体内容,然后再转发。意思就是代理机必须要与client和后端的机器都要建立连接。显然性能不行,但胜在于七层,人工可操作性高,能写更多的转发规则。
1)两者都是软件负载均衡产品,但是LVS是基于Linux操作系统实现的一种软负载均衡,而HAProxy是基于第三应用实现的软负载均衡。
2)LVS是基于四层的IP负载均衡技术,而HAProxy是基于四层和七层技术、可提供TCP和HTTP应用的负载均衡综合解决方案。
3)LVS工作在ISO模型的第四层,因此其状态监测功能单一,而HAProxy在状态监测方面功能强大,可支持端口、URL、脚本等多种状态检测方式。
4)HAProxy虽然功能强大,但是整体处理性能低于四层模式的LVS负载均衡,而LVS拥有接近硬件设备的网络吞吐和连接负载能力。
常用术语
| 名称 | 定义 |
|---|---|
| DS | Director Server 指的是前端负载均衡器节点 |
| RS | Real Server。后端真实的工作服务器 |
| VIP | Virtual IP 向外部直接面向用户请求,作为用户请求的目标的IP地址 |
| DIP | Director Server IP,主要用于和内部主机通讯的IP地址 |
| RIP | Real Server IP,后端服务器的IP地址 |
| RIP | Real Server IP,后端服务器的IP地址 |
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)

https://blog.z0ukun.com/?p=773

NAT模式:LVS负载均衡器位于服务器和用户及Internet 之间。也就是说LVS负载均衡器需要配置两块网卡,一个是内网IP,一个是公网IP。连接了内网和公网 网络环境。
TUN模式:服务器、LVS负载均衡器以及用户均是通过 Internet 相连。也就说服务器具有公网的特性,分布在各个地区,可以通过LVS进行组合构建完整集群,使用场景有限。
DR模式:LVS负载均衡器和服务器处于同一个广播域中,用户以及Internet 通过路由器将请求转发到LVS负载均衡器。该模式是负载量最高的一种方式。企业中最常用的模式。
注意:

LVS-NAT模式总结:
TUN模式是一种IP隧道模式,用户的请求通过LVS到达 Nginx 集群,请求的过程和NAT模式一样的,重要的是响应不同;
但是有一个硬性的要求:每一个Nginx节点都要配备网卡,会导致Nginx集群都暴露在公网,会有安全问题
注意:


LVS-TUN模式总结:
广播域:同一个广播域就是在同一个子网下,同一个交换机(二层)下的计算机都在同一个广播域中。
DR模式叫做直接路由模式,与TUN模式不同的是,Nginx集群的响应会统一经过一个路由中转之后,统一返回给用户,此时Nginx集群是处于私网当中的;

LVS-DR(直接路由)模式:负载调度器通过交换机连接真实提供服务的服务器池(属于同一个广播域),接收用户请求并调度;均衡服务器池(伪装为调度器的公网IP地址后)通过交换机直接应答结果给路由器,进一步到用户;
生产环境一般都是用DR模式,这避免了真实服务器暴露在公网之下防止攻击,又不必将数据从负载调度器原路返回,大大增加了LVS的抗并发能力,LBC模式其实和NGINX的七层代理本质一样的。
LVS-DR 的特点就是:RS 真实服务器网卡上都会有一个负载均衡器的IP地址,并且该IP地址不向外广播。RS 和负载均衡器是在同一个广播域中。
LVS-DR模式总结:
| NAT | DR | TUN | FULLNAT | |
|---|---|---|---|---|
| RS的限制 | 任意OS | 限制ARP | 需要支持Tunneling | 任意OS |
| RS的网络 | 私有 | LAN | LAN/WAN | 私有 |
| RS的数量 | 少量Low(10-20) | 大量High(100) | 大量High(100) | 少量Low(10-20) |
| RS的网关 | LVS的DIP | 自己的路由 | 自己的路由 | 自己的路由 |
| 优点 | 端口转换 | 性能好 | WAN | 端口转换,跨VLAN |
| 缺点 | 性能瓶颈 | 不支持跨网段 | 需要支持Tunneling | 性能瓶颈,无法获得用户IP |
网络:
配置:
使用VMware 的仅主机模式。
操作系统配置
#所有机器执行
#修改主机名
hostnamectl set-hostname node1 | node2 | node3 ......
#关闭防火墙功能
systemctl stop firewalld
systemctl disable --now firewalld
#关闭SELinux
setenforce 0
sed -i.bak -r '/^SELINUX/s@(.*)=(.*)@\1=disabled@g' /etc/selinux/config
#配置本地光盘源
mkdir -pv /mnt/cdrom
mount /dev/sr0 /mnt/cdrom
#配置成开机自动挂载
cat >> /etc/fstab <<EOF
/dev/sr0 /mnt/cdrom iso9660 defaults 0 0
EOF
#查看repo源
mkdir -pv /etc/yum.repos.d/repo_backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/repo_backup
cat > /etc/yum.repos.d/CentOS-Media.repo <<EOF
[CentOS-Media]
name=CentOS-Media
baseurl=file:///mnt/cdrom/
enabled=1
gpgcheck=0
EOF
#安装常用软件包
yum install -y lrzsz gcc gcc-c++

大致流程
Client 发送一个数据包,源地址是10.10.10.240,目标地址是10.10.10.100,在当前广播域中,数据包会被发送到负载调度器,负载调度器会根据算法进行修改DMAC(目的MAC),修改完之后会被扔回广播域,回到RS1,为了使RS1能够接受数据,开启一个lo:0 10.10.10.100的接口(相当于起了个小名),这样的话,当前广播域中会存在多个相同的ip地址,会引起ip地址冲突,为了解决这个问题,可以修改ARP(地址解析协议,根据IP地址获取物理地址的一个TCP/IP协议)的通信行为,然后 lo 配置路由规则拿到数据报文,回信给客户端
ARP 通信行为
ARP 响应级别
ARP 通告行为
实际操作:
#关闭NetworkManager网卡守护进程,负责无线网卡的启用,不安全的网络策略会强制关闭
#如果是最精简版的CentOS系统则不会安装 NetworkManager 服务
systemctl stop NetworkManager
systemctl disable --now NetworkManager
#CentOS6的操作
service NetworkManager stop
chkconfig NetworkManager off
负载均衡器的操作
#负载均衡器10.10.10.11
systemctl stop NetworkManager
systemctl disable --now NetworkManager
#创建虚拟网卡
$ cd /etc/sysconfig/network-scripts
$ cp ifcfg-eth0 ifcfg-eth0:0
$ vim ifcfg-eth0:0
NAME="eth0:0"
DEVICE="eth0:0"
ONBOOT="yes"
#配置虚拟IP地址
IPADDR="10.10.10.100"
PREFIX="32"
#重启网络服务
$ systemctl restart network
#查看机器的网卡配置是否生效
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:16:73:35 brd ff:ff:ff:ff:ff:ff
inet 10.10.10.11/24 brd 10.10.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.10.10.100/32 brd 10.10.10.255 scope global secondary eth0:0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe16:7335/64 scope link
valid_lft forever preferred_lft forever
#配置内核参数
$ cat >> /etc/sysctl.conf <<EOF
#LVS-DR Kernel BEGIN
##禁止转发重定向报文
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
#LVS-DR Kernel END
EOF
#刷新内核参数
$ sysctl -p
#ipvsadm是一个工具,同时它也是一条命令,用于管理LVS的策略规则。
$ modprobe ip_vs
$ yum install -y ipvsadm
#查看ipvs的信息
$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#ipvs的常用命令
ipvsadm -v
ipvsadm -A -t 虚拟IP:80 -s rr
ipvsadm -a -t 虚拟IP:80 -r 网站1:80 -g
ipvsadm -a -t 虚拟IP:80 -r 网站2:80 -g
ipvsadm -Ln
service ipvsadm save
chkconfig ipvsadm on
ipvsadm 命令的其他用法
#语法
ipvsadm -A|E -t|u|f <集群服务地址> [-s <调度算法>] [-p <超时时间>] [-M <掩码>] [-b <标志>]
ipvsadm -D -t|u|f <集群服务地址>
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f <集群服务地址> -r <真实服务器地址> [选项]
ipvsadm -d -t|u|f <集群服务地址> -r <真实服务器地址>
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f <集群服务地址>]
ipvsadm --set <超时时间>
ipvsadm --start-daemon <主或备> [--mcast-interface <组播接口>] [--syncid <SID>]
ipvsadm --stop-daemon <主或备>
ipvsadm -h
#相关的子命令
--add-service -A 添加一个集群服务,需要使用选项
--edit-service -E 编辑一个集群服务,需要使用选项
--delete-service -D 删除指定集群服务,需要使用选项
--clear -C 删除所有集群服务,包括真实服务器转发策略规则
--restore -R 从标准输入中恢复策略规则
--save -S 保存策略规则到标准输出
--add-server -a 添加一个真实服务器,需要使用选项
--edit-server -e 编辑一个真实服务器,需要使用选项
--delete-server -d 删除一个真实服务器,需要使用选项
--list -L|-l 查看集群服务列表,包括真实服务器转发策略规则
--zero -Z 计数器清零。清除连接数、包转发等数量统计信息
--set <超时时间> 设置TCP、TCPFIN(TCP关闭连接状态)、UDP连接超时时间,用于
会话保持。一般情况下TCP和UDP超时时间保持默认就好,TCPFIN
可以根据情况设定,指定它则用户请求连接关闭,该连接则会变
为非活跃(InActive)空闲等待状态,在空闲等待时间内,如果
来自同一源IP的请求,则还会转发给后端的同一台真实服务器上
--start-daemon 开启连接同步守护进程。在选项后面指定自己是Master(主)还
是backup(备),主负载调度器会同步所有策略及连接状态到备
负载调度器,当主故障,备可以接替其工作
--stop-daemon 停止连接同步守护进程
--help -h 显示帮助信息
#选项
--tcp-service -t <集群服务地址> 允许集群服务使用的传输协议为TCP。<IP:Port>
--udp-service -u <集群服务地址> 允许集群服务使用的传输协议为UDP。<IP:Port>
--fwmark-service -f <防火墙标识> 使用一个整数值来防火墙标识集群服务,而不是地址、
端口和协议使用它,我们可以通过结合IPtables将多
个以调度器为目标的端口定义成一个防火墙标识,由
ipvsdam通过此项关联标识,则可以实现对一个IP多
端口调度,即实现后端服务器可以开放多个服务
--scheduler -s scheduler 指定集群服务使用的调度算法:rr|wrr|lc|wlc|lblc
|lblcr|dh|sh|sed|nq,默认为wlc
--persistent -p <超时时间> 开启持久化服务,开启它则表示在指定时间内,来自同
一IP的请求都会转发到后端同一台真实服务器上
--netmask -M <网络掩码> 使用网络掩码来屏蔽持久化来源IP的地址范围,默认值
为255.255.255.255,即所有来源IP请求都会享受持久
化服务
--real-server -r <真实服务器地址> 指定真实服务器的主机IP与端口
--gatewaying -g 指定真实服务器转发工作模式,使用DR模式,默认
--ipip -i 指定真实服务器转发工作模式,使用TUN模式
--masquerading -m 指定真实服务器转发工作模式,使用NAT模式
--weight -w <权重值> 指定真实服务器的权重值
--u-threshold -x <上阀值> 设置转发请求的最大上连接阀值,范围为0~65535,当
当连接数超过指定上限时,LVS则不会转发请求
--l-threshold -y <下阀值> 设置转发请求的下连接阀值,范围为0~65535,当连接
数降低至指定值时,LVS则继续提供服务,默认值为0
--mcast-interface interface 设置用于连接同步守护进程的组播接口
--syncid sid 设置连接同步守护进程的SID号,用于标识,范围0~255
--connection -c 显示连接信息,一般与"-l"连用
--timeout 显示TCP、TCPFIN、UDP超时时间信息,一般与"-l"连用
--daemon 显示连接同步守护信息,一般与"-l"连用
--stats 显示统计信息,一般与"-l"连用
--rate 显示转发速率信息,一般与"-l"连用
--exact 显示数据包和字节计数器的确切值,扩大字符长度
--thresholds 显示阀值信息,一般与"-l"连用
--persistent-conn 显示持久化连接信息,一般与"-l"连用
--numeric -n 地址和端口以数字格式显示,一般与"-l"连用
--sched-flags -b <标识> 设置调度算法的范围标识,用于SH算法,有两个标识:
sh-fallback,如果真实服务器不可用,则将其转发到
其他真实服务器上。
sh-port,将源地址的端口号也添加到散列键=值中
后台提供服务的真实服务器
#提供服务的真实服务器RS 10.10.10.12
$ systemctl stop NetworkManager
$ systemctl disable --now NetworkManager
#安装 httpd 服务并开启服务
$ yum install -y httpd
$ systemctl enable --now httpd
$ netstat -auntlp | grep 80
tcp6 0 0 :::80 :::* LISTEN 1589/httpd
$ echo "This is the real server1" > /var/www/html/index.html
$ curl 10.10.10.12
This is the real server1
#配置网络服务
$ cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 <<EOF
DEVICE=lo:0
#配置虚拟IP地址
IPADDR=10.10.10.100
NETMASK=255.255.255.255
EOF
$ systemctl restart network
#配置内核参数
$ cat >> /etc/sysctl.conf <<EOF
#LVS-DR Kernel BEGIN
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 1
#LVS-DR Kernel END
EOF
$ sysctl -p
#启动回环网卡并配置路由信息
$ ifup lo:0
$ route add -host 10.10.10.100 dev lo:0
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.10.10.2 0.0.0.0 UG 0 0 0 eth0
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.10.10.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
#设置开机自动加载
$ echo "/usr/sbin/route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local
#提供服务的真实服务器RS 10.10.10.13
$ systemctl stop NetworkManager
$ systemctl disable --now NetworkManager
#安装 httpd 服务并开启服务
$ yum install -y httpd
$ systemctl enable --now httpd
$ netstat -auntlp | grep 80
tcp6 0 0 :::80 :::* LISTEN 8341/httpd
$ echo "This is the real server2" > /var/www/html/index.html
$ curl 10.10.10.13
This is the real server2
#配置网络服务
$ cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 <<EOF
DEVICE=lo:0
#配置虚拟IP地址
IPADDR=10.10.10.100
NETMASK=255.255.255.255
EOF
#配置内核参数
$ cat >> /etc/sysctl.conf <<EOF
#LVS-DR Kernel BEGIN
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_aonnounce =2
net.ipv4.conf.default.arp_ignore =1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_aonnounce = 1
#LVS-DR Kernel END
EOF
$ sysctl -p
#启动回环网卡并配置路由信息
$ ifup lo:0
$ route add -host 10.10.10.100 dev lo:0
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.10.10.2 0.0.0.0 UG 0 0 0 eth0
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.10.10.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
#设置开机自动加载
$ echo "/usr/sbin/route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local
用于测试,所以后台的真实服务器网页不一致;但在生产环境中,后台的真实服务器部署的网页站点是一致的。
负载均衡器的规则
#ipvs的常用命令
ipvsadm -v
#-A:代表添加一个集群
ipvsadm -A -t 虚拟IP:80 -s rr
#-a:代表添加集群中的子节点
#-t:代表TCP协议
#-s:指定算法
#-r:代表后台的真实服务器
#-g:指定为DR模式
ipvsadm -a -t 虚拟IP:80 -r 网站1:80 -g
ipvsadm -a -t 虚拟IP:80 -r 网站2:80 -g
ipvsadm -Ln
service ipvsadm save
chkconfig ipvsadm on
$ ipvsadm -A -t 10.10.10.100:80 -s rr
$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.12:80 -g
$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13:80 -g
$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.10.100:80 rr
-> 10.10.10.12:80 Route 1 0 0
-> 10.10.10.13:80 Route 1 0 0
#使其 ipvsadm 配置永久生效(CentOS 7使用)
ipvsadm -Sn > /etc/sysconfig/ipvsadm
#ipvsadm-save > /etc/sysconfig/ipvsadm
#清楚ipvs规则
#ipvsadm -C
#恢复命令:
#ipvsadm-restore < /etc/sysconfig/ipvsadm
#启动ipvsadm服务,并设置为开机启动
$ systemctl enable --now ipvsadm.service
#查看服务状态
$ systemctl status ipvsadm.service
#重启服务
$ systemctl restart ipvsadm.service
#开机自动加载集群规则
$ echo "/usr/sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" >> /etc/rc.local
#查看ipvs状态
$ ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.10.10.11:80 0 0 0 0 0
-> 10.10.10.12:80 0 0 0 0 0
-> 10.10.10.13:80 0 0 0 0 0
因为浏览器会有缓存机制,需要强制刷新页面就能够得到实验效果


$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.10.100:80 wrr
-> 10.10.10.12:80 Route 1 0 0
-> 10.10.10.13:80 Route 1 0 0
$ ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.10.10.100:80 35 331 0 61746 0
-> 10.10.10.12:80 17 111 0 15537 0
-> 10.10.10.13:80 18 220 0 46209 0
#LVS模式:只负责入站的请求,出站的流量是由真实的服务器完成。

c发送一个数据包,源地址是20.20.20.22,目标地址是20.20.20.11,负载调度器LVS组件会根据DNAT转换把ip地址修改为服务器的地址,RS1收到数据包后,回信给网关负载调度器10.10.10.11,为了保证源地址一致性,采用了SNAT转换
#关闭NetworkManager网卡守护进程,负责无线网卡的启用,不安全的网络策略会强制关闭
#如果是最精简版的CentOS系统则不会安装 NetworkManager 服务
systemctl stop NetworkManager
systemctl disable --now NetworkManager
#CentOS6的操作
service NetworkManager stop
chkconfig NetworkManager off
#LVS的操作
#网络配置
$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
BOOTPROTO="static"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
IPADDR="10.10.10.11"
PREFIX="24"
$ vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE="Ethernet"
BOOTPROTO="static"
NAME="eth1"
DEVICE="eth1"
ONBOOT="yes"
IPADDR="20.20.20.11"
PREFIX="24"
#重启网络服务
$ systemctl restart network
#查看IP地址
$ ip addr
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:16:73:35 brd ff:ff:ff:ff:ff:ff
inet 10.10.10.11/24 brd 10.10.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe16:7335/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:16:73:3f brd ff:ff:ff:ff:ff:ff
inet 20.20.20.11/24 brd 20.20.20.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe16:733f/64 scope link
valid_lft forever preferred_lft forever
#安装 IPvsadm
yum install -y ipvsadm
#修改内核参数
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward = 1
EOF
#刷新内核参数
sysctl -p
#关闭NetworkManager网卡守护进程,负责无线网卡的启用,不安全的网络策略会强制关闭
#如果是最精简版的CentOS系统则不会安装 NetworkManager 服务
systemctl stop NetworkManager
systemctl disable --now NetworkManager
#CentOS6的操作
service NetworkManager stop
$ chkconfig NetworkManager off
#网卡的网关设置为10.10.10.11
$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
GATEWAY="10.10.10.11"
$ systemctl restart network
route add default gw <IP地址>
#安装 httpd 服务
yum install -y httpd
systemctl enable --now httpd
#RS1:10.10.10.12
echo "This is the real server1" > /var/www/html/index.html
#RS2:10.10.10.13
sed -i.bak -r '/^Listen/s|(.*) (.*)|\1 8080|ig' /etc/httpd/conf/httpd.conf
systemctl restart httpd
echo "This is the real server2" > /var/www/html/index.html
用于测试,所以后台的真实服务器网页不一致;但在生产环境中,后台的真实服务器部署的网页站点是一致的。
#ipvs的常用命令
ipvsadm -v #查看版本号
#-A:代表添加一个集群
#-s 10.10.10.0/24 是内网的网段 --to-source 公网网卡地址
ipvsadm -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j SNAT --to-source 20.20.20.11
ipvsadm -t nat -L
ipvsadm -A -t 20.20.20.11:80 -s rr
ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.12:80 -m
ipvsadm -Ln
#service ipvsadm save
#chkconfig ipvsadm on
$ iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j SNAT --to-source 20.20.20.11
$ iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 6 packets, 356 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 6 packets, 356 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 1 packets, 88 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1 88 SNAT all -- * eth0 10.10.10.0/24 0.0.0.0/0 to:20.20.20.11
#保存iptables规则
$ iptables-save > /tmp/iptables.txt
#centos7之前是
service iptables save
#centos7是
systemctl enable iptables.service
#重启服务,规则都还在
service iptables restart
$ ipvsadm -A -t 20.20.20.11:80 -s rr
$ ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.12:80 -m
$ ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.13:8080 -m
$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 20.20.20.11:80 rr
-> 10.10.10.12:80 Masq 1 0 0
-> 10.10.10.13:8080 Masq 1 0 0
#使其 ipvsadm 配置永久生效(CentOS 7使用)
ipvsadm -Sn > /etc/sysconfig/ipvsadm
#ipvsadm-save > /etc/sysconfig/ipvsadm
#清楚ipvs规则
#ipvsadm -C
#恢复命令:
#ipvsadm-restore < /etc/sysconfig/ipvsadm
#启动ipvsadm服务,并设置为开机启动
$ systemctl enable --now ipvsadm.service
#查看服务状态
$ systemctl status ipvsadm.service
#重启服务
$ systemctl restart ipvsadm.service
#开机自动加载集群规则
$ echo "/usr/sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" >> /etc/rc.local
#查看ipvs状态
#会发现出站和入站都会有流量的加入,符合NAT模式
$ ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 20.20.20.11:80 5 35 24 4706 4005
-> 10.10.10.12:80 2 13 9 1775 1452
-> 10.10.10.13:8080 3 22 15 2931 2553
因为浏览器会有缓存机制,需要强制刷新页面就能够得到实验效果


固定算法(静态调度算法):只根据算法本身去调度,完全不考虑服务器本身
动态算法(动态调度算法):除了考虑算法本身,还要考虑服务器的状态
RR 轮询:将每次用户的请求分配给后端的服务器,从第一台服务器开始到第 N 台结束,然后循环
WRR 加权轮询:按照权重的比例实现在多台主机之间进行调度
SH(Source Hash)源地址散列:将同一个IP的用户请求,发送给同一个服务器


DH(Destination Hash)目的地址散列:将同一个目标地址的用户请求发送给同一个真实的服务器(提高缓存的命中率)
动态调度算法所理解的 http 连接分为两种:
活动连接:正在传输数据
非活动连接:
一般情况下,活动连接一般远大于非活动连接资源消耗,LVS 就理解为 活动连接 等同于 256 * 非活动连接的资源消耗比。
LC(Least Connection)最少连接:将新的连接请求,分配给连接数最少的服务器,活动连接 * 256 + 非活动连接
WLC(Weighted Least Connection)加权最少连接:特殊的最少连接算法,权重越大承担的请求数越多(活动连接 * 256 + 非活动连接) / 权重
SED(Shortest Expected Delay Scheduling)最短期望延迟:特殊的 WLC 算法,(活动连接 + 1)* 256 / 权重。
NQ 永不排队:特殊的SED算法,无需等待,如果有真实服务器的连接数等于 0 那就直接分配不需要运算
LBLC 特殊的 DH 算法:即能提高缓存命中率,又要考虑服务器性能
LBLCR :LBLC + 缓存,尽可能提高负载均衡和缓存命中率的折中方案
HTTPS 安全 配置复杂 需要证书 消耗性能
SSL 握手设备(处理 HTTPS 请求的硬件设备)

持久化连接:LVS
使用场景:
如何持久连接:
PCC(持久客户端连接):每客户端持久;将来自于同一个客户端的所有请求统统定向至此前选定的 RS;也就是只要IP相同,分配的服务器始终相同。
example:ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120
PPC(持久端口连接):每端口持久;将来自于同一个客户端对同一个服务(端口)的请求,始终定向至此前选定的 RS;也就是只要IP,并且访问的端口相同,分配的服务器始终相同。
example:ipvsadm -A -t 172.16.0.8:80 -s rr -p 120
PFMC(持久防火墙标记连接):将来自于同一个客户端对指定服务(端口)的请求,始终定向至此选定的 RS;不过它可以将两个毫不相干的端口定义为一个集群服务。
-t mangle -A PREROUTING:在mangle表中 PREROUTING链里
-d 172.16.0.8 :目标地址是172.16.0.8
-p tcp -dport 80 :TCP协议的80端口
-j MARK --set-mark 10:标记mark值等于10
#iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10
#iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --set-mark 10
#service iptables save
#ipvsadm -A -f 10 -s wlc -p 120
范例:测试 PPC 持久端口连接
##在NAT模式的环境下进行修改,LVS机器执行
#清除ipvs规则
$ ipvsadm -C
#添加ipvsadm规则
$ ipvsadm -A -t 20.20.20.11:80 -s rr -p 120
$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 20.20.20.11:80 rr persistent 120
$ ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.12:80 -m
$ ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.13:8080 -m
$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 20.20.20.11:80 rr persistent 120
-> 10.10.10.12:80 Masq 1 0 0
-> 10.10.10.13:8080 Masq 1 0 0
#查看持久化环境
$ ipvsadm -Ln --persistent-conn
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Weight PersistConn ActiveConn InActConn
-> RemoteAddress:Port
TCP 20.20.20.11:80 rr persistent 120
-> 10.10.10.12:80 1 0 0 0
-> 10.10.10.13:8080 1 1 0 10
进行实验访问

强制刷新也是会调度到同一个,过了120秒之后,就会重新分配。

#查看ipvs的详细信息流量
$ ipvsadm -Ln -c
IPVS connection entries
pro expire state source virtual destination
TCP 00:14 TIME_WAIT 20.20.20.1:11819 20.20.20.11:80 10.10.10.13:8080
TCP 00:13 TIME_WAIT 20.20.20.1:11814 20.20.20.11:80 10.10.10.13:8080
TCP 00:13 TIME_WAIT 20.20.20.1:11817 20.20.20.11:80 10.10.10.13:8080
TCP 00:13 TIME_WAIT 20.20.20.1:11813 20.20.20.11:80 10.10.10.13:8080
TCP 15:01 ESTABLISHED 20.20.20.1:11882 20.20.20.11:80 10.10.10.13:8080
TCP 00:19 TIME_WAIT 20.20.20.1:11821 20.20.20.11:80 10.10.10.13:8080
TCP 00:12 TIME_WAIT 20.20.20.1:11807 20.20.20.11:80 10.10.10.13:8080
TCP 00:13 TIME_WAIT 20.20.20.1:11811 20.20.20.11:80 10.10.10.13:8080
TCP 00:14 TIME_WAIT 20.20.20.1:11820 20.20.20.11:80 10.10.10.13:8080
TCP 01:58 NONE 20.20.20.1:0 20.20.20.11:80 10.10.10.13:8080
TCP 00:13 TIME_WAIT 20.20.20.1:11812 20.20.20.11:80 10.10.10.13:8080
TCP 00:13 TIME_WAIT 20.20.20.1:11816 20.20.20.11:80 10.10.10.13:8080