Cluster概念
就是集群
LB
负载均衡集群
HA
高可用集群
高可用两个调度器,Down掉一个,另一个还可以用
HA集群实现方法
避免调度器单点失败
keepaliverd
:vrrp协议- 和
LVS
天生一对,是非常优秀的解决LVS
单点失败的解决方案
- 和
ais
:应用接口规范----已淘汰
- heartbeat
- cman+rgmanager(RHCS)
- coresync_pacemaker
HPC
高性能集群
Cluster–基于软件/硬件分类
Cluster—基于工作的协议层次划分
负载均衡中的会话保持
Session绑定
:- Source IP(源地址)-----不均衡
- Cookie------同Cookie被调到同一服务器
session replication
:每台服务器拥有全部session- session multicast cluster–会话多播集群-----服务器资源占用较多
session server
:专门的session服务器(推荐)- Memcached,Redis—需要主从服务器,防止session服务器宕机
LVS简介
LVS:Linux Virtual Server,负载调度器,集成在Linux内核中。
发明人:阿里 章文嵩
LVS工作原理
VS(负载均衡器)
根据请求报文的目标IP
和目标协议
及目的地端口
将其调度转发
至某RS(后端真实服务器)
,根据调度算法
来挑选RS(后端真实服务器)
访问流程
CIP(客户端IP)
<—>VIP(VS外网IP)
==DIP(VS内网IP)
<—>RIP(后端服务器内网IP)
LVS集群类型中的术语:
VS
:Virtual Server / Director Server(DS)- Dispatcher(调度器),Load Balancer(负载均衡器)
RS
:Real Server(真实服务器)/upstream server(ngnix里叫:上游服务器)- backend server(haproxy里叫:后端服务器)
CIP
:Client IP(客户端IP)VIP
:Virtual Server IP VS外网的IPDIP
:Director IP VS(调度器)连接内网的IPRIP
:Real Server IP 真实服务器的内网IPL4
: 四层路由器或交换机
VIP
LVS调度器
我们通常访问的大型系统的IP地址
,解析域名后得到的IP地址
,不是真正工作的服务器IP
,而是LVS(调度器)
的IP
,叫做VIP
。
由LVS(调度器)
决定访问哪个工作的服务器IP(real server,检查RIP)
。
LVS负载均衡算法
算法名称 | 简短解释 | |
---|---|---|
rr | 轮询算法(Round-Robin) | 按顺序轮流分配请求到服务器池中的每一台服务器。 |
wrr | 加权轮询算法 | 在轮询的基础上根据服务器的权重进行分配,权重高的服务器会接收更多请求。 |
lc | 最少连接算法(Least Connection) | 根据每个服务器当前的连接数来决定请求分配,选择连接数最少的服务器。 |
wlc | 加权最少连接算法 | 默认的调度算法 ,结合了服务器的权重和当前连接数进行分配。 |
lblc | 基于局部最少连接算法 | 适用于后端服务器分布在不同地理位置的场景 |
lblcr | 基于局部最少连接(带复制)算法 | 在 lblc 的基础上,增加了对后端服务器状态的复制。 |
dh | 目标地址哈希算法(Destination Hashing) | 根据请求的目的 IP 地址哈希值分发请求。 |
sh | 源地址哈希算法(Source Hashing) | 根据客户端的源 IP 地址哈希值分发请求。 |
sed | 最短期望延迟算法(Shortest Expected Delay) | 根据后端服务器的连接数和响应时间进行分发。 |
nq | 从不排队算法(Never Queue) | 直接将请求分发到后端服务器,不进行排队。 |
LVS的工作模式
ipvsadm/ipvs
是命令行工具,需要安装
LVS
:ipvsadm/ipvsipvsadm
: 用户空间的命令行工具,规则管理器- 用于管理
集群服务
及RealServer(真实服务器)
- 用于管理
ipvs
:工作于内核空间netfilter
的INPUT钩子
上的架构
LVS三种工作模式
原理、以及优缺点比较:
模式名称 | 原理 | 优点 | 缺点 |
---|---|---|---|
NAT模式(VS-NAT) | 修改请求报文的目标IP ,多目标IP的DNAT 。 负载均衡器接收客户端请求,修改目标IP地址后转发给后端服务器,后端服务器的响应通过负载均衡器返回给客户端。 | + 配置简单 + 隐藏真实服务器IP,增加安全性 | - 所有流量必须经过负载均衡器,可能成为性能瓶颈 - 适用于小规模集群 |
直接路由模式(VS-DR) | 修改ARP映射,操纵封装新的MAC地址 。 负载均衡器修改请求报文的目标MAC地址为后端服务器的MAC地址,后端服务器直接响应客户端,绕过负载均衡器。 | - 高性能,减少负载均衡器的负担 - 适合大流量场景 | - 网络配置复杂 - 要求负载均衡器和后端服务器在同一物理网络 |
IP隧道模式(VS-TUN) | 以隧道协议重新封装包, 在原请求IP报文 之外新增一个IP首部 。 利用IP隧道技术将请求封装转发给后端服务器,后端服务器解封装后处理请求,响应直接返回客户端。 | - 适用于跨网络负载均衡 - 后端服务器可以位于不同物理网络 | - 需要隧道支持,网络配置复杂 - 增加了网络管理的复杂性 |
FULLNAT模式 | 修改请求报文的源 和目标IP 。 对请求进行四次NAT转换,后端服务器可以不在同一VLAN下。 | - 后端服务器可以使用私有地址 - 支持端口映射 | - 性能较低 - RS无法获取客户端真实IP - 适用于需要端口映射的场景 - linux内核默认不支持这种模式 |
Centos7安装LVS
ipvsadm
项目地址:http://www.linuxvirtualserver.org/
https://www.cnblogs.com/Yuanbangchen/p/16533293.html
# 安装ipvs功能
yum install -y ipset ipvsadm
LVS相关文件
文件 | 解释 |
---|---|
/usr/sbin/ipvsadm | LVS主程序 |
/usr/sbin/ipvsadm-save | 规则保存工具 |
/usr/sbin/ipvsadm-restore | 规则重载工具 |
/etc/sysconfig/ipvsadm-config | 配置文件 |
/etc/sysconfig/ipvsadm | ipvs调度规则文件 |
内核问题
Linux kernel 4.19
版本已经将nf_conntrack_ipv4
更新为nf_conntrack
,
而 kube-proxy 1.13
以下版本,强依赖 nf_conntrack_ipv4
。
解决方式:
1、降级
内核到 4.18
加载IPVS模块
模块名称 | 简短解释 |
---|---|
overlay | 联合文件系统模块,用于将多个目录的内容合并到一个挂载点,常用于容器技术。 |
br_netfilter | 桥接网络的 netfilter 模块,允许 netfilter 在桥接层工作,用于虚拟化环境中的流量过滤。 |
nf_conntrack | netfilter 的连接跟踪模块,用于跟踪网络连接的状态(新建、已建立、关闭等)。 |
ip_conntrack | IPv4 的连接跟踪模块,专门用于跟踪 IPv4 网络连接。 |
nf_conntrack_ipv4 | IPv4 的 netfilter 连接跟踪模块,支持 IPv4 流量的连接跟踪。 |
ip_vs | IP 虚拟服务器模块,用于负载均衡,支持多种调度算法。 |
ip_vs_rr | IPVS 的轮询(Round Robin)调度算法模块。 |
ip_vs_wrr | IPVS 的加权轮询(Weighted Round Robin)调度算法模块。 |
ip_vs_sh | IPVS 的基于源的哈希(Source Hashing)调度算法模块。 |
ip_vs_lc | IPVS 的最少连接(Least Connections)调度算法模块。 |
ip_vs_lblc | IPVS 的基于局部最少连接(Locality-Based Least Connections)调度算法模块。 |
ip_vs_lblcr | IPVS 的基于局部最少连接(带复制)调度算法模块。 |
ip_vs_dh | IPVS 的基于目的的哈希(Destination Hashing)调度算法模块。 |
ip_vs_fo | IPVS 的故障转移(Failover)调度算法模块。 |
ip_vs_nq | IPVS 的无队列(No Queueing)调度算法模块。 |
ip_vs_sed | IPVS 的最短期望延迟(Shortest Expected Delay)调度算法模块。 |
ip_vs_ftp | IPVS 的 FTP 协议支持模块,用于对 FTP 数据连接的负载均衡。 |
ip_tables | IPv4 的 netfilter 表模块,用于配置 IPv4 的防火墙规则。 |
ip_set | netfilter 的集合模块,允许创建和管理 IP 地址、端口等的集合。 |
ipt_set | iptables 的集合匹配模块,允许在 iptables 规则中使用 ip_set 定义的集合。 |
ipt_rpfilter | 反向路径过滤模块,用于防止 IP 欺骗。 |
ipt_REJECT | iptables 的拒绝目标模块,用于拒绝不符合规则的流量。 |
ipip | IP-in-IP 隧道模块,用于在 IP 网络上传输 IP 数据包。 |
xt_set | 扩展的集合匹配模块,支持更复杂的集合匹配规则。 |
# 在os启动时加载内核模块
cat <<EOF | tee /etc/modules-load.d/lvs.conf
br_netfilter
ip_conntrack
## 在 Linux内核4.19及以上,nf_conntrack_ipv4模块已经被nf_conntrack替换
nf_conntrack_ipv4
nf_conntrack
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
ip_vs_lc
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_tables
ip_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
xt_set
EOF
重启
查看内核模块是否生效.
# 查看对应模块是否加载
lsmod | grep -e ip_vs -e nf_conntrack
LVS常用参数
https://www.cnblogs.com/xiangsikai/p/8865890.html
https://www.linuxcool.com/ipvsadm
-L
|-l
list the table
-n
地址和端口以数字输出
-C
清除所有的虚拟服务规则
-A
添加一个虚拟服务
-E
修改虚拟服务器
-D
删除虚拟服务
-t
指定tcp协议
-u
指定udp协议
-s
指定调度算法,rr
是轮询算法
-a
在一个虚拟服务
中添加一个新的RS(真实服务器)
-r
RS(真实服务器)
IP地址
-g
指定LVS
的工作模式为直接路由模式
-w
RS(真实服务器)
的权重值
-e
编辑某个RS(真实服务器)
ipvsadm常用命令
ipvsadm核心功能:
- 集群管理服务:增删改
- 集群服务的RS管理:增删改
- 查看
管理虚拟服务 (Virtual Service)
管理参数
字母都是大写
# 添加一个新的虚拟服务 (Virtual Service)
ipvsadm -A
# 删除一个指定的虚拟服务 (及其下所有真实服务器)
ipvsadm -D
# 清空整个 IPVS 规则表 (删除所有服务和服务器)
ipvsadm -C
# 重载
## 从标准输入 (stdin) 恢复 IPVS 规则
ipvsadm -R
# 将当前 IPVS 规则保存到标准输出 (stdout), 可选 -n 以数字格式输出
ipvsadm -S -[-n]
管理虚拟服务 (Virtual Service)的RS规则
管理RS的参数
都是小写
# 添加一条虚拟服务(VS)或真实服务器(RS)规则
ipvsadm -a
# 删除一条虚拟服务(VS)或真实服务器(RS)规则
ipvsadm -d
# 列出当前的 IPVS 规则表
ipvsadm -L
# 清零所有规则的包、字节和连接计数器
ipvsadm -Z
查看lvs配置规则
# 查看配置
## -L|-l list the table
## -n 地址和端口以数字输出
ipvsadm -ln
清空所有配置
# 清空所有配置
## -C 清除所有的虚拟服务规则
ipvsadm -C
管理虚拟服务(listener)
常用负载均衡算法
添加一个虚拟服务(listener),使用轮询算法(rr):
# 添加一个虚拟服务(listener),使用轮询算法
## -A 添加一个虚拟服务
## -t 指定tcp协议
## -u 指定udp协议
## -s 指定调度算法,rr是轮询算法
ipvsadm -A -t 192.168.11.60:80 -s rr
## IPV6要用方括号扩起来
## sed 最小延迟
ipvsadm -A -t [2001:250:4000:2000::50]:888 -s sed
修改虚拟服务(listener)的算法为加权轮询(wrr):
## -E 修改
## -t 指定tcp协议
## -s 指定调度算法,wrr是加权轮询算法
ipvsadm -E -t 192.168.11.60:80 -s wrr
查看虚拟服务列表
# 先查看有哪些虚拟服务列表
## -L|-l list the table
## -n 地址和端口以数字输出
ipvsadm -nL
删除一个虚拟服务(listener)
# 删除一个虚拟服务(listener)
## -D 删除虚拟服务
## -t 指定tcp协议
ipvsadm -D -t 192.168.11.60:80
RS(后端服务器)管理
添加RS(真实服务器)-NAT模式
在一个虚拟服务
中添加一个新的RS(真实服务器)
## -a 在一个虚拟服务中添加一个新的RS(真实服务器)
## -t 指定tcp协议
## -u 指定UDP协议
## -r 后端服务器IP
## -m masquerading (NAT模式)
## -w 权重值
ipvsadm -a -u 10.187.71.3:8000 -r 10.187.71.5:8000 -m -w 100
添加RS(真实服务器)-DR模式
DR模式
内核配置:https://www.cnblogs.com/klb561/p/9215704.html
## -a 在一个虚拟服务中添加一个新的RS(真实服务器)
## -t 指定tcp协议
## -u 指定udp协议
## -r 指定真实的服务器地址
## -g 指定LVS 的工作模式为直接路由模式
## -w 真实服务器的权值
ipvsadm -a -u 10.187.71.3:8000 -r 10.187.71.5:8000 -g -w 100
修改RS(真实服务器)
## -e 编辑某个真实服务器
## -t 指定tcp协议
## -r 真实的服务器地址
## -g 指定LVS 的工作模式为直接路由模式
## -w 真实服务器的权值
ipvsadm -e -t 10.187.71.3:8000 -r 10.187.71.5:8000 -g -w 10
删除RS(真实服务器)
## -d 删除某个真实服务器
## -t 指定tcp协议
## -u 指定udp协议
## -r 真实的服务器地址
ipvsadm -d -u 10.187.71.3:8000 -r 10.187.71.5:8000
保存规则
lvs
默认路径在/etc/sysconfig/ipvsadm
文件中
# 1.保存规则到/etc/sysconfig/ipvsadm文件中
ipvsadm -S > /etc/sysconfig/ipvsadm
ipvsadm-save > /etc/sysconfig/ipvsadm
# 启动ipvsadm服务会自动保存规则
## 规则默认保存到/etc/sysconfig/ipvsadm文件中
systemctl enable --now ipvsadm
# 将规则导入到ipvsadm中-从/etc/sysconfig/ipvsadm文件中
ipvsadm -R < /etc/sysconfig/ipvsadm
ipvsadm-restore < /etc/sysconfig/ipvsadm
iptables/netfilter:
- iptables
- 用户空间的管理工具
- netfilter
- 内核空间上的架构
- 流入
PREROUTING
–>INPUT
- 流出
OUTPUT
–>POSTROUTING
- 转发
PREROUTING
–>FORWARD
–>POSTROUTING
- DNAT
- 目标地址转换;
PERROUTING
- 目标地址转换;