zoukankan      html  css  js  c++  java
  • 快速了解Haproxy搭建Web群集

    摘要

    我们知道tomcat+nginx负载均衡群集,lvs负载均衡群集 和 haproxy搭建群集,这三种群集相比较来说,lvs性能最好,但是搭建复杂,nginx的upstream模块支持群集,但是对群集的节点的故障检查功能不多,性能也没有haproxy好,所以应该说harpoxy也是非常不错的。所以接下来我们开始使用haproxy搭建群集

    一、常见的Web集群调度器

    1.1、目前常见的Web就集群调度器分为软件和硬件

    1.2、软件通常使用开源的LVS、Haproxy、Nginx

    1.3、硬件一般使用比较多的是F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等

    二、Haproxy应用分析

    2.1、LVS在企业应用中抗负载能力很强,但存在不足

    2.1.1、LVS不支持正则处理,不能实现动静分离

    2.1.2、对于大型网站,LVS的实施配置复杂,维护成本相对较高

    2.2、Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件

    2.2.1、适用于负载大的Web站点

    2.2.2、运行在硬件上可支持数以万计的并发连接的连接请求

    三、Haproxy调度算法原理

    Haproxy支持多种调度算法,最常用的有三种

    3.1、RR(Round Robin)

    3.1.1、RR算法是最简单最常用的一种算法,即轮询调度

    3.1.2、理解举例

    ①有三个节点A、B、C

    ②第一个用户访问会被指派到节点A

    ③第二个用户访问会被指派到节点B

    ④第三个用户访问会被指派到节点C

    ⑤第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果

    3.2、LC(Least Connections)

    3.2.1、最小连接数算法,根据后端的节点数连接数大小动态分配前端请求

    3.2.2、理解举例

    ①有三个节点A、B、C,各节点的连接数分别为A:4、B:5、C:6

    ②第一个用户连接请求,会被指派到A上,连接数变为A:5、B:5、C:6

    ③第二个用户请求会继续分配到A上,连接数变为A:6、B:5、C:6;再有新的请求会分配给B,每次将新的请求指派给连接数最小的客户端

    ④由于实际情况下A、B、C的连接数会动态释放,很难会出现一样连接数的情况

    ⑤此算法相比较rr算法有很大改进,是目前用到比较多的一种算法

    3.3、SH(Source Hashing)

    3.3.1、基于来源访问调度算法,用于一些有Session会话记录再服务器端的场景,可以基于来源的IP、Cookie等做集群调度

    3.3.2、理解举例

    ①有三个节点A、B、C,第一个用户第一次访问被指派到了A,第二个用户第一次访问被只指派到了B

    ②当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡调度器不重启,第一个用户访问会被指派到A,第二个用户访问都会被指派到B,实现集群的调度

    ③此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用

    3.4、Haproxy配置文件详解

    3.4.1、Haproxy配置文件通常分为三个部分

    ①global:为全局配置

    ②defaults:为默认配置

    ③listen:为应用组件配置

    3.4.2、global配置参数

    参数

    说明

    log 127.0.0.1 local0

    配置日志记录,local0为日志设备,默认存放到系统日志

    log 127.0.0.1 local1 notice

    Notice为日志级别,通常有24个级别

    maxconn 4096

    最大连接数

    uid 99

    用户uid

    gid 99

    用户gid

    3.4.3、defaults配置项默认参数,一般会被应用组件继承

    3.4.4、Haproxy参数优化,随着企业网站负载增加,Haproxy参数优化相当重要

    参数参数说明优化建议
    maxconn 最大连接数 根据应用的实际使用情况进行调整,推荐使用10240,同事“defaults”中的最大连接数不能超过“global”段中的定义
    daemon 守护进程模式 Haproxy可以使用费守护进程模式启动,生产环境建议使用守护进程模式启动
    nbproc 负载均衡的并发进程数 建议与当前服务器CPU核数相等或为其2倍
    retries 重试次数 主要用于对群集节点的检查,如果节点多,且并发量大,设置为2次或3次;在服务器节点不多的情况下,可以设置5次或6次
    option http-server-close 主动关闭http请求选项 建议在生产环境中使用此项,避免由于timeout时间设置过长导致http连接堆积
    timeout http-keep-alive 长连接超时时间 设置长连接时间,具体参考应用自身特点设置,可以设置为10s
    timeout http-request http请求超时时间 建议将此时间设置为5~10s,增加http连接释放速度
    timeout client 客户端超时时间 如果访问过大,节点响应慢,可以将此事件设置短一些,建议设置为1min左右就可以了

    3.5、日志管理

    3.5.1、默认是输出到系统的syslog中,生成环境中一般单独定义

    3.5.2、定义的方法步骤

    ①修改Haproxy配置文件中关于日志配置的选项,加入配置

    log /dev/log local0 info

    log /dev/log local0 notice

    ②修改rsyslog配置,将Haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下

    ③保存配置文件并重启rsyslog服务,完成rsyslog配置

    3.5.3、访问Haproxy集群测试网页并查看日志信息

    四、案例:使用Haproxy搭建Web群集

    4.1、案例拓扑图

    4.2、环境

    用一台客户端,三台虚拟服务器模拟搭建一套Web集群

    Haproxy服务器

    20.0.0.10/24

    Nginx服务器1

    20.0.0.20/24

    Nginx服务器2

    20.0.0.30/24

    客户机一台

    用于测试验证

    4.3、配置Nginx1服务器

     1 安装Nginx环境
     2 [root@nginx1 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel
     3 
     4 设置用户不可登录的用户
     5 [root@nginx1 ~]# useradd -M -s /sbin/nologin nginx
     6 
     7 解压缩,编译安装
     8 [root@nginx1 ~]# tar zxf nginx-1.12.2.tar.gz 
     9 [root@nginx1 ~]# cd nginx-1.12.2/
    10 [root@nginx1 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
    11 [root@nginx1 nginx-1.12.2]# make && make install
    12 
    13 优化路径
    14 [root@nginx1 nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
    15 [root@nginx1 nginx-1.12.2]# nginx -t
    16 nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    17 nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    18 
    19 开启Nginx,查看端口号
    20 [root@nginx1 nginx-1.12.2]# nginx
    21 [root@nginx1 nginx-1.12.2]# netstat -anpt | grep nginx
    22 tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      16640/nginx: master 
    23 
    24 设置网页内容并测试
    25 [root@nginx1 nginx-1.12.2]# echo "web1" >/usr/local/nginx/html/index.html 
    26 [root@nginx1 nginx-1.12.2]# curl http://localhost
    27 web1

    4.4、配置Nginx2服务器

     1 安装Nginx环境
     2 [root@nginx2 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel
     3 
     4 设置用户不可登录的用户
     5 [root@nginx2 ~]# useradd -M -s /sbin/nologin nginx
     6 
     7 解压缩,编译安装
     8 [root@nginx2 ~]# tar zxf nginx-1.12.2.tar.gz 
     9 [root@nginx2 ~]# cd nginx-1.12.2/
    10 [root@nginx2 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
    11 [root@nginx2 nginx-1.12.2]# make && make install
    12 
    13 优化路径
    14 [root@nginx2 nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
    15 [root@nginx2 nginx-1.12.2]# nginx -t
    16 nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    17 nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    18 
    19 开启Nginx,查看端口号
    20 [root@nginx2 nginx-1.12.2]# nginx
    21 [root@nginx2 nginx-1.12.2]# netstat -anpt | grep nginx
    22 tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      16640/nginx: master 
    23 
    24 设置网页内容并测试
    25 [root@nginx2 nginx-1.12.2]# echo "web2" >/usr/local/nginx/html/index.html 
    26 [root@nginx2 nginx-1.12.2]# curl http://localhost
    27 web2

    4.5、配置Haproxy服务器

     1 安装Haproxy环境
     2 [root@haproxy ~]# yum -y install gcc gcc-c++ make pcre-devel bzip2-devel
     3 
     4 解压缩,编译安装
     5 [root@haproxy ~]# tar zxf haproxy-1.4.24.tar.gz 
     6 [root@haproxy ~]# cd haproxy-1.4.24/
     7 [root@haproxy haproxy-1.4.24]# uname -r
     8 3.10.0-693.el7.x86_64
     9 [root@haproxy haproxy-1.4.24]# make TARGET=linux26
    10 [root@haproxy haproxy-1.4.24]# make install
    11 
    12 创建目录
    13 [root@haproxy haproxy-1.4.24]# mkdir /etc/haproxy
    14 [root@haproxy haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/
    15 
    16 修改配置文件
    17 [root@haproxy haproxy-1.4.24]# vi /etc/haproxy/haproxy.cfg 
    18 ####将文件里下面两行注释####
    19 #chroot /usr/share/haproxy
    20 #redispatch
    21 ####将所有listen删除,增加下面的内容####
    22 ......省略部分内容
    23 listen  webcluster 0.0.0.0:80
    24         option httpchk GET /index.html
    25         balance roundrobin
    26         server web1 20.0.0.20:80 check inter 2000 fall 3
    27         server web2 20.0.0.30:80 check inter 2000 fall 3
    28 
    29 优化路径并开启服务
    30 [root@haproxy haproxy-1.4.24]# cp examples/haproxy.init /etc/init.d/haproxy
    31 [root@haproxy haproxy-1.4.24]# vi /etc/init.d/haproxy 
    32 [root@haproxy haproxy-1.4.24]# chmod 755 /etc/init.d/haproxy 
    33 [root@haproxy haproxy-1.4.24]# chkconfig --add /etc/init.d/haproxy 
    34 [root@haproxy haproxy-1.4.24]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
    35 [root@haproxy haproxy-1.4.24]# systemctl start haproxy
    36 [root@haproxy haproxy-1.4.24]# systemctl status haproxy.service 

    4.6、测试

     

    4.7、配置日志功能

    4.7.1、再Haproxy服务器上配置

     1 修改配置文件
     2 [root@haproxy haproxy]# vi /etc/haproxy/haproxy.cfg 
     3 #修改global下面两项
     4         log /dev/log    local0 info
     5         log /dev/log    local0 notice
     6 
     7 再rsyslog.d下面创建一个目录
     8 [root@haproxy haproxy-1.4.24]# touch /etc/rsyslog.d/haproxy.conf
     9 [root@haproxy haproxy-1.4.24]# vi /etc/rsyslog.d/haproxy.conf 
    10 if ($programname == 'haproxy' and $syslogseverity-text == 'info')
    11 then -/var/log/haproxy/haproxy-info.log
    12 &~
    13 if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
    14 then -/var/log/haproxy/haproxy-notice.log
    15 &~
    16 
    17 重启服务
    18 [root@haproxy log]# systemctl restart haproxy.service 
    19 [root@haproxy log]# systemctl restart rsyslog.service 
    20 
    21 查看日志目录
    22 [root@haproxy rsyslog.d]# cd /var/log
    23 [root@haproxy log]# ll
    24 drwx------. 2 root         root       56 11月  5 16:26 haproxy

    4.7.2、访问网页

    4.7.3、查看日志内容

    1 [root@haproxy haproxy]# cat haproxy-info.log 
    2 Nov 5 16:25:24 haproxy haproxy[15653]: 20.0.0.1:53977 [05/Nov/2020:16:25:15.723] webcluster webcluster/web1 0/0/0/1/9089 304 356 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"
    3 Nov 5 16:25:47 haproxy haproxy[15653]: 20.0.0.1:53978 [05/Nov/2020:16:25:32.515] webcluster webcluster/web2 0/0/0/0/14663 200 239 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"
    4 [root@haproxy haproxy]# cat haproxy-notice.log 
    5 Nov  5 16:24:22 haproxy haproxy[15652]: Proxy webcluster started.
    6 Nov  5 16:24:22 haproxy haproxy[15652]: Proxy webcluster started.
  • 相关阅读:
    Android 主题theme说明 摘记
    Android开发 去掉标题栏方法 摘记
    安卓项目五子棋代码详解(二)
    关于 ake sure class name exists, is public, and has an empty constructor that is public
    百度地图3.0实现图文并茂的覆盖物
    android onSaveInstanceState()及其配对方法。
    关于集成科大讯飞语音识别的 一个问题总结
    android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结
    C# 解析 json Newtonsoft果然强大,代码写的真好
    c#数据类型 与sql的对应关系 以及 取值范围
  • 原文地址:https://www.cnblogs.com/xuhao0705/p/13933658.html
Copyright © 2011-2022 走看看