LVS(Linux virtual server)
LVS简介
LVS的功能和实现方法
原理详解参考文献
原理详解参考文献
Hulk LVS
它是一个负载均衡(可代替Nginx)、高可用性集群,主要针对大业务量的网络应用(比如新闻。电子商务、网上银行…)
LVS负载均衡是将用户访问请求根据一定的转发策略分发到后端多台服务器(支持物理机/虚机/容器等)的流量分发控制服务。它采用LVS(Linux Virtual Server) + keepalived的方式实现,设置虚拟服务地址(VIP),通过健康检查自动摘除不可用的服务器,从而提升应用的整体服务能力,增强应用的可用性。
LVS是建立在一个主控服务器(双机)及若干个真实服务器组成。真实服务器负责提供服务,主控服务器会根据指定的调度算法对真实的服务器进行控制。LVS集群结构对用户来说是透明的,客户端只与单个IP(虚拟IP)进行通信。客户端向lvs发出服务请求,主控服务器会通过特定的算法来指定某个真实服务器来应答,而客户端只与负载均衡的IP进行通信
LVS 常见算法:
1.轮询调度RR:
将外部请求按照顺序轮流分配到真实的服务器上
2.加权轮询WRR:
根据真实服务器的不同处理能力来调度访问请求
3.最少链接数LC:
调度器通过最少连接调度算法动态的将网络请求调度到以建立的连接数最少的服务器上
(两台服务器配置差不多时使用)
4.加权最少连接WLC:
优化负载的性能,较高权重的服务器将承受较大比例的活动连接负载
(两台服务器 有一台比较弱时 可以使用)
5.基于局部性的最少连接 LBLC:
针对目标的IP地址的负载均衡,应用于cache集群上。会根据请求的目标IP地址找出该目标IP地址最近使用的服务器,如果该服务器是可用的没有超载,则将请求发送到服务器上,若服务器不存在,或服务器处于一半的工作负载,则用最少连接数选出一个服务器
6.带复制的基于局部性的最少连接lblcr (locality-Based Least Connections with Replication)
也是针对目标IP地址的负载均衡,用于cache集群。它与LBLC算法不同之处是它要维护的是从一个目标IP地址到一组服务器的映射,而LBLC算法维护的是从一个目标IP地址到一台服务器的映射。
7.目标地址散列-dh (Destination IP Hashing)
目标地址散列调度算法根据请求的目标IP地址,作为散列键(Hash KEY)从静态分配的散列表中找出对应的服务器,若服务器是可用的且未超载,则请求发送到该服务器,否则返回空。
8.源地址散列-sh
根据请求的源IP地址,作为散列键从静态分配的散列表中找出对应的服务器,若服务器是可用的且未超载,则请求发送到该服务器,否则返回空。
9.源IP端口散列
通过hash函数将来自用一个源IP地址和源端口号的请求映射到后端同一台服务器上。
(适合按服务的类型分类)
1.随机
随机地将请求分发到不同的服务器上
典型的负载均衡集群中,包括三层次的组件,前端至少一个负载均衡调度器(LB)负责相应并发来自客户端的访问请求;后端有大量真实服务器构成服务池(server pool)提供实际的应用服务
透明性 一致性和伸缩性
LVS的相关术语
DS:Director Server。指的是前端负载均衡器节点
RS:Real Server。后端真实的工作服务器
VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址
DIP:Director Server IP,主要用于和内部主机通讯的IP地址
RIP:Real Server IP,后端服务器的IP地址
CIP:Client IP,访问客户端的IP地址
负载均衡群集结构
第一层:
负载调度器
接受客户端的访问请求,查询调度规则表,向节点服务器转发请求,是链接客户端的节点服务器的接口
这是访问整个集群系统唯一入口,对外使用所有服务器共有虚拟IP(VIP),也称为集群IP,通常会配置主备两台调度器实现热备份。
第二层:
服务器池
接受调度器发送的访问请求,处理请求,返回数据的应用程序服务器
集群服务提供的应用服务,由服务器池承担。每个节点具有独立的真实IP,只处理调度器分发过来的客户机请求。当某个节点失效时,负载调度器的容错机制会将它隔离,等排出错误后,在从新纳入服务器池
第三层:
共享存储
给节点服务器提供存储服务,统一数据
为服务池中的所有节点提供稳定的,一致的文件存取服务,保证整个集群的统一性
负载均衡的工作模式
工作模式详解
工作模式详解
工作模式:
调度技术可以基于IP、端口、内容进行分发。基于IP的效率最高。常见的有三种,地址转换、IP隧道和直接路由。
地址转换:
简称NAT模式,类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,及作为客户机的访问入口,也是各个节点回应客户机的访问出口。服务器节点使用的是私有IP地址
IP隧道:
简称TUN模式,采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器。服务器节点分散在不同的位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信。
直接路由:
简称DR模式,采用半开放式网络结构,与TUN模式的结构类似,但是节点并不是分散的,而是与调度器位于同一物理网络。通过本地网络连接,不需要建立专用IP隧道。
LVS集群的管理工作主要包括创建虚拟服务器、添加服务器节点、查看集群节点状态、删除服务器节点和保存负载分配策略
安装及应用
LVS的NAT模式
client 192.168.1.100 gw 192.168.1.10
lvs ip1 192.168.1.10 ip2 192.168.2.10 不用网关
web1 192.168.2.20 gw 192.168.2.10 httpd 111111
web2 192.168.2.30 gw 192.168.2.10 httpd 222222
web1:
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp
success
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
[root@localhost ~]# yum -y install httpd
# 添加页面内容
[root@localhost ~]# echo 11111 > /var/www/html/index.html
# 或放行80端口
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# curl 192.168.2.20
11111
web2同理
lvs:
# 清空规则
[root@localhost ~]# iptables -F -t nat
# 打开路由转发
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# 手动生效
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
# 添加ip_vs到系统内核模块
[root@localhost ~]# modprobe ip_vs
# lvs管理工具
[root@localhost ~]# yum -y install ipvsadm
创建lvs的集群
# 加入集群的入口
# 添加一个新的集群-A
# 使用tcp协议 后面加接收请求的ip 这里写的是和客户端同网段的ip -t
# 调度算法 -s 上面的那十个算法
# 这里使用rr轮询调度
[root@localhost ~]# ipvsadm -A -t 192.168.1.10:80 -s rr
[root@localhost Packages]# ipvsadm -a -t 192.168.1.10:80 -r 192.168.2.20:80 -m -w 1
[root@localhost Packages]# ipvsadm -a -t 192.168.1.10:80 -r 192.168.2.30:80 -m -w 1
# 添加真实的节点 (添加后端的节点) -a
# 真实节点的ip -r
# -m 使用nat模式 -g DR模式 -i TUN模式
# 权重 -w
# 删除
#[root@localhost Packages]# ipvsadm -d -t 192.168.1.10:80 -r 192.168.2.20:80
#删除真实的节点 -d
#[root@localhost Packages]# ipvsadm -D -t 192.168.1.10:80
#删除整个集群 -D
[root@localhost Packages]# ipvsadm -S
-A -t localhost.localdomain:http -s rr
-a -t localhost.localdomain:http -r 192.168.2.20:http -m -w 1
-a -t localhost.localdomain:http -r 192.168.2.30:http -m -w 1
# 查看集群列表
[root@localhost Packages]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags9:03 2020/7/14
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.1:80 rr
-> 192.168.2.20:80 Masq 1 0 0
-> 192.168.2.30:80 Masq 1 0 0
客户端验证
[root@localhost ~]# curl 192.168.1.10
22222
[root@localhost ~]# curl 192.168.1.10
11111
lvs的DR模式
客户端:192.168.2.100
负载 192.168.2.10 vip 192.168.2.200
web1 192.168.2.20 vip 192.168.2.200 httpd 1111
web2 192.168.2.30 vip 192.168.2.200 httpd 22222
# 第一种 临时设置 重启网卡之后就丢失了
[root@localhost ~]# ifconfig ens34:0 192.168.2.200
# 第二种 永久配置
# 负载:vip
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]# vim ifcfg-ens33:0
NAME=ens33:0
# uuid删掉
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.2.200
NETMASK=255.255.255.0 或者是:255.255.255.255
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a
web1:vip
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
# 在本地回环地址上面做
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.2.200
NETMASK=255.255.255.255
# 名字随便改
NAME=one
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a
# 填入内容设为私有
[root@localhost network-scripts]# vim /etc/sysctl.conf
[root@localhost network-scripts]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
# 添加路由,接受2.200的主机内容
[root@localhost network-scripts]# route add -host 192.168.2.200 dev lo:0
负载:
[root@localhost network-scripts]# ipvsadm -D -t 192.168.1.10:80
[root@localhost network-scripts]# ipvsadm -A -t 192.168.2.200:80 -s rr
[root@localhost network-scripts]# ipvsadm -a -t 192.168.2.200:80 -r 192.168.2.20 -g -w 1
[root@localhost network-scripts]# ipvsadm -a -t 192.168.2.200:80 -r 192.168.2.30 -g -w 1
[root@localhost network-scripts]# ipvsadm -S
-A -t localhost.localdomain:http -s rr
-a -t localhost.localdomain:http -r 192.168.2.20:http -g -w 1
-a -t localhost.localdomain:http -r 192.168.2.30:http -g -w 1
[root@localhost network-scripts]# 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.2.200:80 rr
-> 192.168.2.20:80 Route 1 0 0
-> 192.168.2.30:80 Route 1 0 0
客户端验证:
[root@localhost ~]# curl 192.168.2.200
1111
[root@localhost ~]# curl 192.168.2.200
2222
raid
硬件raid 磁盘阵列柜 把磁盘直接放进去就可以了 lvm(做逻辑卷)
软raid
需要自己配置
raid类型
raid0 raid1 raid01 raid10 raid5
raid0:最少需要两块硬盘
相当于把数据分开存储 单纯的提高了读写的效率(工作的速度)
确定:不太安全 当一块硬盘坏掉之后 数据会丢失
raid1:最少需要两块硬盘
相当于把数据进行复制 安全性比较高 容错机制 可以坏掉一块硬盘 不影响数据
缺点:读写性能上不会增加
工作机制:实际上还是一块硬盘在工作,另一块去复制数据,当其中的一块硬盘坏掉后。另一块才工作
raid5:最少需要3块硬盘
提高了读写的效率 保证数据的安全 有容错的机制 当一块硬盘坏掉后,不影响这个数据 但是不能同时坏掉两块
raid01:最少需要4块
提高了读写的效率 保证数据的安全 有容错的机制 能同时坏掉两块硬盘 不影响数据
同组的硬盘可以都坏掉 但是不同组的通数据不能都坏掉
raid10:最少需要4块
提高了读写的效率 保证数据的安全 有容错的机制 能同时坏掉两块硬盘 不影响数据
通透组的硬盘不能都坏掉 不同组的硬盘可以都坏掉
添加4块硬盘 重启主机
使用命令将硬盘分区,并使用t命令将硬盘格式改为fd格式
[root@localhost ~]# rpm -qa | grep mdadm
mdadm-4.0-13.el7.x86_64
[root@localhost ~]# mdadm -Cv /dev/md0 -a yes -n2 -l0 /dev/sdb1 /dev/sdc1 #制作第一个raid0
-C 创建
-v 显示详情
-a yes 后端自动创建设备
-n 使用几块硬盘
-l 等级 0 raid0 1 raid1 5 raid5
/dev/sdb1 /dev/sdc1 使用的硬盘
[root@localhost ~]# mdadm -Cv /dev/md1 -a yes -n2 -l0 /dev/sdd1 /dev/sde1 #第二个raid0
mdadm: chunk size defaults to 512K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
[root@localhost ~]# mdadm -Cv /dev/md2 -a yes -n2 -l0 /dev/md0 /dev/md1 #把两个raid0和起来
mdadm: chunk size defaults to 512K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md2 started.
[root@localhost ~]# cat /proc/mdstat #查看raid的详情
Personalities : [raid0]
md2 : active raid0 md1[1] md0[0]
83744768 blocks super 1.2 512k chunks
md1 : active raid0 sde1[1] sdd1[0]
41906176 blocks super 1.2 512k chunks
md0 : active raid0 sdc1[1] sdb1[0]
41906176 blocks super 1.2 512k chunks
[root@localhost ~]# mdadm -S /dev/md2 #删除阵列
mdadm: stopped /dev/md2
磁盘阵列删除 数据不会丢失 除了磁盘坏掉 数据才会丢失