284354749 发表于 2018-12-31 11:18:47

haproxy+keepalived实现负载均衡及高可用

      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.运维网.com/13140617/1979652
  

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

  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.运维网.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 #验证模式
  
  frontendhttp-in   定义一系列监听的套接字
      bind *:80
      default_backend      app
  
  backend app    定义一系列“后端”服务器
      balanceroundrobin
      optionhttpchk /index.php   检查页面
      serverapp1 192.168.199.146:80 check inter 3000 rise 3 fall 3
      serverapp2 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会漂移到从服务器上,而且网站照常可以访问

  关闭主服务器后IP漂移:


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

  

  实验二、通过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之后就不能访问了

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

  在frontend中加入
     acl url_staticpath_beg-i /data /images /javascript /stylesheets /themes 匹配开头
      acl url_staticpath_end-i .jpg .gif .png .css .js .jpeg 匹配后缀
      use_backend static   if url_static如果符合条件就匹配到static中所定义的服务器
  

  backend static定义“后端”服务器
     balance   roundrobin   轮询
     serverstatic1 192.168.199.146:80 check   
     serverstatic2 192.168.199.143:80 check
  重启haproxy服务:systemctl restart haproxy
  效果:所有的图片等静态页面就会被分配到这两个server里
  

  实验四、实现真实日志记录
  defaults里添加
     option forwardfor except 127.0.0.0/8
  那么查看nginx的日志就会看到访问该服务器的真实的客户端IP
  
  实验五、实现会话保持
  在backend中的server中插入cookie,比如
   serverapp1 192.168.199.146:80 cookie haha check inter 3000 rise 3 fall 3
   serverapp2 192.168.199.143:80 cookie hehe check inter 3000 rise 3 fall 3
      那么访问过app1服务器的主机就会被标记为haha(在cookie中插入此标记),下次访问时直接被调度到同一台机器,但是在到达服务器之前cookie会被清理。如果该服务器宕机了,那么会被重新标记到别的服务器。
  

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




页: [1]
查看完整版本: haproxy+keepalived实现负载均衡及高可用