负载均衡集群 [ 2 ] --- 负载均衡 LVS调度算法,keepalived高可用项目,Haproxy 基础


负载均衡集群

小知识:

#高可用软件
 - 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在该项目中的功能:

  1. 管理IPVS的路由表(包括对RealServer做健康检查)
  2. 实现调度器的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

统计出当前的 pvwc -l nginx_access_app.log

统计出指定时间段内的访问(pv)量

猜你喜欢

转载自blog.csdn.net/Houaki/article/details/111823116