文章目录
Linux云计算架构-使用LVS-NAT搭建集群实现负载均衡
1. 集群
先看看比较正规的理解:
集群是一组各自相互独立且又相互依赖的,通过高速网络互联的,由计算机组成的一个计算机组, 以单一的系统模式加以管理, 为用户提供服务。对用户来说, 用户只会认为对方是一个服务。 在这个集群里面, 一组计算机的一台计算机就是集群的一个节点。
再来看看不那么正规的理解:
场景介绍:市民拨打12345政府服务热线,由热线机构的话务员接听。热线话务员将工单登记提交,再由派单员转派给承办单位处理。
在以上环境中,热线机构+承办单位组成了一个集群,为市民提供服务。市民对接的仅有热线的话务员,对其他人员是不知道其存在的。每一个承办单位,都是这个集群里面的一个节点。
集群的优点:可伸缩性、可靠性、可管理性
什么时候才需要集群?
当并发访问量小于一台web服务器所能提供的响应量时,返回的状态码都是200,即都能响应。而当并发访问量超过一台web服务器所能提供的响应量时,就会存在丢失请求的情况,返回的状态码可能时200、304、301、500、400。这时说明一台web服务器已经不足以提供服务了。
为了解决上述问题,可以为这台web服务器,添加CPU、内存、带宽、SSD,这种方法称之为“向上扩展”,当出现单点故障
时,就无法提供服务了。另一种方法就是集群,通俗地说就是添加服务器。同时使用多台服务器为用户提供服务,也叫“向外扩展”。
根据集群的作用,可分为以下几种:
负载均衡(Load Balance)集群,简称 LB:一起扛
实现方法:①硬件(负载调度器);②软件(LVS[4层,传输层]、Nginx[7层,应用层])
高可用(High Availability)集群,简称 HA 集群:你挂了我来扛
高性能计算(High Perfermance Computing)集群,简称 HPC 集群:CPU多,计算速度快
2. LVS集群
上面说了,可以使用LVS搭建负载均衡集群。LVS(Linux Virtual Server) 即Linux虚拟服务器,主要是对传输层进行操作。拓扑图如下:
①调度器(Load Balancer,Director,也叫负载均衡器):集群的对外主机,负责接收用户的请求,并根据调度算法,将请求转发到后端真实的web服务器上,客户端会认为服务是由一个IP地址提供的,可以称之为VIP,即虚拟IP地址。(热线的话务员)
②web服务器池(Server Pool): 真正为用户提供服务的服务器,每一台服务器都是真实的。称之为RS。
③共享存储(Shared Storaged): 类似共享目录,保证RS每次都能获取到相同的内容,提供相同的服务,保证数据的一致性。
分发器为了把用户请求,转发给RS,需要指定转发方式。转发方式有以下三种:
①NAT(网络地址映射):
DNAT: 目标地址转换,改变的是目标地址
SNAT: 原地址转换,改变的是原地址
LVS-NAT 就是使用的 SNAT 和 DNAT 完成报文的转发
NAT 方式可支持任何的操作系统,以及私有网络,并且只需一个 Internet IP 地址,但是整个系统的性能受到限制。
因为执行 NAT 每次需要重写包,有一定的延迟;另外,大部分应用有 80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对负载均衡器形成很大压力,成为了新的瓶颈。
②IP Tunneling(IP隧道):
director(分发器)分配请求到不同的RS。RS处理请求后直接回应给用户,这样director 负载均衡器仅处理客户机与服务器的一半连接。、
IP Tunneling 技术极大地提高了 director 的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过 100 个节点。
RS可以在任何 LAN 或 WAN 上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器必须拥有正式的 IP 地址用于与客户机直接通信,并且所有服务器必须支持 IP 隧道协议。
③Direct Routing(直接路由):
与 IP Tunneling 类似,负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct Routing 与 IP Tunneling 相比,没有 IP 封装的开销,但由于采用物理层(修改 MAC地址)技术,所有服务器都必须在一个物理网段。
3. 部署LVS-NAT集群
3.1 LVS-NAT原理
LVS-NAT模式工作原理:
客户端访问调度器时,调度器通过网络地址转换(NAT),重写请求报文的目标地址,根据调度器内预设的调度算法,将请求派给后端真实的服务器。真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户端,完成整个负载调度过程。
优缺点:
- 仅需一个公网IP即可搭建集群,较安全。
- 请求报文和响应报文都会经过调度器,这是一个瓶颈
- 调度器挂了,集群就挂了。
- 不具有健康状态监测或者具有较弱的监测,不适合生产。
3.2 部署LVS-NAT
CIP-VIP-DIP-RIP(发起请求)
CIP 客户端IP:发起请求的IP
VIP 调度器的虚拟IP:接收客户端发起的请求
DIP 调度器的真实IP:VIP通过NAT转换成DIP
RIP 后端服务器的真实IP:接收来自DIP发来的请求,并响应。
RIP-DIP-VIP-CIP(响应)
RIP:发起响应报文
DIP:由调度器的真实IP收到,并对源地址重写为VIP
VIP:发送响应报文给客户端
CIP:接收来自VIP的响应报文
# 一台主机作为调度器,两台主机作为后端真实服务器
# 调度器配置
调度器内网IP:192.168.10.10
调度器外网VIP:192.168.8.154
# 打开调度器的路由转发功能,添加以下行,或0改为1
[root@virtual ~]# vim /etc/sysctl.conf
11 net.ipv4.ip_forword=1
# 立即生效
[root@virtual ~]# sysctl -p
net.ipv4.ip_forward = 1
# 安装LVS管理工具ipvsadm,这里使用yum安装
[root@virtual ~]# yum install ipvsadm.x86_64 -y
或
[root@virtual ~]# cd /run/media/root/CentOS\ 7\ x86_64/Packages
[root@virtual Packages]# ll ipvs*
-rw-rw-r--. 1 root root 45760 3月 14 2015 ipvsadm-1.27-7.el7.x86_64.rpm
[root@virtual ~]# rpm -ivh /run/media/root/CentOS\ 7\ x86_64/Packages/ipvsadm-1.27-7.el7.x86_64.rpm
ipvsadm参数 | 作用 |
---|---|
-A | 添加虚拟服务器 |
-t | 指定调度器的VIP及端口号,VIP:PORT 提供的是tcp的服务 |
-u | 指定调度器的VIP及端口号,VIP:PORT 提供的是udp的服务 |
-s | 指定调度算法,rr指round-robin轮询 |
-a | 添加真实服务器 |
-r | 指定真实服务器的IP地址及端口号,RIP:PORT |
-m | 指定masquerade,即NAT方式 |
-L | -L -n -L -n -c |
-n | 查看ipvs配置,查看内核虚拟服务器表 |
-c | 查看客户端连接调度器和真实服务器的情况 |
–stats | 查看分发情况 |
–rate | 查看速率 |
-Z – zero | 虚拟服务器计数表清零(清空当前的连接数量) |
-C --clear | 清空IPVS数据和信息 |
# 添加虚拟服务器
[root@virtual ~]# ipvsadm -A -t 192.168.8.154:80 -s rr
# 添加真实服务器
[root@virtual ~]# ipvsadm -a -t 192.168.8.154:80 -r 192.168.10.20 -m
[root@virtual ~]# ipvsadm -a -t 192.168.8.154:80 -r 192.168.10.30 -m
# 查看内核IPVS表和算法
[root@virtual ~]# 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.8.154:80 rr
-> 192.168.10.20:80 Masq 1 0 0
-> 192.168.10.30:80 Masq 1 0 0
# 查询以上ipvsadm的配置信息(虚拟服务器和真实服务器)
# ipvsadm --save 与 ipvsadm -S 结果一样
[root@virtual ~]# ipvsadm -S
-A -t virtual:http -s rr
-a -t virtual:http -r 192.168.10.20:http -m -w 1
-a -t virtual:http -r 192.168.10.30:http -m -w 1
# 保存配置信息,以便之后查看
[root@virtual ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
[root@virtual ~]# cat /etc/sysconfig/ipvsadm
-A -t virtual:http -s rr
-a -t virtual:http -r 192.168.10.20:http -m -w 1
-a -t virtual:http -r 192.168.10.30:http -m -w 1
# 如果发现ipvsadm规则制定错误,可以清空重新制定
[root@virtual ~]# ipvsadm -C
[root@virtual ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 配置真实服务器
# 后端真实服务器1 IP:192.168.10.20 网关地址为192.168.10.10
# 后端真实服务器2 IP:192.168.10.30 网关地址为192.168.10.10
# 为两台真实服务器分别配置httpd服务,并修改index.html
# 不懂如何在没有外网的情况下安装httpd服务的,可以看附件1
[root@server1 ~]# yum install httpd -y
[root@server1 ~]# systemctl start httpd
[root@server1 ~]# systemctl enable httpd
[root@server1 ~]# echo "this is server1" > /var/www/html/index.html
[root@server1 ~]# cat /var/www/html/index.html
this is server1
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# systemctl start httpd
[root@server2 ~]# systemctl enable httpd
[root@server2 ~]# echo "this is server2" > /var/www/html/index.html
[root@server2 ~]# cat /var/www/html/index.html
this is server2
# 安装elinks测试负载均衡情况
[root@virtual ~]# yum install elinks -y
# 先测试真实服务器地址是否可以访问
[root@virtual ~]# elinks 192.168.10.20 --dump
this is server1
[root@virtual ~]# elinks 192.168.10.30 --dump
ELinks: 没有到主机的路由
# server2不通,查看下对应的防火墙80端口号,确实没打开,而server1的打开了,把server2的也打开。
# 打开后就没问题了
[root@server2 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp
success
[root@server2 ~]# firewall-cmd --reload
success
[root@virtual ~]# elinks 192.168.10.30 --dump
this is server2
# 负载均衡的权重weight都为1,所以是平均分配的。一人一次。
# InActConn 为分配的次数,下一次分配应该是192.168.10.20
# elinks 192.168.8.154 --dump
[root@virtual ~]# elinks 192.168.8.154 --dump
this is server2
[root@virtual ~]# elinks 192.168.8.154 --dump
this is server1
[root@virtual ~]# elinks 192.168.8.154 --dump
this is server2
[root@virtual ~]# elinks 192.168.8.154 --dump
this is server1
[root@virtual ~]# elinks 192.168.8.154 --dump
this is server2
[root@virtual ~]# elinks 192.168.8.154 --dump
this is server1
[root@virtual ~]# elinks 192.168.8.154 --dump
this is server2
[root@virtual ~]# 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.8.154:80 rr
-> 192.168.10.20:80 Masq 1 0 10
-> 192.168.10.30:80 Masq 1 0 11
# 物理机作为客户端访问服务器的外网地址,看界面是否会变换。
# 由于浏览器带有缓存功能,所以可以打开多个网页,输入http://192.168.8.154/ 看每次的内容是不是都会变换
# 在虚拟服务器上开放80端口号,清空iptables
[root@virtual ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp
success
[root@virtual ~]# firewall-cmd --reload
success
[root@virtual ~]# iptables -F
通过lvs-nat集群,可以使得用户请求按需分配给不同的后端真实服务器,以减轻对虚拟服务器的压力。
4. 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 是 aster 或是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 指定客户地址的子网掩码
-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 地址和端口的数字形式
-6: 如果fwmark用的是ipv6地址需要指定此选项。
附件1:配置本地yum源安装httpd服务
# 由于真实服务器没有连接外网,只能使用本地yum源
# 编辑本地yum源配置文件
# 查看本地镜像挂载目录,如果不是yum源内的目录,可以重新挂载。
[root@server2 ~]# ll /etc/yum.repos.d/centos7.repo
-rw-r--r--. 1 root root 121 7月 19 16:02 /etc/yum.repos.d/centos7.repo
[root@server2 ~]# cat /etc/yum.repos.d/centos7.repo
[centos7]
name=centos7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@server2 ~]# umount /dev/sr0
[root@server2 ~]# mkdir /media/cdrom
[root@server2 ~]# mount /dev/cdrom /media/cdrom/
[root@server2 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17G 3.9G 14G 23% /
devtmpfs 894M 0 894M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 11M 900M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 1014M 179M 836M 18% /boot
tmpfs 182M 20K 182M 1% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /media/cdrom
[root@server2 ~]# yum install httpd -y
附件2:ipvsadm命令演示
# 查看虚拟服务器表的规则
# 轮询方式为rr
# InActConn 访问次数
[root@virtual ~]# 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.8.154:80 rr
-> 192.168.10.20:80 Masq 1 0 2
-> 192.168.10.30:80 Masq 1 1 1
# 每一次访问虚拟服务器外网地址时,显示客户端、虚拟服务器、后端真实服务器的IP地址
[root@virtual ~]# ipvsadm -L -n -c
IPVS connection entries
pro expire state source virtual destination
TCP 01:41 FIN_WAIT 192.168.8.102:52620 192.168.8.154:80 192.168.10.20:80
TCP 01:52 FIN_WAIT 192.168.8.102:52657 192.168.8.154:80 192.168.10.20:80
TCP 01:40 FIN_WAIT 192.168.8.102:52621 192.168.8.154:80 192.168.10.30:80
TCP 01:56 FIN_WAIT 192.168.8.102:52674 192.168.8.154:80 192.168.10.30:80
# 查看分发状态
[root@virtual ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.8.154:80 9 59 45 6017 5303
-> 192.168.10.20:80 4 30 22 3533 2490
-> 192.168.10.30:80 5 29 23 2484 2813
# 查看速率
[root@virtual ~]# ipvsadm -L -n --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 192.168.8.154:80 0 0 0 0 0
-> 192.168.10.20:80 0 0 0 0 0
-> 192.168.10.30:80 0 0 0 0 0