一:部署DR模式单机
主机分布:
192.128.232.12 LVS01
192.128.232.13 RS01
192.128.232.15 RS02
192.128.232.16 VIP
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模式是性能最好的一种模式。
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(基于局部性的带复制功能的最少连接)
6.部署DR模式,LVS节点
[root@lvs01 ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
[root@lvs01 ~]# sysctl -p
7. 配置lvs负载均衡器vip网络子接口(lvs01),要跟lvs主机的ip同一个网段,
也可以写个网卡配置文件,这样就不会因为机器重启,而vip不见了
[root@lvs01 ~]# ifconfig eth0:0 192.128.232.16/24
# 配置lvs的转发策略
# 安装ipvsadm
[root@lvs01 ~]# yum -y install ipvsadm
# 配置LVS入口规则(采用轮询机制 rr ),IP为新创建的 eth0:0 对应ip
[root@lvs01 ~]# ipvsadm -A -t 192.128.232.16:80 -s rr
#配置出口规则(192.128.232.13,192.128.232.15 分别是RS01、RS02的ip,-w 表示权重为1, -g 表示DR模式)
[root@lvs01 ~]# ipvsadm -a -t 192.128.232.16:80 -r 192.128.232.13:80 -g -w 1
[root@lvs01 ~]# ipvsadm -a -t 192.128.232.16:80 -r 192.128.232.15:80 -g -w 1
#保存ipvs的策略配置
[root@lvs01 ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
#验证策略
[root@lvs01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.128.232.16:80 rr
-> 192.128.232.13:80 Route 1 0 0
-> 192.128.232.15:80 Route 1 0 0
8.在RS两台主机上
# 修改arp协议(arp_ignore、arp_announce)
[root@RS01 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@RS01 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@RS01 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS01 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# 设置隐藏vip(RS01\RS02)
[root@RS01 ~]# ifconfig lo:0 192.128.232.16 netmask 255.255.255.255
9.两台RS01、RS02安装httpd
# RS01
[root@RS01 ~]# yum -y install httpd
[root@RS01 ~]# echo "web1:192.128.232.13" > /var/www/html/index.html
# RS02
[root@RS02 ~]# yum -y install httpd
[root@RS02 ~]# echo "web2:192.128.232.15" > /var/www/html/index.html
# 两台RS01、RS02启动httpd服务
[root@RS01 ~]# systemctl restart httpd
[root@RS01 ~]# systemctl enable httpd
10.在192.128.232.11主机上测试
[root@master01 nginx-1.20.2]# elinks --dump http://192.128.232.16
web2:192.128.232.15
[root@master01 nginx-1.20.2]# elinks --dump http://192.128.232.16
web1:192.128.232.13
[root@master01 nginx-1.20.2]# elinks --dump http://192.128.232.16
web2:192.128.232.15
[root@master01 nginx-1.20.2]# elinks --dump http://192.128.232.16
web1:192.128.232.13
[root@master01 nginx-1.20.2]# elinks --dump http://192.128.232.16
web2:192.128.232.15
11.查看LVS,
[root@master02 ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:56 FIN_WAIT 192.128.232.11:56218 192.128.232.16:80 192.128.232.13:80
TCP 01:53 FIN_WAIT 192.128.232.11:56210 192.128.232.16:80 192.128.232.13:80
TCP 01:55 FIN_WAIT 192.128.232.11:56214 192.128.232.16:80 192.128.232.13:80
TCP 01:57 FIN_WAIT 192.128.232.11:56220 192.128.232.16:80 192.128.232.15:80
TCP 01:03 FIN_WAIT 192.128.232.11:56208 192.128.232.16:80 192.128.232.15:80
TCP 01:02 FIN_WAIT 192.128.232.11:56206 192.128.232.16:80 192.128.232.13:80
注解:
source: 客户端ip
virtual: vip
destination:RS服务器ip
二:keepalived的部署高可用
主机分布:
192.128.232.11 LVS01,nginx
192.128.232.12 LVS02,nginx
192.128.232.13 RS01,httpd
192.128.232.15 RS02,httpd
192.128.232.16 VIP
1.操作步骤
1. 二台LVS主机都安装keepalived,nginx
[root@localhost ~]# yum -y install keepalived ipvsadm nginx
[root@localhost ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
[root@localhost ~]# sysctl -p
2. 监控业务脚本进行判断,迁移vip,
###本测试以nginx服务的80端口作为测试触发判断
[root@localhost ~]# cat /etc/keepalived/check_port.sh
#!/bin/bash
#使用方法:
#在keepalived的配置文件中
#vrrp_script check_port {#创建一个vrrp_script脚本,检查配置
# script "/etc/keepalived/check_port.sh 80" #配置监听的端口
# interval 2 #检查脚本的频率,单位(秒)
#}
CHK_PORT=$1
if [ -n "$CHK_PORT" ];then
PORT_PROCESS=`ss -lnt|awk -F':' '{print $2}'|awk '{print $1}'|grep "^$CHK_PORT$"|wc -l`
echo $PORT_PROCESS
if [ $PORT_PROCESS -eq 0 ];then
echo "Port $CHK_PORT Is Not Used,End."
systemctl stop keepalived
fi
else
echo "Check Port Cant Be Empty!"
fi
[root@localhost ~]# chmod +x /etc/keepalived/check_port.sh
3.keepalived配置文件
a. 主机192.128.232.11的配置
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 192.128.232.11 #主从节点要不一样,路由id。表示自己是这个组唯一标识。
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_port.sh 80"
interval 2
weight -20
}
vrrp_instance VI_1 { #组播的组名,主从一定要一样,表示同一个组。
state MASTER # 设置当前节点为master。
interface eth0 #对应主机的网卡名称
virtual_router_id 251 #id号要一致
priority 100
advert_int 1
nopreempt #当优先级高的主机宕机后,再次恢复时,不会抢夺vip,防止业务频繁切换。
unicast_peer { #写上其他安装keepalived主机的ip
192.128.232.12
}
authentication {
auth_type PASS
auth_pass 11111111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.128.232.16 #vip
}
}
b. 主机192.128.232.12的配置
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 192.128.232.12
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_port.sh 80"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP #设置当前节点为backup。
interface eth0
virtual_router_id 251
priority 95
advert_int 1
nopreempt
unicast_peer {
192.128.232.11
}
authentication {
auth_type PASS
auth_pass 11111111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.128.232.16
}
}
4.两台lvs机器启动顺序,先启nginx,后启keepalived服务
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx
[root@localhost ~]# systemctl start keepalived
[root@localhost ~]# systemctl enable keepalived
5.两台lvs主机配置nginx转发
server支持的parameters如下:
weight=number
设置权重,默认为1。
max_conns=number
给当前server设置最大活动链接数,默认为0表示没有限制。
max_fails=number
对后端服务器连续监测失败多少次就标记为不可用。
fail_timeout=time
在经历了max_fails次后端服务器检测失败后,暂停服务的时间,默认为10秒。
max_fails可以和fail_timeout一起使用。
backup
设置为备份服务器,当所有服务器不可用时将重新启用次服务器。
down
表示当前的server暂时不参与负载均衡。
resolve
当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx。
hash KEY consistent;
基于指定key做hash计算,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一致性hash基于取模运算。所谓取模运算,就是计算两个数相除之后的余数,比如10%7=3, 7%4=3
hash $request_uri consistent;
基于用户请求的uri做hash
ip_hash;
源地址hash调度方法,基于的客户端的remote_addr(源地址)做hash计算,以实现会话保持。
当IP进行重复访问时会被指定到上次访问的服务器,可以解决动态网站session共享问题
least_conn;
最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器。
keepalive:
限制空闲长连接的最大数量。
keepalive_timeout:
空闲长连接的最长保持时间。
keepalive_requests:
每个长连接最多可以处理的请求数。
### 配置nginx的upstream
upstream负载均衡算法
a.轮询算法(默认算法):
每个请求依次会分配给后端不同的应用程序服务器,不理会后端服务器的时机压力。
b.加权负载均衡:
权重越大的服务器,被分配到的次数就会越多,通常用于后端服务器性能不一致的情况.
c.IP_HASH:
当IP进行重复访问时会被指定到上次访问的服务器,可以解决动态网站session共享问题.
d.基于URL的HASH :
当客户端多次访问同一个地址时分配到固定的节点.
e.最少连接数轮询:
哪个节点当前的连接数少就分配给哪个节点处理.
5.配置LVS转发两台RS主机。
[root@master01 conf.d]# vi /etc/nginx/conf.d/httpd_html.conf
upstream httpd_pools {
ip_hash; #指定算法,默认是轮询
server 192.128.232.13:80 weight=1 max_fails=1 fail_timeout=10s;
server 192.128.232.15:80 weight=5 max_fails=2 fail_timeout=20s backup;
#server 192.128.232.13:80 wetight=10 max_fails=2 fail_timeout=20s down;
}
#匹配下面这个lotion区域,
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
proxy_pass http://httpd_pools;
}
[root@localhost ~]# systemctl restart nginx
#注解:
#只要用户在浏览器中访问的域名绑定了 VIP VIP 下面有RS;则就用$host ;host是访问URL中的域名和端口 www.taobao.com:80
proxy_set_header Host $host;
#把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中 $X-Real-IP来获取 源IP
proxy_set_header X-Real-IP $remote_addr;
#在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
6.配置http服务
# 修改arp协议(arp_ignore、arp_announce)
[root@RS01 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@RS01 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@RS01 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS01 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#两台RS01、RS02安装httpd
# RS01
[root@RS01 ~]# yum -y install httpd
[root@RS01 ~]# echo "web1:192.128.232.13" > /var/www/html/index.html
# RS02
[root@RS02 ~]# yum -y install httpd
[root@RS02 ~]# echo "web2:192.128.232.15" > /var/www/html/index.html
# 两台RS01、RS02启动httpd服务
[root@RS01 ~]# systemctl restart httpd
[root@RS01 ~]# systemctl enable httpd
7.找其他主机测试
[root@client ~]# elinks --dump http://192.128.232.16
web2:192.128.232.15
[root@client ~]# elinks --dump http://192.128.232.16
web1:192.128.232.13