HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高性能性、负载均衡,以及基于TCP和HTTP的应用程序代理。相较与 Nginx,HAProxy 更专注与反向代理,因此它可以支持更多的选项,更精细的控制,更多的健康状态检测机制和负载均衡算法。

    HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

   包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter在内众多知名网站,及亚马逊网络服务系统都使用了HAProxy。

 

Haproxy的特性:

1、可靠性与稳定性都非常出色,可与硬件级设备媲美。

2、支持连接拒绝,可以用于防止DDoS***

3、支持长连接、短连接和日志功能,可根据需要灵活配置

4、路由HTTP请求到后端服务器,基于cookie作会话绑定;同时支持通过获取指定的url来检测后端服务器的状态

5、HAProxy还拥有功能强大的ACL支持,可灵活配置路由功能,实现动静分离,在架构设计与实现上带来很大方便

6、可支持四层和七层负载均衡,几乎能为所有服务常见的提供负载均衡功能

7、拥有功能强大的后端服务器的状态监控web页面,可以实时了解设备的运行状态,还可实现设备上下线等简单操作。

8、支持多种负载均衡调度算法,并且也支持session保持。

有关keepalived请参看博客:http://13150617.blog.51cto.com/13140617/1979652 


实验:实现基于Haproxy+Keepalived负载均衡高可用架构

14d0d6fdafaa47e8990c96be35944f56.jpg

1、准备四台机器:两台用于haproxy主从架构,两台作为后端server

           haproxy-master:两块网卡,桥接模式和仅主机模式都有

                     VIP:172.17.111.10

           haproxy-backup:两块网卡,桥接模式和仅主机模式都有

                     VIP:172.17.111.10

           后端server1:仅主机网卡:RIP:192.168.199.146

           后端server2:仅主机网卡:RIP:192.168.199.143

2、在haproxy-master上操作

①安装keepalived,配置keepalived。

具体参数含义请参看博客:http://13150617.blog.51cto.com/13140617/1979652

vim /etc/keepalived/keepalived.conf    

! Configuration File for keepalived

 global_defs {   

   notification_email { 

     root@localhost  

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 127.0.0.1   

   smtp_connect_timeout 2 

   router_id LVS_DEVEL2    

}

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 33

#    nopreempt

    priority 100

    advert_int 1

 authentication {

        auth_type PASS

        auth_pass 111111

    }

    virtual_ipaddress {

        172.17.111.10

    }

}

systemctl start keepalived  启动服务

 

②配置日志服务

vim /etc/rsyslog.conf

      $ModLoad imudp     开启UDP的日志服务,也可以开启TCP

     $UDPServerRun 514  

      local2.* /var/log/haproxy.log  定义日志标准

systemctl restart rsyslog  重启日志服务

③配置haproxy

vim /etc/haproxy/haproxy.cfg

  global                      全局配置    

    log        127.0.0.1 local2   日志类型

    chroot      /var/lib/haproxy  修改haproxy的工作目录

    pidfile     /var/run/haproxy.pid 进程id

    maxconn      4000        最大连接数

    user        haproxy        运行用户

    group       haproxy        所属组

    daemon                   让haproxy以守护进程的方式工作

    stats socket /var/lib/haproxy/stats可开启一个unix socket管理接口

  

defaults

    mode              http  实现http的7层规则

    log               global 日志定义,沿用global的日志定义

    option             httplog 启用日志记录HTTP请求

    option             dontlognull 日志中将不会记录空连接

    option http-server-close      强制短连接

    option forwardfor     except 127.0.0.0/8 添加xforward日志标记

    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           最大连接

 

listen stats   定义一个统计报告服务

        mode http #基于http协议

        bind 0.0.0.0:1080 #监听1080端口

        stats enable #开启统计报告服务

        stats hide-version #隐藏统计报告版本信息

        stats uri /haproxyadmin #统计报告访问url

        stats realm Haproxy\ Statistics #页面登陆信息

        stats auth admin:admin #验证账号信息

        stats admin if TRUE #验证模式

 

frontend  http-in   定义一系列监听的套接字

    bind *:80

    default_backend      app

 

backend app    定义一系列“后端”服务器

    balance  roundrobin

    option  httpchk /index.php   检查页面

    server  app1 192.168.199.146:80 check inter 3000 rise 3 fall 3

    server  app2 192.168.199.143:80 check inter 3000 rise 3 fall 3

 

systemctl start haproxy   启动haproxy服务

 

④开启转发

   echo 1 > /proc/sys/net/ipv4/ip_forward

 

3、在haproxy-backup上操作

 ①安装keepalived,配置keepalived

   vim /etc/keepalived/keepalived.conf

   配置基本同上,只需要修改state的状态为BACKUP

  systemctl start keepalived 启动服务

 ②配置日志服务

   完全同上

 ③配置haproxy

   完全同上

 ④开启转发

   echo 1 > /proc/sys/net/ipv4/ip_forward

 

4、测试keepalived高可用:当主服务器正常工作时,VIP在主服务器上,当关闭主服务器的keepalived服务,VIP会漂移到从服务器上,而且网站照常可以访问

324273a72741b16e719fde74ad59f39f.jpg3e7babaab0d53e70a5e3966d8a4540f4.jpg

关闭主服务器后IP漂移:

e55caa003bc7b2296ed11160077b65d9.jpg 

测试haproxy

访问:http://172.17.111.10:1080/haproxyadmin 查看统计报告,都正常

759c445373620c33b3761ed7786358aa.jpg 


实验二、通过ACL指定可访问的用户

在frontend中加入

    acl myhost src 172.16.100.1  指定可访问的ip

    acl myport dst_port 80     指定目标端口

    block if ! myhost myport   拒绝其他主机访问

重启haproxy服务:systemctl restart haproxy

测试:在添加此acl之前,其他主机可以访问

     添加此acl之后就不能访问了

d8c6fc3b3fb037995e5dd13b4fc05f65.jpg

实验三、根据用户访问内容实现动静分离

在frontend中加入

     acl url_static  path_beg  -i /data /p_w_picpaths /javascript /stylesheets /themes 匹配开头

    acl url_static  path_end  -i .jpg .gif .png .css .js .jpeg 匹配后缀

    use_backend static   if url_static  如果符合条件就匹配到static中所定义的服务器 


backend static  定义“后端”服务器

     balance     roundrobin   轮询

     server  static1 192.168.199.146:80 check    

     server  static2 192.168.199.143:80 check

重启haproxy服务:systemctl restart haproxy

效果:所有的图片等静态页面就会被分配到这两个server里


实验四、实现真实日志记录

defaults里添加

     option forwardfor except 127.0.0.0/8

那么查看nginx的日志就会看到访问该服务器的真实的客户端IPc8c5f286c5707aa919f0e5ca32472c9f.jpg 

 

实验五、实现会话保持

在backend中的server中插入cookie,比如

 server  app1 192.168.199.146:80 cookie haha check inter 3000 rise 3 fall 3

 server  app2 192.168.199.143:80 cookie hehe check inter 3000 rise 3 fall 3 

    那么访问过app1服务器的主机就会被标记为haha(在cookie中插入此标记),下次访问时直接被调度到同一台机器,但是在到达服务器之前cookie会被清理。如果该服务器宕机了,那么会被重新标记到别的服务器。


感谢浏览,如有疑问,欢迎留言。

j_0080.gif