本节内容:
1.1 集群概述
1.2 LVS集群
1.3 LVS模式及工作原理
1.4 实战:配置LVS-NAT
集群概述
1.1.1 什么是集群?
一组各自相互独立且又相互依赖的,通过高速网络互联的计算机组成的一个计算机组, 以单一的系统模式加以管理, 为用户提供服务, 对用户来说, 用户只会认为对方是一个服务. 这个里面, 一组计算机的一台计算机就是集群的一个节点
1.1.2 集群的特性:
可伸缩性, 可靠性, 可管理性
1.1.3 应用场景:
例:
一台服务器 如果能够响应10000个并发 返回的状态码全部是200
如果现在有20000个并发 返回的状态码[ 200 304 301 500 404 ]
由以上例子说明,web服务已经达到瓶颈
解决这个问题的办法:
加配置: 加CPU, 加内存, 加带宽, 加SSD 这种解决方法称为“向上扩展”,
能够解决一时, 却不能持久一世[单台服务器上做动作]
加服务器: 一台==>两台, 两台==>四台 四台==>8台 使用多台服务器同时为用户提供服务 ,而这一种解决方法则称为“横向扩展”或“向外扩展”
向外扩展: 就是集群
1.1.4 集群的种类:
集群系统主要分为:
负载均衡(Load Balance)集群,简称LB
高可用(High Availability)集群,简称 HA 集群
高性能计算(High Perfermance Computing)集群,简称 HPC 集群
1.1.5 LB实现手段
硬件的实现: – F5 负载均衡器
软件的实现: – LVS(4层,传输层) – Nginx(7层,应用层)
1.2 LVS集群
1.2.1 LVS(Linux Virtual Server)
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一,是根据iptables
的实现来开发的,所以使用时候会和iptables相当类似
官网:http://www.linuxvirtualserver.org/
中文站点: http://zh.linuxvirtualserver.org/
1.2.2 LVS 集群工作结构图:
负载调度器:
分发器(Load Balancer, Director):
整个集群对外的最前端机, 负责接收用户请求, 并且根据自己的调度算法, 将请求转发到后端真实服务器上的动作,而客户认为服务是来自一个IP地址(我们可称之为VIP虚拟IP地址)上的。
服务器池:
Server Pool 真正为用户提供服务的服务器, 每一台服务器就是一台RS[RealServer],执行的服务有WEB、MAIL、FTP和DNS等。
共享存储:
Shared Storaged 为RS保持相同内容, 提供数据的一致性,也就是说,它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
LVS模式及工作原理
1.3.1 LVS(4层) 模式:
/VS/NAT
LVS-VS/DR
\VS/TUN
1.3.2 LVS负载均衡的三种包转发方式
LVS提供了三种包转发方式:
NAT(网络地址映射)、
IP Tunneling(IP隧道)、
Direct Routing(直接路由)。
不同的转发模式决定了不同的cluster的网络结构
1.3.3 NAT(网络地址映射)
NAT: 网络地址转换
DNAT: 目标地址转换 改变的是目标地址
SNAT: 原地址转换 改变的是原地址
LVS-NAT 就是使用的SNAT和DNAT完成报的转发
NAT方式可支持任何的操作系统,以及私有网络,并且只需一个Internet IP地址,但是整个系统的性能受到限制。因为执行NAT每次需要重写包,有一定的延迟;
另外,大部分应用有80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对负载均衡器形成很大压力,成为了新的瓶颈。
(请求从什么路线来,就从什么路线返回,从而造成负载均衡)
1.3.4 IP Tunneling(IP隧道)
director(分发器)分配请求到不同的real server。
real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。
IP Tunneling技术极大地提高了director的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过100个节点。
real server可以在任何LAN或WAN上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器必须拥有正式的IP地址用于与客户机直接通信,并且所有服务器必须支持IP隧道协议。
1.3.5 Direct Routing(直接路由)
与IP Tunneling类似,负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。
Direct Routing与IP Tunneling相比,没有IP封装的开销,但由于采用物理层(修改MAC地址)技术,所有服务器都必须在一个物理网段。
总结:
**非同一网段推荐 IP Tunneling方案实现集群、处于同一物理网段推荐 Direct Routing方案,最后才推荐NAT方案。**
1.3.6 LVS-NAT 模式工作原理:
客户端访问调度器时,调度器通过网络地址转换,调度器重写请求报文的目标地址,
根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
CIP 客户端的IP
VIP 是域名解析的IP, 是集群对外的公网IP
DIP 用来和后端服务器进行数据交互的IP, 请求报文转发给后端服务器从此口出去
RIP 真实服务器的IP
步骤2:
客户端访问调度器时,调度器通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;
步骤3:
真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
步骤总结及过程地址变化:
1: 客户端请求访问www.example.com[www.example.com ===> VIP]
源地址: CIP 目标地址: VIP
2: 请求报文到达负载均衡器
源地址: CIP 目标地址: RIP
3: RealServer收到报文处理, 响应
源地址: RIP 目标地址: CIP
4: 负载调度器收到报文, 根据自身之前的转发修改记录, 还原报文
源地址: VIP 目标地址: CIP
1.4 实战:配置LVS-NAT
1.4.1 实例1: LVS NAT模式
实验前期准备:
1、准备3台主机
2、iptables -F , 清除规则
3、 关SELinux
[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled
重启服务reboot
1.4.3 集群各节点IP注解:
客户端计算机的IP(CIP):
可能是一个本地的、与VIP在同一网络的私有ip地址,或者是一个因特网上的公共ip地址。用作向集群发送请求的源ip地址
虚拟IP(VIP):
Director用于向客户端提供服务的ip地址
Director的IP(DIP):
在Director的VIP上接收访问集群服务的请求,这些请求通过DIP转发出去抵达各个集群节点
真实real server IP(RIP):
在LVS术语中,向外部世界提供服务的节点叫做真实服务器,因此在真实服务器上使用的ip地址叫做真实ip地址(RIP)。
精简版,实验拓扑图:
1.4.4 配置LVS:
xuegod63配置成分发器:
1、打开路由转发功能
[root@xuegod63 ~]# vim /etc/sysctl.conf
改:net.ipv4.ip_forward = 0
添加:net.ipv4.ip_forward = 1
让配置生效:
[root@xuegod63 ~]# sysctl -p
2、配置网络环境:
添加一个网卡(需要两张网卡),
配置成以下网络环境:
备注:
需要将默认的第一张网卡设置为仅主机模式来模拟内网,第二张新加的网卡设置为桥接模式来模拟公网,通过访问公网的IP来实现负载均衡
eth0 192.168.1.63 模式:br0 模拟公网
eth1 192.168.2.63 模式:vmnet4 模拟内网
另外两台RealService(真实服务器)的网卡配置分别如下:
APADDR=192.168.2.62
GETAWAY= 192.168.2.63
PREFIX=24
APADDR=192.168.2.64
GETAWAY= 192.168.2.63
PREFIX=24
关于桥接模式的参考链接:
https://blog.csdn.net/qq_22803691/article/details/89428594
[lh@localhost ~]$ sudo vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=8b831d5d-f5a2-4d7b-bf92-3294f5d52e5c
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.1.62
PREFIX=24
GATEWAY=192.168.1.1
[lh@localhost network-scripts]$ sudo cp ifcfg-ens33 ifcfg-ens37
[lh@localhost ~]$ sudo vim /etc/sysconfig/network-scripts/ifcfg-ens37
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
UUID=8b831d5d-f5a2-4d7b-bf92-3294f5d52e5c
DEVICE=ens37
ONBOOT=yes
IPADDR=192.168.2.62
PREFIX=24
[lh@localhost ~]$ sudo systemctl restart network.service
[lh@localhost network-scripts]$ ifconfig # 查看是否生效
Director分发器:需不需要开启80(服务的)端口 ?
1.4.5 安装: LVS管理工具: ipvsadmin
[root@xuegod63 Packages]# pwd
/mnt/Packages
[root@xuegod63 Packages]# rpm -ivh ipvsadm-1.25-9.el6.x86_64.rpm
或:
yum install ipvsadm
无法连接到公网时的问题处理:
参考链接:
https://blog.51cto.com/13648313/2164307
1.4.6 使用ipvsadm命令设置规则:
[root@xuegod63 ~]# ipvsadm -A -t 192.168.1.63:80 -s rr rr代表轮循
选项:
192.168.1.63:80 代表使用公网的ip来映射内网的2台真实服务的内网Ip
-A 添加虚拟服务器
-t 表示TCP的服务 VIP:PORT
-s 指定调度算法 rr表示round-robin 轮循
.
[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.2.64 -m
[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.2.62 -m
选项:
-a 表示添加real server的地址
-r 指定real server的IP地址
-m 表示masquerade 也就是NAT方式的LVS
1.4.7 查看:
Ipvsadm命令,用于配置及查看内核IPVS表和算法的工具,类似于iptables
[root@xuegod63 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.63:80 rr
-> 192.168.2.62:80 Masq 1 0 0
-> 192.168.2.64:80 Masq 1 0 0
1.4.8 保存配置或规则
[root@xuegod63 ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
或ipvsadm -S 保存以上的配置
Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]
1.4.9 配置真实服务器
RealServer:在xuegod62和xuegod64上面配置:
1、配置IP:REAL SERVER自己的网络相关信息配置成如下:
# 真实服务器的网关采用分发服务器的内网Ip
xuegod62: eth0: vmnet4 : 192.168.2.62 网关: 192.168.2.62
xuegod64: eth0: vmnet4 : 192.168.2.64 网关: 192.168.2.62
2、配置xuegod64为realserver, 并启web服务
[root@xuegod64 ~]# yum install -y httpd
[root@xuegod64 ~]# systemctl restart httpd
[root@xuegod64 ~]# echo "192.168.2.64" > /var/www/html/index.html #(实验期间,各个服务器的页面不同)
3、配置xuegod62为realserver, 并启web服务
[root@xuegod62 ~]# yum install -y httpd
[root@xuegod62 ~]# systemctl restart httpd
[root@xuegod62 ~]# echo "192.168.2.62" > /var/www/html/index.html #(实验期间,各个服务器的页面不同)
1.4.10 测试:
在xuegod63上测试:
[root@xuegod63 ~]# yum install elinks
测试realserver :
[root@xuegod63 ~]# elinks 192.168.2.64
[root@xuegod63 ~]# elinks 192.168.2.64 --dump
192.168.2.64
[root@xuegod63 ~]# elinks 192.168.2.62 --dump
192.168.2.62
1.4.11 测试VIP:
[root@xuegod63 ~]# elinks 192.168.1.63 --dump
192.168.2.62
访问: 在物理上打开浏览器访问: 每按F5刷新一次,就会变换一个页面。
分发器需要监听80 吗?我们来看看
1.4.12 扩展ipvsadm 更多参数说明
-L -n ==> 查看规则,显示内核虚拟服务器表
-L -n -c ==> 查看客户端连接分发器和real server 的情况
例1:
[root@xuegod63 ~]# ipvsadm -L -n -c
IPVS connection entries
pro expire state source virtual destination
TCP 01:33 TIME_WAIT 192.168.1.100:49698 192.168.1.70:80 192.168.2.62:80
TCP 01:26 TIME_WAIT 192.168.1.100:49690 192.168.1.70:80 192.168.2.64:80
TCP 01:57 TIME_WAIT 192.168.1.100:49739 192.168.1.70:80 192.168.2.62:80
选项:
-L -n --stats ==> 查看分发情况
-L -n --rate ==> 查看速率
-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
例2:
[root@xuegod63 ~]# ipvsadm -Z
[root@xuegod63 ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
选项:
-Z --clear 清空IPVS的数据、等信息
例3:
[root@xuegod63 ~]# ipvsadm -C
选项:
-C 清空所有规则
LVS的规则配置文件:
/etc/sysconfig/ipvsadm
附录:ipvsadm命令选项解释:
-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 地址和端口的数字形式
超时时间用ipvsadm --set tcp tcpfin udp设置,比如
#ipvsadm --set 120 20 100
表示tcp空闲等待时间为120 秒
客户端关闭链接等待时间为20秒
udp空闲等待为100秒