5.9运维企业部分---haproxy负载均衡

1、什么是haproxy

Haproxy是一个特别适用于高可用性环境的TCP/HTTP开源的反向代理和负载均衡软件。在七层负载均衡方面的功能很强大(支持cookie track, header rewrite等等),支持双机热备,支持虚拟主机,支持健康检查,同时还提供直观的监控页面,可以清晰的监控服务集群的运行状况。

2、配置HAProxy Session亲缘性的三种方式 

haproxy负载均衡保持客户端和服务器Session亲缘性的三种方式:

   (1)用ip识别

haproxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类似于nginx 的IP hash 指令)

配置指令 balance source

(2)用cookie识别

haproxy 将WEB服务端发送给客户端的cookie中插入(或添加前缀)haproxy定义的后端的服务器COOKIE ID。

配置指令例举 cookie SESSION_COOKIE insert indirect nocache

用firebug可以观察到用户的请求头的cookie里 有类似" Cookie jsessionid=0bc588656ca05ecf7588c65f9be214f5; SESSION_COOKIE=app1" SESSION_COOKIE=app1就是haproxy添加的内容

(3)用session识别

haproxy 将后端服务器产生的session和后端服务器标识存在haproxy中的一张表里。客户端请求时先查询这张表。

配置指令例举 appsession JSESSIONID len 64 timeout 5h request-learn

3、负载均衡产品的比较

现在的web系统一般都需要负载均衡和高可用性的支持,以支持7*24的服务。负载均衡可以使用硬件,也可以使用软件来实现。

1) 硬件负载均衡

硬件负载均衡产品,比如F5,Big-IP。

2) 软件的负载均衡

一般是4层(TCP层)或者7层(应用层)来实现。软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载。

负载均衡的主要技术:

1) 反向代理负载均衡

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

在功能上能以proxy反向代理方式实现 WEB均衡负载的产品有很多。包括Nginx,ApacheProxy,lighttpd,Cheroke 等,它们同时也都是WEB服务器。 但要明确一点的,Haproxy 并不是 web 服务器,Haproxy仅仅一款的用于均衡负载的应用代理。其自身并不能提供http服务。

2) DNS负载均衡

基于DNS的方式,是基于DNS能够让多个IP地址(多个真实服务器)被赋给同一个主机名。

 其他解决方案:

3)Linux Virtual Servers (LVS)

LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。

LVS的优点:

性能好,接近硬件设备的网络吞吐和连接负载能力。

 LVS的DR模式,支持通过广域网进行负载均衡。这个其他任何负载均衡软件目前都不具备。

缺点:

比较重型。另外社区不如nginx活跃。

4)Nginx ("engine X")

Nginx ("engine x")是一款高性能、轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强。

性能好,可以负载超过1万的并发。

功能多,除了负载均衡,还能作Web服务器,而且可以通过Geo模块来实现流量分配。

社区活跃,第三方补丁和模块很多

支持gzip proxy

缺点:

不支持session保持。

对后端realserver的健康检查功能效果不好。而且只支持通过端口来检测,不支持通过url来检测。

 5)haproxy

HAProxy主要有以下优点:

1) 免费开源,稳定性也是非常好,稳定性可以与LVS相媲美;

2) 根据官方文档,HAProxy最高支持10G并发,作为软件级负载均衡,性能强大;

3) HAProxy可以作为MySQL、邮件或其它的非web的负载均衡;

4) 自带强大的监控服务器状态的页面;

5) HAProxy支持虚拟主机。

它的优点正好可以补充nginx的缺点。支持session保持,同时支持通过获取指定的url来检测后端服务器的状态。

支持tcp模式的负载均衡。比如可以给mysql的从服务器集群和邮件服务器做负载均衡。

缺点:

日志通过net方式用syslogd进行记录如果日志太多很影响性能,不支持apache的日志格式。

4、haproxy的配置解说

Haproxy的配通过程分为3个主要部分:

  • 命令行参数,这是最优先的
  • global (全局)段,设置进程级参数;
  • 代理配置段,通常位于default,listen,backend这样的形式内。

配置文件的语法是由关键字后跟可选的一个或者多个参数(参数之间有空格)组成。如果字符串中包含空格,必须用\进行转义。 

Haproxy配置段中分五大部分:

    global:全局参数配置,进程级的,用来控制Haproxy启动前的一些进程及系统设置。
    defaults:配置默认的参数,可以被frontend,backend, listen段集成使用。
    frontend :用来匹配接收客户所请求的域名、uri等,并针对不同的匹配做不同的请求处理。
    backend:定义后端服务器集群,以及对后端服务器集群的一些权重、队列、连接数等选项的设置,类似于nginx中的upstream模块。
    listen:可以理解为frontend和backend的组合体。Haproxy配置文件的配通方法主要有两种,一种是由前端(frontend )和后端( backend )配置块组成,前端和后端都可以有多个。第二种方法是只有一个listen配置块来同时实现前端和后端。最常用也是推荐的方法为第一种,即frontend和backend的模式。

5、haproxy的安装与启用

实验环境:

server1:  172.25.254.1 安装haproxy

server2:  172.25.254.2 后端服务器

server3:  172.25.254.3 后端服务器

在server1上:yum install -y haproxy
在server2、server3上安装httpd服务
yum install -y httpd
systemctl start httpd
systemctl status httpd
echo server2/server3 > /var/www/html/index.html

1)haproxy的负载均衡

vim /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats
    
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
          stats uri /status  (添加到默认设置模块)

frontend  main *:80 修改端口
    default_backend             app  指定访问后端
backend app
    balance     roundrobin  轮询方式
    server  app1 172.25.254.2:80 check 后端server2ip
    server  app2 172.25.254.3:80 check 后端server3ip

先解除80端口的占用(httpd服务或者nginx服务)
systemctl stop httpd / nginx
systemctl restart haproxy.service

 测试:

在客户端 curl 172.25.254.1,轮询访问,实现负载

 用apach访问 172.25.254.1/status,可以看到如下的页面

 关闭server1的httpd服务

(2)查看后端服务器的状态

vim /etc/haproxy/haproxy.cfg

 结果:用apache访问172.25.254.1/status时,需要用户名和密码,进入后页面5秒刷新一次

(3)haproxy的日志配置

vim /etc/rsyslog.conf

systemctl restart rsyslog

结果:haproxy日志文件被独立出来

 (4)haproxy实现动静分离

 在server2的/var/www/html下建立目录images,并在目录中放入图片,或建立一个文件

编写完index.php后一定要重启httpd服务

 

(5)读写分离

vim /etc/haproxy/haproxy.cfg

 

 backend app(172.25.254.2) backend static(172.25.254.3)

在server2和server3中:
yum install php -y
vim /var/www/html/index.php 读的php页面
vim /var/www/html/upload_file.php写的php页面
systemctl restart httpd.service
mkdir /var/www/html/uoload
chmod 777 /var/www/html/upload

cat index.php

<html>
<body>

<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>
cat upload_file.php
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

结果:在网页中上传文件,只有server3的目录中上传了文件

 (6)黑名单

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值