文章目录
LVS NAT模式 DR模式
集群概述
什么是集群
- 通过高速网络将很多服务器集中起来
- 提供同一种服务,在客户端开来就像是只有一个服务器
- 可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益
- 任务调度是集群系统中的核心技术
集群目的
- 提高性能
- 降低成本
- 提高可扩展性
- 增强可靠性
集群分类
- 高性能计算集群HPC
- 通过以集群开发的并行应用程序,解决复杂的科学问题
- 负载均(LB)衡集群
- 客户端负载在计算机集群中尽可能平均分摊
- 高可用(HA)集群
- 避免单点故障,当一个系统发生故障时,可以快速迁移
LVS概述
LVS集群组成
- 前端: 负载均衡层
- 有一台或多台负载调度器构成
- 中间: 服务器群组层
- 由一组实际运行应用服务的服务器组成
- 底端: 数据共享存储层
- 提供共享存储空间的存储区域
LVS缩写
LVS术语 | 说明 |
---|---|
Director Server | 调度服务器 将负载分布到Real Server的服务器 |
Real Server | 真实服务器 真正提供应用服务的服务器 |
VIP | 虚拟IP地址 公布给用户访问的虚拟IP地址 |
DIP | 调度器连接后端节点服务器的IP地址 |
RIP | 真实IP地址 集群节点上使用的IP地址 |
LVS工作模式
- VS/NAT
- 通过网络地址转换实现的虚拟服务器
- 大并发访问时,调度器的性能成为瓶颈
- VS/DR
- 直接使用路由技术实现虚拟服务器
- 节点服务器需要配置VIP,注意MAC地址广播
- VS/TUN
- 通过隧道方式实现虚拟服务器
LVS负载均衡调度算法
目前实现10种调度算法
常用的调度算法
- 轮询(Round Robin)
- 加权轮询(Weighted Round Robin)
- 最少连接(Least Connections)
- 加权最少连接(Weighted Least Connections)
其他调度算法
- 源地址散列(Source Hashing)
- 目标地址散列(Destination Hashing)
- 基于局部性的最少链接
- 带复制的基于局部性最少链接
- 最短的期望的延迟
- 最少队列调度
ipvsadm
命令了解
命令基础选项 | 含义 |
---|---|
ipvsadm -A | (add)添加虚拟服务器 |
ipvsadm -E | (edit)修改虚拟服务器 |
ipvsadm -D | (delet)删除虚拟服务器 |
ipvsadm -C | (clear)清空所有 |
ipvsadm -a | (add)添加真实服务器 |
ipvsadm -e | (edit)修改真实服务器 |
ipvsadm -d | (delet)删除真实服务器 |
ipvsadm -L | (list)查看LVS规则表 |
-s[ rr | wrr | lc | wlc | sh ] | (scheduler)指定集群算法 |
命令格式 | 含义 |
ipvsadm -A -t|u 192.168.4.5:80 -s [算法] | 添加虚拟服务器,协议为tcp(-t)或者udp(-u) |
ipvsadm -E -t|u 192.168.4.5:80 -s [算法] | 修改虚拟服务器,协议为tcp或者udp |
ipvsadm -D -t|u 192.168.4.5:80 | 删除虚拟服务器 协议为tcp或udp |
ipvsadm -C | 清空所有 |
ipvsadm -a -t|u 192.168.4.5:80 -r 192.168.2.100 [-g|i|m] [-w 权重] | 添加真实服务器 -g(DR模式) -i(隧道模式) -m(NAT模式) |
ipvsadm -e -t|u 192.168.4.5:80 -r 192.168.2.100 [-g|i|m] [-w 权重] | 修改真实服务器 -r 真实服务器 |
ipvsadm -d -t|u 192.168.4.5:80 -r 192.168.2.100 | 删除真实服务器 |
ipvsadm -Ln | 查看LVS规则表 |
总结
- 大写虚拟(针对调度器),小写真实(针对真实提供服务的服务器)
- AaEeDd 增改删
案例测试
NAT模式
前置准备
主机名 | 说明 |
---|---|
proxy | 192.168.2.5 192.168.4.5 Directory Server 要开启路由功能 |
web1 | 192.168.2.100 网关为192.168.2.5 Real Server (设置网关是为了数据能够顺利回传) |
web2 | 192.168.2.200 网关为 192.168.2.5 Real Server |
client | 192.168.4.10 |
测试
#proxy
cat /proc/sys/net/ipv4/ip_forward
0 #0为关闭路由功能
echo 1 > /proc/sys/net/ipv4/ip_forward #写入1开启路由功能 临时的
vim /etc/sysctl.conf #修改配置文件 改永久的
============================
net.ipv4.ip_forward = 1
==============================
yum -y install ipvsadm #安装LVS所需包
ipvsadm -A -t 192.168.4.5:80 -s wrr #开启集群 加权轮询算法
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.4.5:80 wrr
ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.100 -w 2 -m #-m NAT模式
ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.200 -m
#client
curl 192.168.4.5
192.168.2.100
curl 192.168.4.5
192.168.2.100
curl 192.168.4.5
192.168.2.200 #成功访问了 2:1的加权轮询
#特别提示下 2.100和2.200的回传需要这两台机子网关设置为2.5
#并且提供服务的两台机子不能和客户端同网段 (数据回传不会发给网关 照样不通 测试环境下)
ipvsadm -C #清下环境 下面再测试
DR模式
与NAT模式的区别在于数据回传不需要经过Director Server
环境配置
主机名 | 说明 |
---|---|
proxy | ens33 192.168.4.5 ens33:0 192.168.4.15/24 |
web1 | ens33 192.168.4.100/24 lo:0 192.168.4.15/32 |
web2 | ens33 192.168.4.200/24 lo:0 192.168.4.15/32 |
client | 192.168.4.10/24 |
测试
#proxy
cd /etc/sysconfig/network-scripts/ #配置伪装ip
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
===========================
TYPE=Ethernet #网卡类型:以太网卡
BOOTPROTO=none #none 手动配置 dhcp 自动配置IP
NAME=ens33:0 #网卡名
DEVICE=ens33:0 #设备名
ONBOOT=yes #开始自动激活该网卡
IPADDR=192.168.4.15 #IP地址
PREFIX=24 #子网掩码
#因为是拷贝的 UUID记得删除~
==============================
systemctl restart network #重启网络服务
ip address show #看下Ip
......
ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:57:c2:c1 brd ff:ff:ff:ff:ff:ff
inet 192.168.4.5/24 brd 192.168.4.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.4.15/24 brd 192.168.4.255 scope global secondary noprefixroute ens33:0
........
#发现有4.15的ip了
#RHEL7和Centos7系统中有两个管理网络的服务,如果冲突 关闭NetworkManager服务再重启network试试
#web1
nmcli connection ipv4.method manual ipv4.addresses 192.168.4.100/24 connection.autoconnect yes
#设置ip地址为4.100
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0 #复制模板
vim ifcfg-lo:0 #修改
===========================
DEVICE=lo:0 #设备名称
IPADDR=192.168.4.15 #IP地址
NETMASK=255.255.255.255 #子网掩码
NETWORK=192.168.4.15 #网络地址
BROADCAST=192.168.4.15 #广播地址
ONBOOT=yes #开机是否激活网卡
NAME=lo:0 #网卡名称
================================
vim /etc/sysctl.conf #因为web1也配置了4.15 默认会地址冲突 需要设置
======================================
net.ipv4.conf.all.arp_ignore = 1 #忽略
net.ipv4.conf.lo.arp_ignore = 1 #忽略
net.ipv4.conf.lo.arp_announce = 2 #不宣告
net.ipv4.conf.all.arp_announce = 2 #不宣告 看下方参数介绍
========================================
#当有arp广播问谁是192.168.4.15时,本机忽略arp广播,不做任何回应(防止进站冲突)
#本机不向外宣告自己的lo回环地址是192.168.4.15(防止出站冲突)
#web2重复上面操作 地址不一样 伪装ip都是4.15
#proxy
ipvsadm -A -t 192.168.4.15:80 -s wrr
ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.100 -w 1 -g
ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.200 -w 1 -g
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.4.15:80 wrr
-> 192.168.4.100:80 Route 1 0 0
-> 192.168.4.200:80 Route 1 0 0
#client
#测试下
curl 192.168.4.15
192.168.2.100
curl 192.168.4.15
192.168.2.200
#轮询成功 显示内容2.100是因为上个案例http服务网页内容没改
总结
- DR模式数据方向来看 客户端传过来的数据经过Director Server之后给Real Server 然后Real Server 直接回传给客户端(真实情况应该是通过路由 这个案例测试中同是192.168.4.0网段 避开了这个问题)
- 根据上面的思路 客户端最终会丢弃Real Server的数据 因为发送的请求是给Director Server 收到了数据包 发送者居然是Real Server 客户端只会接受Director Server回应的数据包
- 那么只能使用地址欺骗了!
- 设置VIP为192.168.4.15 且配置在虚拟接口
- DIP192.168.4.5就是proxy和Real Server 交接的IP
- LVS中交接的RIP分别是web1 192.168.4.100 和web2 192.168.4.200
- web1 web2需在loopback address 上设置 192.168.4.15 和VIP一样 这样就能发送伪装成192.168.4.15发送的数据包了 解决了上面客户端丢弃数据包的问题
- 特别说明 loopback address仅自己可见 对外部机子不可见 一定程度上解决了IP冲突 但是ARP过程中会回应 还是会有IP冲突!!!
- 那么就需要设置特别操作了 设置/etc/sysctl.conf文件 上面那几句是为了防止暴露自身IP
- /etc/sysctl.conf 中ignore 和 announce参数说明
ignore
arp_ignore参数的作用是控制系统在收到外部的arp请求时,是否要返回arp响应。
arp_ignore参数常用的取值主要有0,1,2,3~8较少用到:
0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。
1:只响应目的IP地址为接收网卡上的本地地址的arp请求。
2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。
3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
4~7:保留未使用
8:不回应所有的arp请求
sysctl.conf中包含all和eth/lo(具体网卡)的arp_ignore参数,取其中较大的值生效。
announce
arp_announce参数常用的取值有0,1,2。
0:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用数据包a的源IP。
1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。
2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。
sysctl.conf中包含all和eth/lo(具体网卡)的arp_ignore参数,取其中较大的值生效。
LVS和Nginx的区别
LVS本身不自带健康检查功能 需要自己写程序监控
思路
- 用LVS调度器循环访问提供服务集群的真实IP下的端口服务
- 如果发现访问失败 就调用ipvsadm -d 命令将失败的服务器从集群中踢出
- 如果后来又能访问了 就调用ipvsadm -a 命令加回来
- 每次循环sleep个几秒