文章目录
负载均衡集群
小知识:
#高可用软件
- keepalived
- vrrp
- 心跳信息
组播:224.0.0.18
- 管理 vip 进行资源的切换
本身可以配置负载均衡器
依赖是 LVS
lvs 集成于内核的模块
管理(配置)lvs 的软件之前是 ipvsadm
现在可以是 keepalived
keepalived + lvs
keepalived + nginx
keepalived + mysql
总体目标是实现高可用,避免出现单点故障
一、负载均衡 LVS的调度算法
LVS的调度算法分为静态与动态两类。
1、静态算法(4种)
只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况
①.RR:轮叫调度(Round Robin)
调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
②.WRR:加权轮叫(Weight RR)
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
③.DH:目标地址散列调度(Destination Hash )
根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

④.SH:源地址 hash(Source Hash)
源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
2、动态算法(6种)
前端的调度器会根据后端真实服务器的实际连接情况来分配请求
①.LC:最少链接(Least Connections)
调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
②.WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
③.SED:最短期望延迟调度(Shortest Expected Delay )
在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。
④.NQ:永不排队/最少队列调度(Never Queue Scheduling NQ)
无需队列。如果有台 realserver的连接数=0就直接分配过去,保证不会有一个主机很空闲。
⑤.LBLC:基于局部性的最少链接(locality-Based Least Connections)
基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
⑥. LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)
带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
二、企业keepalived高可用项目
架构:
LVS_Director + KeepAlived (4台)
lvs master 192.168.116.155
test nginx1 192.168.116.159
test nginx2 192.168.116.166
lvs backup 192.168.116.131
KeepAlived在该项目中的功能:
- 管理IPVS的路由表(包括对RealServer做健康检查)
- 实现调度器的HA
1.主调度器安装软件
[root@lvs-keepalived-master ~]# yum -y install ipvsadm keepalived
[root@lvs-keepalived-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lvs-keepalived-master #辅助改为lvs-backup
}
vrrp_instance VI_1 {
state MASTER
interface ens33 #VIP绑定接口
virtual_router_id 80 #VRID 同一组集群,主备一致
priority 100 #本节点优先级,辅助改为50
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.116.100/32
}
}
virtual_server 192.168.116.100 80 {
#LVS配置
delay_loop 6 #健康检查rs时间间隔
lb_algo rr #LVS调度算法
lb_kind DR #LVS集群模式(直接路由模式)
protocol TCP #健康检查使用的协议
real_server 192.168.116.159 80 {
weight 1
inhibit_on_failure #当该节点失败时,把权重设置为0,而不是从IPVS中删除
TCP_CHECK {
#健康检查
connect_port 80 #检查的端口
connect_timeout 3 #连接超时的时间
}
}
real_server 192.168.116.166 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}
2.辅助调度器安装软件
[root@lvs-backup ~]# yum -y install ipvsadm keepalived
[root@lvs-backup ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lvs-keepalived-backup #辅助改为lvs-backup
}
vrrp_instance VI_1 {
state MASTER
interface ens33 #VIP绑定接口
virtual_router_id 80 #VRID 同一组集群,主备一致
priority 50 #本节点优先级,辅助改为50
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.116.100/32
}
}
virtual_server 192.168.116.100 80 {
#LVS配置
delay_loop 6 #健康检查rs时间间隔
lb_algo rr #LVS调度算法
lb_kind DR #LVS集群模式(直接路由模式)
protocol TCP #健康检查使用的协议
real_server 192.168.116.159 80 {
weight 1
inhibit_on_failure #当该节点失败时,把权重设置为0,而不是从IPVS中删除
TCP_CHECK {
#健康检查
connect_port 80 #检查的端口
connect_timeout 3 #连接超时的时间
}
}
real_server 192.168.116.166 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}
3.删除原lvs上的机器
[root@lvs-keepalived-master ~]# ipvsadm -Ln
[root@lvs-keepalived-master ~]# ipvsadm -D -t 192.168.116.100:80
4.启动KeepAlived(主备均启动)
[root@lvs-keepalived-master ~]# systemctl start keepalived
[root@lvs-keepalived-master ~]# systemctl enable keepalived
5.配置所有RS
配置好网站服务器,测试所有RS
[root@test-nginx1 ~]# yum install -y nginx
[root@test-nginx2 ~]# yum install -y nginx
[root@test-nginx1 ~]# ip addr add dev lo 192.168.116.100/32
[root@test-nginx1 ~]# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
[root@test-nginx1 ~]# sysctl -p
[root@test-nginx1 ~]# echo "web1..." >> /usr/share/nginx/html/index.html
[root@test-nginx1 ~]# systemctl start nginx
6.开启关闭master测试效果
[root@lvs-keepalived-master ~]# systemctl stop keepalived
7.问题解决 脑裂:
Keepalived的BACKUP主机在收不到MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均会成为master,这样每个 master 就会强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。
解决方式:
1、添加更多的检测手段,尽量及时检测到脑裂并尽早进行人工干预。
2、爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信
8.扩展
对调度器Nginx健康检查(可选)两台都设置
思路:
让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived
[root@nginx-proxy-master ~]# vim /etc/keepalived/check_nginx_status.sh
#!/bin/bash
/usr/bin/curl -I http://localhost &>/dev/null
if [ $? -ne 0 ];then
systemctl stop keepalived
fi
[root@nginx-proxy-master ~]# chmod a+x /etc/keepalived/check_nginx_status.sh
三、Nginx+keepalived实现七层的负载均衡的高可用(同类服务)
Nginx通过Upstream模块实现负载均衡
配置安装 nginx, 所有的机器,关闭防火墙和selinux
[root@nginx-proxy ~]# cd /etc/yum.repos.d/
[root@nginx-proxy yum.repos.d]# vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
[root@nginx-proxy yum.repos.d]# yum install nginx -y
调度到不同组后端服务器
网站分区进行调度
===================================================================
拓扑结构
[vip: 192.168.116.155]
[LB1 Nginx] [LB2 Nginx]
192.168.116.159 192.168.116.166
一、实施过程
1、选择两台nginx服务器作为代理服务器。
2、给两台代理服务器安装keepalived制作高可用生成VIP
3、配置nginx的负载均衡
以上两台nginx服务器配置文件一致
根据站点分区进行调度
配置upstream文件
[root@nginx-proxy ~]# user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/log/nginx.dir;
events {
worker_connections 1024;
}
http{
upstream myweb {
server 192.168.116.159:80;
server 192.168.116.166:80;
}
server {
listen 80;
location / {
proxy_pass http://myweb;
}
}
}
将nginx的配置文件拷贝到另一台代理服务器中:
[root@nginx-proxy ~]# scp /etc/nginx/nginx.conf 192.168.116.131://etc/nginx/nginx.conf
二、Keepalived实现调度器HA
注:主/备调度器均能够实现正常调度
1. 主/备调度器安装软件
[root@nginx-proxy-master ~]# yum install -y keepalived
[root@nginx-proxy-slave ~]# yum install -y keepalived
[root@nginx-proxy-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id directory1 #辅助改为directory2
}
# 定义脚本, check_nginx 是自定义的名称,需要在下方的配置中使用
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx_status.sh"
interval 5 #每隔 5 秒检查一次
}
vrrp_instance VI_1 {
state MASTER #定义主还是备
interface ens33 #VIP绑定接口
virtual_router_id 80 #整个集群的调度器一致
priority 100 #back改为50
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.116.16/24
}
# 使用检测脚本
track_script {
check_nginx
}
}
[root@nginx-proxy-master ~]# scp /etc/keepalived/keepalived.conf 192.168.116.131:/etc/keepalived/keepalived.conf
#然后可以手动修改一下辅助名字 directory2
3. 启动KeepAlived(主备均启动)
[root@nginx-proxy-master ~]# systemctl start keepalived
[root@nginx-proxy-master ~]# systemctl enable keepalived
[root@nginx-proxy-master ~]# ip addr
: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:53:ba:a8 brd ff:ff:ff:ff:ff:ff
inet 192.168.116.155/24 brd 192.168.116.255 scope global noprefixroute dynamic ens33
valid_lft 1035sec preferred_lft 1035sec
inet 192.168.116.16/24 scope global secondary ens33
valid_lft forever preferred_lft forever
#然后关闭 master端的nginx查看代理是否跳到了 slave端
#再打开 master端的nginx 代理又会跳回 master端
到此:
可以解决因为 master keepalived 服务不可用①,或者 master 主机宕机②导致的负载均衡服务不可用的情况,但是 keepalived 不能解决因为负载均衡服务(Nginx/LVS)本身不可用导致的服务中断的问题
①因为目前对外服务的 VIP 是 keepalived 维护的,假如 master keepalived 服务本身不可用,BACKUP 就会把 VIP 配置到自己的机器上。
② master 这个机器整个挂掉,相应的 BACKUP 也会把 VIP 配置到自己的机器上。
四、配置 keepalived + lvs
1 负载均衡器配置
修改负载均衡器的 keepalived.conf 配置文件
- router_id
- 角色 MASTER/BACKUP
- 优先级
- 发送心跳信息的 接口(网络设备名称)
- vip
lvs --> real server
算法:rr
工作模式: DR
real server 地址
如何对 real server 进行健康检查
检查的方法:
- TCP_CHECK 基于四层
- HTTP_GET http 80
- SSL_GET https 443
2 所有的 Real Server 需要配置回环接口 lo VIP 地址
echo 1 # 不响应非自己的 arp 广播
echo 2 # 使用最优 IP 进行响应
#具体在 上面的 二、企业keepalived高可用项目
五、配置 keepalived + nginx
1.修改负载均衡器的 keepalived.conf 配置文件
- router_id
- 角色 MASTER/BACKUP
- 优先级
- 发送心态信息的 接口(网络设备名称)
- vip
lvs --> real server
算法:rr
工作模式: DR
real server 地址
如何对 real server 进行健康检查
检查的方法:
- TCP_CHECK 基于四层
- HTTP_GET http 80
- SSL_GET https 443
2.在 负载均衡器上配置 Nginx
upstream web {
...
}
server {
location / {
proxy_pass http://web;
}
}
1.Real Server 的配置
实现普通的 web 服务即可
-------------- 高可用负载均衡器架构总结 ----------------
-
四层负载均衡的高可用方案:
- keepalived + lvs + 任意的服务(web/mysql/dns/ftp/dhcp/email、)
- keepalived + nginx + 任意的服务(web/mysql/dns/ftp/dhcp/email)
- keepalived + haproxy + 任意的服务(web/mysql/dns/ftp/dhcp/email)
-
七层负载均衡的高可用方案
- keepalived + nginx + web 服务器(nginx/httpd/tomcat)
- keepalived + haproxy + web 服务器(nginx/httpd/tomcat)
- keepalived + httpd + web 服务器(nginx/httpd/tomcat)
2.负载均衡七层四层的区别?
通过url进行细分的 七层
不细分的用 四层
六、Haproxy 基础
软件:haproxy—主要是做负载均衡的7层,也可以做4层负载均衡
apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。
7层负载均衡:用的7层http协议,
4层负载均衡:用的是tcp协议加端口号做的负载均衡
1 ha-proxy概述
ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。
2 Keepalived + Haproxy
拓扑结构
[vip: 192.168.116.100]
[LB1 Haproxy] [LB2 Haproxy]
192.168.116.155 192.168.116.131
[httpd] [httpd]
192.168.116.159 192.168.116.166
一、Haproxy实施步骤
1.准备工作(集群中所有主机)
[root@ha-proxy-master ~]# cat /etc/hosts
127.0.0.1 localhost
192.168.116.155 ha-proxu-master
192.168.116.131 ha-proxu-slave
192.168.116.159 test-nginx1
192.168.116.166 test-nginx2
2.RS配置
配置好网站服务器,测试所有RS,所有机器安装nginx
[root@test-nginx1 ~]# yum install -y nginx
[root@test-nginx1 ~]# systemctl start nginx
[root@test-nginx1 ~]# echo "test-nginx1" >> /usr/share/nginx/html/index.html
# 所有nginx服务器按顺序输入编号,方便区分。
3.调度器配置Haproxy(主/备)都执行
[root@ha-proxy-master ~]# yum -y install haproxy
[root@ha-proxy-master ~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak}
[root@ha-proxy-master ~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg
[root@ha-proxy-master ~]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 info
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon #以后台形式运行ha-proxy
nbproc 1 #工作进程数量 cpu内核是几就写几
defaults
mode http #工作模式 http ,tcp 是 4 层,http是 7 层
log global
retries 3 #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
option redispatch #服务不可用后重定向到其他健康服务器。
maxconn 4000
contimeout 5000 #ha服务器与后端服务器连接超时时间,单位毫秒ms
clitimeout 50000 #客户端超时
srvtimeout 50000 #后端服务器超时
listen stats/
bind *:80
stats enable
stats uri /haproxy #使用浏览器访问 http://192.168.116.155/haproxy,可以看到服务器状态
stats auth Neko:123 #用户认证,账号和密码 客户端使用elinks浏览器的时候不生效
frontend web
mode http
bind *:80 #监听哪个ip和什么端口
option httplog #日志类别 http 日志格式
acl html url_reg -i \.html$ #1.访问控制列表名称html。规则要求访问以html结尾的url
use_backend httpservers if html #2.如果满足acl html规则,则推送给后端服务器httpservers
default_backend httpservers #默认使用的服务器组
backend httpservers #名字要与上面的名字必须一样
balance roundrobin #负载均衡的方式
server http1 192.168.116.159:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
server http2 192.168.116.166:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
将配置文件拷贝到slave服务器
[root@ha-proxy-master ~]# scp /etc/haproxy/haproxy.cfg 192.168.116.1131:/etc/haproxy/
两台机器启动设置开机启动
[root@ha-proxy-master ~]# systemctl start haproxy
[root@ha-proxy-master ~]# systemctl enable haproxy
#check inter 2000 检测心跳频率
#rise 2 2 次正确认为服务器可用
#fall 2 2 次失败认为服务器不可用
3 Keepalived实现调度器HA
注:主/备调度器均能够实现正常调度
1.主/备调度器安装软件
[root@ha-proxy-master ~]# yum install -y keepalived
[root@ha-proxy-slave ~]# yum install -y keepalived
[root@ha-proxy-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@ha-proxu-master ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id directory1 #辅助改为lvs-backup
}
vrrp_instance VI_1 {
state MASTER
interface ens33 #VIP绑定接口
virtual_router_id 80 #VRID 同一组集群,主备一致
priority 100 #本节点优先级,辅助改为50
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.116.17/24
}
}
[root@ha-proxy-slave ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@ha-proxy-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id directory1 #辅助改为lvs-backup
}
vrrp_instance VI_1 {
state MASTER
interface ens33 #VIP绑定接口
virtual_router_id 80 #VRID 同一组集群,主备一致
priority 100 #本节点优先级,辅助改为50
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.116.17/24
}
}
2.启动KeepAlived(主备均启动)
[root@ha-proxy-master ~]# chkconfig keepalived on
[root@ha-proxy-master ~]# service keepalived start
[root@ha-proxy-master ~]# ip a
查看是否可以调度机器
七、IP 访问量
获取到访问我们网站最多的前 5 名 IP及其访问次数
awk '{print $1}' nginx_access_app.log |sort |uniq -c|sort -n -r|head -5
获取到所有 4xx 的 url
awk '$9 ~ /^4/ {print $7 }' nginx_access_app.log |sort -u
404
awk '$9 == 404 {print $9,$7 }' nginx_access_app.log |sort -u
找出热度最高的前 5 个 资源(url)
awk '{print $7 }' nginx_access_app.log |sort |uniq -c|sort -nr |head -5
统计出当前的 pv 量
wc -l nginx_access_app.log
统计出指定时间段内的访问(pv)量