1、负载均衡集群类型
负载均衡技术类型:基于 4 层负载均衡技术、基于 7 层负载均衡技术
负载均衡实现方式:硬件负载均衡设备、软件负载均衡
硬件负载均衡产品:F5 、深信服 、Radware
软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server)
2、LVS 就是一个四层(传输层)负载均衡器,支持 TCP/UDP 的负载均衡
三层结构:负载调度器、服务器池、共享存储。
架构对象:
- VS:Virtual Server,也称为 Director,负载均衡服务器
- RS:Real Server,真正的服务器,集群中各节点
- VIP:Director 向外部提供服务的 IP
- DIP:Director 向内部与 RS 通信的 IP
- RIP:真实服务器的 IP
- CIP:客户端的 IP
3、LVS四种工作模式
LVS-NAT(NAT模式)
原理:客户端发送请求数据包到负载均衡器(CIP->VIP),负载均衡器改装数据包发送到服务器(CIP->RIP),服务端处理后返回数据包给负载均衡器(RIP->CIP),负载均器再进行数据包改装后返回给客户端(VIP->CIP),完成负载,该种模式无论流量进来还是出去都要经过负载均衡器。
LVS-DR(直接路由模式)
原理:DR模式的实现需要RS绑定LVS的vip,且保证该vip只是单个RS内部可见,对外不可见。一个请求打到负载均衡器(CIP->VIP),LVS 只需要将网络帧的 MAC 地址修改为某一台 RS 的 MAC,然后把该包转发到相应的RS处理,RS收到LVS转发过来的包,链路层发现MAC是自己的,到网络层,发现IP也是自己的(事先关联的LVS的ip),于是包被合法接收,响应时RS则直接向客户端返回,不再经过LVS。
DR模式流量不再经过lvs,且返回可以直接返回给客户端,只需要经过lvs一次,因此DR模式是性能最好的一种模式。
LVS-TUN(IP隧道(Tunnel)模式,不常用)
原理:负载均衡器把客户端发来的数据包(CIP->VIP),封装一个新的IP头标记(DIP-(CIP-VIP)-RIP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议。所以,在RS的内核中,必须编译支持IPTUNNEL这个选项。
FULL-NAT模式(双向转换模式,不常用)
原理:客户端对负载均衡器VIP发起请求(CIP->VIP),负载均衡器接过请求发现是请求后端服务,对请求报文做full-nat,把源ip改为DIP{,把目标ip转换为任意后端RS的RIP,然后发往后端,RS接到请求后进行响应,响应源ip为RIP目标ip还是DIP,又内部路由路由到负载均衡器,负载均衡器接到响应报文,进行full-nat。将源地址为VIP,目标地址改为CIP,返回给客户端。
4、LVS 负载均衡算法
静态负载均衡
-
rr(round robin,轮询 )
-
wrr(weight round robin,加权轮询)
-
sh(source hashing,源地址 HASH)
-
dh(destination hashing,目标地址 HASH)
动态负载均衡
-
lc(leash-connection,最少连接 )
- 简单算法:active * 256 + inactive (谁的小选谁)
-
wlc(加权最少连接)
- 简单算法:(active * 256 + inactive) / weight(谁的小选谁)
-
sed(最少期望延迟)
- 简单算法:(active + 1) * 256 / weight (谁的小选谁)
-
nq(never queue,永不排队)
-
LBLC(基于局部性的最少连接 )
-
LBLCR(基于局部性的带复制功能的最少连接)
5、实现DR模型搭建
(1)、节点准备
node1:192.168.2.168 ----作为负载均衡器
node2:192.169.2.136
node3:192.168.2.134
(2)、开始搭建
配置lvs负载均衡器vip网络子接口(node1)
ifconfig enp0s3:2 192.168.2.100/24
# 撤掉命令
ifconfig enp0s3:2 down
配置RS服务器(node02、node03)
修改arp协议(arp_ignore、arp_announce)
cd /proc/sys/net/ipv4/conf/enp0s3
# 修改协议(注意不可使用vi进行修改)
echo 1 > arp_ignore
echo 2 > arp_announce
# 查看是否修改成功
cat arp_ignore
cat arp_announce
# 退回到all目录进行全局修改
cd ../all
echo 1 > arp_ignore
echo 2 > arp_announce
设置隐藏vip(node2\node3)
ifconfig lo:2 192.168.2.100 netmask 255.255.255.255
搭建http服务(node2\node3)
# 安装httpd服务
yum install httpd -y
# 启动服务
service httpd start
# 创建主页(用于测试服务)
vi /var/www/html/index.html
# index填充内容node2
node2:form 192.168.2.136
# index填充内容node3
node3:form 192.168.2.134
打开浏览器测试httpd服务是否成功
LVS服务配置(node01)
# 安装ipvsadm
yum install ipvsadm
# 配置LVS入口规则(采用轮询机制),IP为新创建的enp0s3:2对应ip
ipvsadm -A -t 192.168.2.100:80 -s rr
#配置出口规则(192.168.2.136\192.168.2.134 分别是node2、3的ip,分配权重为1)
ipvsadm -a -t 192.168.2.100:80 -r 192.168.2.136 -g -w 1
ipvsadm -a -t 192.168.2.100:80 -r 192.168.2.134 -g -w 1
查看配置是否成功
ipvsadm -ln
验证
浏览器访问192.168.2.100,疯狂F5,查看浏览器是否在node2、node3之间切换,在node1~3上分别使用命令 netstat -natp查看socket连接,会发现node1上没有socket记录,node2、node3上存在socket记录,进一步说明负载均衡器,不会和客服端建立连接。
6、DR+keepalived高可用搭建
(1)、准备节点
node1:192.168.2.168 --lvs主机
node2:192.169.2.136
node3:192.168.2.134
node4:192.168.2.181 --lvs备机
注意:如果手动搭建过,lvs单机版本(node1)可先把安装的IP删掉
# 卸载ipvsadm
ipvsadm -C
# 这里安装过enp0s3:2
ifconfig enp0s3:2 down
node2和node3保持单机版导通的配置
安装keeplived(node1\node4)
# 安装keeplived服务
yum install keepalived ipvsadm -y
# 修改配置
cd /etc/keepalived/
# 备份配置文件
cp keepalived.conf keepalived.conf.bak
# 打开并修改配置文件
vi keepalived.conf
# 修改配置(node1为master配置,node4配置区别地方有特殊说明,其余地方和node相同)
# vrrp_strict # 注意一定要注解掉,否则配置的vip接口ping不通
vrrp_instance VI_1 {
state MASTER # node4 BACKUP
interface enp0s3 # 设置自己虚拟机使用的虚拟网络
virtual_router_id 51
priority 100 # node4 50
advert_int 1
authentication {
auth_type PASS
auth_pass root # 主备机服务器密码要设置一致
}
virtual_ipaddress {
192.168.2.100/24 dev enp0s3label enp0s3:2
}
}
# 注意virtual_server 只保留一个
virtual_server 192.168.2.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR # 负载模式设置成DR
nat_mask 255.255.255.0 #设置子网掩码
persistence_timeout 0 # 多少秒内访问同一个服务器
protocol TCP
real_server 192.168.2.136 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.2.134 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
复制keepalived.conf到node4,并修改相应配置,参考上步骤(仅仅修改区分地方即可)
scp ./keepalived.conf root@node04:`pwd`
启动keepalived服务(node1\node4)
# 启动服务
systemctl start keepalived
# 停止服务
systemctl stop keepalived
验证:浏览器访问返回node2或者node3主页结果表示成功