• haproxy


    目录

    1.LVS  Nginx  Haproxy 的区别

    2.haproxy的调度算法

    3.Haproxy 的会话保持

    4.Haproxy搭建 Web 群集

    1.haproxy 服务器部署

    1.获取安装包 

     2.编译安装haproxy

     3.修改haproxy服务器配置

    4.添加haproxy 系统服务 

    2.节点服务器部署

     3.测试 Web群集

    5.定义日志

    6.keepalive和haproxy高可用 

    7.内核优化


    HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。HAProxy非常适用于并发大(并发达1w以上)web站点,这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。

    1.LVS  Nginx  Haproxy 的区别

    1. 负载均衡性能: [硬件负载均衡器F5 >] LVS 最好 >  Haproxy 其次 > Nginx 弱于其它两种
    2. 支持的代理类型:LVS基于Linux系统内核实现的软负载均衡,只支持4层代理的IP转发,不支持正则匹配
    3. Haproxy和Nginx基于应用程序实现的软负载均衡,都能支持4层和7层代理转发,支持正则匹配
    4. 支持的节点健康检查方式:LVS可以配合keepalived实现支持对TCP端口和URL路径方式的健康检查
    5. Nginx默认情况下只支持被动健康检查,主动健康检查模块需要依赖第三方模块
    6. Haproxy支持TCP端口、URL路径、脚本等方式的健康检查                  

    2.haproxy的调度算法

    Haproxy 有 8 种调度算法:

    • roundrobin        轮询
    • static-rr         加权轮询
    • leastconn         最小连接
    • source            根据源地址哈希
    • uri               根据请求的URI地址哈希
    • url_param         根据请求的URL参数哈希
    • hdr(name)         根据请求头哈希
    • rdp-cookie(name)  根据cookie的key哈希

    3.Haproxy 的会话保持

    1. 源地址hash
    2. 设置cookie
    3. 会话粘性表stick-table

    4.Haproxy搭建 Web 群集

    Haproxy服务器:192.168.64.10
    Nginx 服务器1:192.168.64.40
    Nginx 服务器2:192.168.64.50

    1.haproxy 服务器部署
    1.获取安装包 
    1. cd /opt
    2. wget http://www.haproxy.org/download/2.8/src/haproxy-2.8.3.tar.gz
    3. # 将安装Haproxy所需软件包传到/opt目录下
     2.编译安装haproxy
    1. yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
    2. tar zxvf haproxy-2.8.3.tar.gz
    3. cd haproxy-2.8.3/
    4. make TARGET=linux-glibc PREFIX=/usr/local/haproxy
    5. make install PREFIX=/usr/local/haproxy
    6. # 编译安装haproxy
     3.修改haproxy服务器配置
    1. useradd -M -s /sbin/nologin haproxy
    2. mkdir -p /usr/local/haproxy/conf
    3. cd /usr/local/haproxy/conf
    4. vim haproxy.cfg
    5. global
    6. log 127.0.0.1 local3
    7. maxconn 4096
    8. user nobody
    9. group nobody
    10. daemon
    11. defaults
    12. log global
    13. mode http
    14. maxconn 2048
    15. retries 3
    16. option redispatch
    17. stats uri /haproxy
    18. stats auth qianfeng:123
    19. timeout connect 5000
    20. timeout client 50000
    21. timeout server 50000
    22. frontend http-in
    23. bind *:80
    24. acl url_jsp path_end -i .jsp
    25. use_backend tomcat_server if url_jsp
    26. default_backend nginx_server
    27. backend nginx_server
    28. balance roundrobin
    29. option httpchk GET /test.html
    30. server ngx01 192.168.64.40:80 check inter 2000 fall 3 rise 2
    31. server ngx02 192.168.64.50:80 check inter 2000 fall 3 rise 2
    32. backend tomcat_server
    33. balance roundrobin
    34. option http-server-close
    35. cookie HA_STICKY_dy insert indirect nocache
    36. server tomcat01 192.168.64.20:8080 cookie tomcat01 check inter 2000 fall 3 rise 2
    37. server tomcat02 192.168.64.30:8080 cookie tomcat02 check inter 2000 fall 3 rise 2
    38. # 修改haproxy服务器配置
    4.添加haproxy 系统服务 
    1. vim /etc/init.d/haproxy
    2. #!/bin/bash
    3. #chkconfig: 2345 90 30
    4. #description: Haproxy Service Control Script
    5. PROGDIR=/usr/local/haproxy
    6. PROGNAME=haproxy
    7. DAEMON=$PROGDIR/sbin/$PROGNAME
    8. CONFIG=$PROGDIR/conf/$PROGNAME.cfg
    9. PIDFILE=/var/run/$PROGNAME.pid
    10. DESC="HAProxy daemon"
    11. SCRIPTNAME=/etc/init.d/$PROGNAME
    12. # Gracefully exit if the package has been removed.
    13. test -x $DAEMON || exit 0
    14. start()
    15. {
    16. echo -e "Starting $DESC: $PROGNAME\n"
    17. $DAEMON -f $CONFIG
    18. echo "......"
    19. }
    20. stop()
    21. {
    22. echo -e "Stopping $DESC: $PROGNAME\n"
    23. haproxy_pid="$(cat $PIDFILE)"
    24. kill $haproxy_pid
    25. echo "......"
    26. }
    27. restart()
    28. {
    29. echo -e "Restarting $DESC: $PROGNAME\n"
    30. $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
    31. echo "......"
    32. }
    33. case "$1" in
    34. start)
    35. start
    36. ;;
    37. stop)
    38. stop
    39. ;;
    40. restart)
    41. restart
    42. ;;
    43. *)
    44. echo "Usage: $SCRIPTNAME {start|stop|restart}"
    45. exit 1
    46. ;;
    47. esac
    48. exit 0
    1. cd /etc/init.d/
    2. chmod +x haproxy
    3. chkconfig --add /etc/init.d/haproxy
    4. ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
    5. service haproxy start 或 /etc/init.d/haproxy start

    2.节点服务器部署
    1. yum install -y pcre-devel zlib-devel gcc gcc-c++ make
    2. useradd -M -s /sbin/nologin nginx
    3. cd /opt
    4. tar zxvf nginx-1.12.0.tar.gz -C /opt/
    5. cd nginx-1.12.0/
    6. ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
    7. make && make install
    8. # 以上两个服务器同时配置
    9. # 以下分开配置
    10. --192.168.64.40---
    11. echo "this is pc web" > /usr/local/nginx/html/test.html
    12. --192.168.64.50---
    13. echo "this is mo web" > /usr/local/nginx/html/test.html
    14. ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
    15. nginx
    16. #启动nginx 服务
     3.测试 Web群集
    浏览器访问 http://192.168.64.10/test.html  并不断刷新

    5.定义日志

    1. vim /usr/local/haproxy/conf/haproxy.cfg
    2. global
    3. log /dev/log local0 info
    4. log /dev/log local0 notice
    5. # 在global下添加日志存放位置
    6. # 将 haproxy 的 info 及 notice 日志分别记录到不同的日志文件中
    7. defaults
    8. log global

     

    1. vim /etc/rsyslog.d/haproxy.conf
    2. if ($programname == 'haproxy' and $syslogseverity-text == 'info')
    3. then -/var/log/haproxy/haproxy-info.log
    4. &~
    5. if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
    6. then -/var/log/haproxy/haproxy-notice.log
    7. &~
    8. # 需要修改rsyslog配置
    1. service rsyslog restart
    2. service haproxy restart
    3. tail -f /var/log/haproxy/haproxy-info.log
    4. # 查看haproxy的访问请求日志信息

    6.keepalive和haproxy高可用 

    配置主备keepalive服务器

    1. yum install -y keepalived
    2. vim /etc/keepalived/check_haproxy.sh
    3. #!/bin/bash
    4. if ! killall -0 haproxy; then
    5. systemctl stop keepalived
    6. fi
    7. # 使用killall -0检查haproxy实例是否存在,性能高于ps命令
    8. chmod +x /etc/keepalived/check_haproxy.sh
    9. vim /etc/keepalived/keepalived.conf
    10. ! Configuration File for keepalived
    11. global_defs {
    12. router_id LVS_HA1 #虚拟路由名称
    13. }
    14. vrrp_script chk_haproxy {
    15. script "/etc/keepalived/check_haproxy.sh" #指定健康检查脚本
    16. interval 2 #脚本运行周期
    17. weight 2 #每次检查的加权权重值
    18. }
    19. # HAProxy健康检查配置
    20. vrrp_instance VI_1 {
    21. state MASTER #本机实例状态,MASTER/BACKUP,备机配置文件中设置BACKUP
    22. interface ens33 #本机网卡名称,使用ifconfig命令查看
    23. virtual_router_id 51 #虚拟路由编号,主备机保持一致
    24. priority 100 #本机初始权重,备机设置小于主机的值
    25. advert_int 1 #争抢虚地址的周期,秒
    26. virtual_ipaddress {
    27. 192.168.64.100 #虚地址IP,主备机保持一致
    28. }
    29. track_script {
    30. chk_haproxy #对应的健康检查配置
    31. }
    32. }
    33. # 虚拟路由配置
    34. systemctl start keepalived
    35. ip a

    7.内核优化

    1. vim /etc/sysctl.conf
    2. net.ipv4.tcp_tw_reuse = 1
    3. #开启重用。允许将TIME-WAITsockets重用于新的TCP连接,默认0,表示关闭;
    4. net.ipv4.ip_local_port_range = 1024 65535
    5. #用于向外连接的端口范围。缺省情况下很小
    6. net.ipv4.tcp_max_syn_backlog = 10240
    7. #SYN队列长度,记录尚未收到客户端确认信息的连接请求的最大值。默认为1024,加大队列长度可容纳更多等待连接的网络连接数。
    8. net.ipv4.tcp_max_tw_buckets = 5000
    9. #表示系统同时保持TIME_WAIT最大数量,如果超过,TIME_WAIT将立刻被清除并打印警告信息。默认180000,此项参数可控制TIME_WAIT 最大数量
    10. net.ipv4.tcp_max_orphans = 3276800
    11. #系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上,如超过,连接将即刻被复位并打印警告信息,这个限制仅是为防止简单的DoS攻击,不能过分依靠它或人为减小这个值,更应该增加这个值(如果增加内存后)
    12. net.ipv4.tcp_synack_retries = 3
    13. #为打开对端的连接,内核需发送个SYN并附带个回应前一个SYN的ACK。即三次握手中的第二次握手。该设置决定内核放弃连接前发SYN+ACK包的数量。
    14. net.core.somaxconn = 32768
    15. #如web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而 nginx 定义的 NGX_LISTEN_BACKLOG 默认511,所以有必要调整这个值。
  • 相关阅读:
    [leetcode 单调栈] 901. 股票价格跨度 M
    Redux——详解
    剑指 Offer 49. 丑数 && 264. 丑数 II ●●
    汽车蓄电池
    React 脚手架
    基于K8S单节点部署你的第一个K8S应用
    案例分享 生产环境逐步迁移至k8s集群 - pod注册到consul
    深度 | 车载语音群雄并起共争智能座舱新高地
    赋能智慧校园!A3D数字孪生可视化,轻量又高效!
    外汇天眼:Axi收回在RGT Capital的全部控制权,Eurotrader获得FCA牌照
  • 原文地址:https://blog.csdn.net/akk_dian/article/details/133063972