小阿轩yx-Haproxy搭建Web群集
Haproxy 简介
-  
提供高可用性
 -  
能做出标准的负载均衡
 -  
支持虚拟主机
 -  
具备健康检查能力
 -  
能用于各式各样的代理
 -  
轻量级代理环境
 
解决方案优势
-  
免费
 -  
快速
 -  
可靠
 
特性
-  
特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
 -  
运行在当前的硬件上,完全可以支持数以万计的并发连接。
 -  
并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
 -  
实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。
 -  
多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。
 -  
事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。
 
弊端
-  
在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
 
案例分析
案例概述
Haproxy
- 是目前比较流行的一种群集调度工具
 - 同类群集调度工具有很多,如 LVS 和Nginx。
 - 相比较而言,LVS 性能最好,但是搭建相对复杂;
 - Nginx的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能没有 Haproxy 好。
 
官方网站
http://www.haproxy.org/
案例前置知识点
HTTP 请求
- 通过 URL,访问网站使用的协议是 HTTP 协议,此类请求一般称为 HTTP 请求。
 - 当使用浏览器访问某一个 URL,会根据请求 URL 返回状态码
 - 通常正常的状态码为 2xx、3xx(如200、301),如果出现异常会返回 4xx、5xx(如 400、500)。
 
请求的两种方式
- GET方式
 - POST方式
 
负载均衡常用调度算法
LVS、Haproxy、Nginx最常用的调度算法有三种
RR(Round Robin)
- 是最简单最常用的一种算法,即轮询调度
 
LC(Least Connections)
- 即最小连接数算法,根据后端的节点连接数大小动态分配前端请求
 
SH(Source Hashing)
- 即基于来源访问调度算法,此算法用于一些有 Session 会话记录在服务器端的场景,可以基于来源的 IP、 Cookie 等做群集调度
 
常见的 Web 群集调度器
分为两种
- 软件
 - 硬件
 
软件
- 通常使用开源的 LVS 、Haproxy、Nginx
 
硬件
- 一般使用比较多的是 F5
 - 也有很多人使用国内的一些产品,如梭子鱼、绿盟等
 
案例环境


案例需求
- 安装 nginx 、haproxy
 - Haproxy、nginx 配置
 
案例实施
关闭防火墙、内核机制
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0 
编译安装 nginx 服务器
[root@localhost ~]# yum -y install pcre-devel zlib-devel gcc* 
添加一个用户
[root@localhost ~]# useradd -M -s /sbin/nologin nginx 
解压 nginx
[root@localhost ~]# tar zxvf nginx-1.12.0.tar.gz 
进入
[root@localhost ~]# cd nginx-1.12.0/ 
配置
[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module 
执行 make
[root@localhost nginx-1.12.0]# make && make install 
安装完后的默认信息
- 默认安装目录:/usr/local/nginx
 - 默认日志:/usr/local/nginx/logs/
 - 默认监听:80
 - 默认 Web 日录: /usr/local/nginx/html
 
建立连接
[root@localhost nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ 
进入目录
[root@localhost nginx-1.12.0]# cd /usr/local/nginx/html/ 
建立测试页面
[root@localhost html]# echo "test web01" > test.html 
显示是否安装成功
[root@localhost ~]# nginx -t 
开启 nginx 进程
[root@localhost ~]# nginx 
查看状态信息
[root@localhost ~]# netstat -anpt | grep nginx 
编译安装 Haproxy
关闭防火墙、内核机制
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0 
使用 haproxy-1.5.19.tar.gz安装包进行编译安装
[root@localhost ~]# yum -y install pcre-devel bzip2-devel gcc* 
解压
[root@localhost ~]# tar zxvf haproxy-1.5.19.tar.gz 
进入 haproxy
[root@localhost ~]# cd haproxy-1.5.19/ 
make 执行
[root@localhost haproxy-1.5.19]# make TARGET=linux26 
- TARGET=linux26 #内核版本,使用uname -r查看内核,如:2.6.18-371.el5,此时该参数就为linux26;kernel 大于2.6.28的用:TARGET=linux2628
 - ARCH=x86_64 #系统位数
 - PREFIX=/usr/local/haprpxy #/usr/local/haprpxy为haprpxy安装路径
 
[root@localhost haproxy-1.5.19]# make install 
Haproxy 服务器配置
建立 haproxy 配置文件
创建配置文件目录
[root@localhost haproxy-1.5.19]# mkdir /etc/haproxy 
复制文件
[root@localhost haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/ 
将 haproxy.cfg 文件复制到配置文件目录
[root@localhost haproxy-1.5.19]# cp examples/haproxy.init /etc/init.d/haproxy 
建立链接
[root@localhost haproxy-1.5.19]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy 
添加执行权限
[root@localhost ~]# chmod +x /etc/init.d/haproxy 
添加为系统服务
[root@localhost ~]# chkconfig --add haproxy 
开机自启
[root@localhost ~]# chkconfig haproxy on 
Haproxy 配置介绍
[root@localhost haproxy-1.5.19]# vim /etc/haproxy/haproxy.cfg 
global
        //配置日志记录,local0为日志设备,默认是系统日志
        log 127.0.0.1   local0
        //日志级别为notice
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        //最大连接数
        maxconn 4096
        //用户uid
        uid 99
        //用户gid
        gid 99
        //以守护进程的方式运行
        daemon
        //调试模式,输出启动信息到标准输出
        #debug
        //安静模式,启动时无输出
        #quiet
defaults
        //使用globle中定义的日志
        log     global
        //模式为http
        mode    http
        //采用http的格式记录日志
        option  httplog
        //保证HAProxy不记录上级负载均衡发送过来的用于检测状态数据的心跳包
        option  dontlognull
        //检查节点连接失败的次数,超过3次认为节点不可用
        retries 3
        //当负载很高时,自动结束当前队列处理比较久的连接
       # redispatch   
        //最大连接数       
        maxconn 2000
        //连接超时时间ms(毫秒)
        contimeout      5000
        //客户端超时时间ms
        clitimeout      50000
        //服务器超时时间ms
        srvtimeout      50000
//定义群集和监听的端口号
listen  webcluster 0.0.0.0:80
        //检查服务器的index.html文件,心跳检测URL设置
        option  httpchk GET /index.html
        //负载均衡的调度算法为轮询
        balance roundrobin
        //定义在线节点
        //可在每个服务器后加weight设置权重值
        server  inst1 192.168.1.61:80 check inter 2000 fall 3 weight 1
        server  inst2 192.168.1.62:80 check inter 2000 fall 3 weight 2 
- check inter 2000是检测心跳频率(每2000ms检测一次),fall 3是3次失败认为服务器不可用
 
新版本中,超时的设置做了调整,具体如下
-  
contimeout 被 timeout connect取代:定义haproxy将客户端请求转发至后端服务器所等待的超时时长
 -  
clitimeout 被timeout client取代:客户端非活动状态的超时时长,是 app 连接 haproxy的时间
 -  
srvtimeout 被timeout server取代:客户端与服务器端建立连接后,等待服务器端的超时时长,是haproxy 连接后端web服务器的时间
 
haproxy共有八种调度算法
- balance leastconn 最少连接数
 - balance roundrobin 轮询
 - balance source 根据客户端IP进行哈希的方式
 - static-rr 根据权重
 - uri 根据请求的URI
 - url_param 根据请求的URl参数
 - hdr(name) 根据HTTP请求头来锁定每一次HTTP请求
 - rdp-cookie(name) 根据cookie(name)来锁定并哈希每一次TCP请求
 
chroot /usr/share/haproxy \\也就是改变程序执行时所参考的根目录位置,如果有此代码,需要创建此目录
启动服务
[root@localhost ~]# systemctl start haproxy 
测试 Web 群集
[root@localhost ~]# curl 192.168.1.60
test web01 
方法一
[root@localhost haproxy-1.4.24]# vim /etc/haproxy/haproxy.cfg
global
        #log 127.0.0.1   local0
        #log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
        chroot /usr/share/haproxy
        uid 99
        gid 99
        daemon
        #debug
        #quiet
        log /dev/log local0 info
        log /dev/log local0 notice 
[root@localhost haproxy-1.4.24]# touch /etc/rsyslog.d/haproxy.conf 
[root@localhost haproxy-1.4.24]# vi /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
    then -/var/log/haproxy/haproxy-info.log & ~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
    then -/var/log/haproxy/haproxy-notice.log & ~ 
重启服务
[root@localhost haproxy-1.4.24]# service rsyslog restart
[root@localhost ~]# /etc/init.d/haproxy restar 
查看消息日志
[root@localhost ~]# cat /var/log/haproxy/haproxy-info.log 
方法二
编辑/etc/haproxy/haproxy.conf
[root@localhost ~]# vi /etc/haproxy/haproxy.cfg
global
 log 127.0.0.1 local3 
#local3是设备,对应于 /etc/rsyslog.conf中的配置,默认回收info的日志级别
编写haproxy日志文件
[root@localhost ~]# vim  /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log 
$ModLoad imudp 采集日志的协议UDP
$UDPServerRun 514 指定日志采集使用的端口号
local3.* /var/log/haproxy.log 指定日志存放位置
配置rsyslog的主配置文件,开启远程日志(可以不配)
[root@localhost ~]# vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS=”-c 2 -r -m 0″ 
- #-c 2 使用兼容模式,默认是 -c 5
 - #-r 开启远程日志
 - #-m 0 标记时间戳。单位是分钟,为0时,表示禁用该功能
 
重启haproxy和rsyslog服务
[root@localhost ~]# systemctl restart rsyslog
[root@localhost ~]# systemctl restart haproxy 
访问网站后查看日志
[root@localhost ~]# cat /var/log/haproxy.log 
小阿轩yx-Haproxy搭建Web群集



















