HAproxy(四十七)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、概述

1.1 简介

1.2 核心功能

1.3 关键特性

1.4 应用场景

二、安装

1.内核配置

2.编译安装

​3. 建立配置文件

4. 添加为系统服务

5. 添加3和5运行级别下自启动

三、调度算法

四、配置文件

五、负载均衡

   5.1  7层负载

​   5.2 4层负载

六、配置syslog日志

七、keepalive+haproxy实现高可用

总结



前言

  HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy具备媲美商用负载均衡器的性能和稳定性,以下是今天的学习内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、概述

1.1 简介

     HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上(CentOS、Ubuntu、Debian、OpenSUSE、Fedora、麒麟、欧拉、UOS)。
    HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy具备媲美商用负载均衡器的性能和稳定性。

1.2 核心功能

         负载均衡:L4和L7两种模式,支持RR/静态RR/LC/IP Hash/URI Hash/URL_PARAM Hash/HTTP_HEADER Hash等丰富的负载均衡算法
        健康检查:支持TCP和HTTP两种健康检查模式
        会话保持:对于未实现会话共享的应用集群,可通过Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多种Hash方式实现会话保持
        SSL:HAProxy可以解析HTTPS协议,并能够将请求解密为HTTP后向后端传输
        HTTP请求重写与重定向
        监控与统计:HAProxy提供了基于Web的统计信息页面,展现健康状态和流量数据。基于此功能,使用者可以开发监控程序来监控HAProxy的状态

1.3 关键特性

         采用单线程、事件驱动、非阻塞模型,减少上下文切换的消耗,能在1ms内处理数百个请求。并且每个会话只占用数KB的内存。
        大量精细的性能优化,如O(1)复杂度的事件检查器、延迟更新技术、Single-buffereing、Zero-copy forwarding等等,这些技术使得HAProxy在中等负载下只占用极低的CPU资源。
        HAProxy大量利用操作系统本身的功能特性,使得其在处理请求时能发挥极高的性能,通常情况下,HAProxy自身只占用15%的处理时间,剩余的85%都是在系统内核层完成的。
        HAProxy作者在8年前(2009)年使用1.4版本进行了一次测试,单个HAProxy进程的处理能力突破了10万请求/秒,并轻松占满了10Gbps的网络带宽。

1.4 应用场景

   高并发要求较高的场合下

二、安装

1.内核配置

内核配置(实验环境可有可无)
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.ip_local_port_range = 1024 65023
    net.ipv4.tcp_max_syn_backlog = 10240
    net.ipv4.tcp_max_tw_buckets = 400000
    net.ipv4.tcp_max_orphans = 60000
    net.ipv4.tcp_synack_retries = 3
    net.core.somaxconn = 10000

2.编译安装

    wget https://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz

HAproxy(四十七)_第1张图片
    make PREFIX=/usr/local/haproxy TARGET=linux2628
    make install PREFIX=/usr/local/haproxy 

HAproxy(四十七)_第2张图片3. 建立配置文件

   从haproxy的源码包中的examples下的init.haproxy中获得配置文件的路径“/etc/haproxy/haproxy.cfg”
    mkdir /etc/haproxy
    touch /etc/haproxy/haproxy.cfg

 

 

4. 添加为系统服务


    cp /root/haproxy-1.7.2/examples/haproxy.init /etc/init.d/haproxy

cp /root/haproxy-1.7.2/examples/haproxy.init /etc/init.d/haproxy

     vim  /etc/init.d/haproxy
    修改: 35行 内容为 BIN=/usr/local/haproxy/sbin/$BASENAME

 #!/bin/sh
#
# chkconfig: - 85 15
# description: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited \
#              for high availability environments.
# processname: haproxy
# config: /etc/haproxy/haproxy.cfg
# pidfile: /var/run/haproxy.pid

# Script Author: Simon Matter 
# Version: 2004060600

# Source function library.
if [ -f /etc/init.d/functions ]; then
  . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
  . /etc/rc.d/init.d/functions
else
  exit 0
fi

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

# This is our service name
BASENAME=`basename $0`
if [ -L $0 ]; then
  BASENAME=`find $0 -name $BASENAME -printf %l`
  BASENAME=`basename $BASENAME`
fi

BIN=/usr/local/haproxy/sbin/$BASENAME

CFG=/etc/$BASENAME/$BASENAME.cfg
[ -f $CFG ] || exit 1

PIDFILE=/var/run/$BASENAME.pid
LOCKFILE=/var/lock/subsys/$BASENAME

RETVAL=0

start() {
  quiet_check
  if [ $? -ne 0 ]; then
    echo "Errors found in configuration file, check it with '$BASENAME check'."
    return 1
  fi

  echo -n "Starting $BASENAME: "
  daemon $BIN -D -f $CFG -p $PIDFILE
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch $LOCKFILE
  return $RETVAL
}
stop() {
  echo -n "Shutting down $BASENAME: "
  killproc $BASENAME -USR1
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
  [ $RETVAL -eq 0 ] && rm -f $PIDFILE
  return $RETVAL
}

restart() {
  quiet_check
  if [ $? -ne 0 ]; then
    echo "Errors found in configuration file, check it with '$BASENAME check'."
    return 1
  fi
  stop
  start
}

reload() {
  if ! [ -s $PIDFILE ]; then
    return 0
  fi

  quiet_check
  if [ $? -ne 0 ]; then
    echo "Errors found in configuration file, check it with '$BASENAME check'."
    return 1
  fi
  $BIN -D -f $CFG -p $PIDFILE -sf $(cat $PIDFILE)
}

check() {
  $BIN -c -q -V -f $CFG
}

quiet_check() {
  $BIN -c -q -f $CFG
}

rhstatus() {
  status $BASENAME
}

condrestart() {
  [ -e $LOCKFILE ] && restart || :
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    restart
    ;;
reload)
    reload
    ;;
  condrestart)
    condrestart
    ;;
  status)
    rhstatus
    ;;
  check)
    check
    ;;
  *)
    echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|status|check}"
    exit 1
esac

exit $?
                
                                     

                        


    chmod +x /etc/init.d/haproxy
    chkconfig --add /etc/init.d/haproxy 

5. 添加3和5运行级别下自启动

    chkconfig haproxy --level 35 on
    chkconfig --list 

HAproxy(四十七)_第3张图片

 启动haproxy
    service haproxy  start
    service haproxy  stop
    service haproxy  restart  | reload
    systemctl  daemon-reload
    也可以使用systemctl进行启停

HAproxy(四十七)_第4张图片

测试

在web服务器中安装Nginx(yum),添加访问文件

14        echo nginx1> /usr/share/nginx/html/index.html

15        echo nginx2> /usr/share/nginx/html/index.html

在13里进行访问(页面访问很慢在终端里更方便观察)

三、调度算法

    roundrobin:表示简单的轮询。
    static-rr:表示根据权重。
    leastconn:表示最少连接者先处理。
    source:表示根据请求的源 IP,类似 Nginx 的 IP_hash 机制。
    ri:表示根据请求的 URI。
    rl_param:表示根据 HTTP 请求头来锁定每一次 HTTP 请求。
    rdp-cookie(name):表示根据据 cookie(name)来锁定并哈希每一次 TCP 请求。

四、配置文件

配置项:

    global:用于配置全局参数

    default:用于配置所有frontend和backend的默认属性

    frontend:用于配置前端服务(即HAProxy自身提供的服务)实例

    backend:用于配置后端服务(即HAProxy后面接的服务)实例组

    listen:frontend+backend的组合配置,可以理解成更简洁的配置方法

五、负载均衡

   5.1  7层负载

    配置负载

global 
    daemon  
    maxconn 256  
    pidfile /var/run/haproxy/haproxy.pid  
 
defaults 
    mode http  
    timeout connect 5000ms  
    timeout client 50000ms  
    timeout server 50000ms 
 
frontend http-in 
    bind *:8080  
    default_backend servers  
 
backend servers 
    server server1 192.168.156.14:80 maxconn 32  
    server server1 192.168.156.15:80 maxconn 32

       
        配置监控页面

  listen stats    #定义监控页面    
bind *:1080                   #绑定端口1080    
stats refresh 30s             #每30秒更新监控数据    
stats uri /stats              #访问监控页面的uri    
stats realm HAProxy\ Stats    #监控页面的认证提示    
stats auth admin:admin        #监控页面的用户名和密码

HAproxy(四十七)_第5张图片

HAproxy(四十七)_第6张图片

HAproxy(四十七)_第7张图片


    5.2 4层负载

配置负载

global 
    daemon  
    maxconn 256  
    pidfile /var/run/haproxy/haproxy.pid  
 
defaults 
    mode tcp
    timeout connect 5000ms  
    timeout client 50000ms  
    timeout server 50000ms 
 
frontend http-in 
    bind *:8080  
    default_backend servers  
 
backend servers
    balance  roundrobin  #轮询
    #balance  source     #保持会话 
    server server1 127.0.0.1:8000 maxconn 32  
server server2 127.0.0.1:8090 maxconn 32
        不支持监控状态

六、配置syslog日志

touch /etc/rsyslog.d/haproxy.conf

$ModLoad imudp
  
$UDPServerRun 514
$FileCreateMode 0644  #日志文件的权限
$FileOwner root  #日志文件的owner
local0.*     /var/log/haproxy.log  #local0接口对应的日志输出文件
local1.*     /var/log/haproxy_warn.log  #local1接口对应的日志输出文件

HAproxy(四十七)_第8张图片

HAproxy(四十七)_第9张图片

七、keepalive+haproxy实现高可用

在上面实验的基础上安装keepalived

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

bal_defs {
   router_id LVS_DEVEL
}
#HAProxy健康检查配置
vrrp_script chk_haproxy {
    script "killall -0 haproxy"  #使用killall -0检查haproxy实例是否存在,性能高于ps命令
    interval 2   #脚本运行周期
    weight 2   #每次检查的加权权重值
}

vrrp_instance HA_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.156.100
    }
    track_script {
        chk_haproxy        #对应的健康检查配置
    }
}

  

添加一台虚拟机192.168.156.16

安装keepalived 和haproxy

keepalived配置

global_defs {
   router_id LVS_DEVEL
}
#HAProxy健康检查配置
vrrp_script chk_haproxy {
    script "killall -0 haproxy"  #使用killall -0检查haproxy实例是否存在,性能高于ps命令
    interval 2   #脚本运行周期
    weight 2   #每次检查的加权权重值
}

vrrp_instance HA_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.115.200
    }
    track_script {
        chk_haproxy        #对应的健康检查配置
    }
}

haproxy配置

global 
    daemon  
    maxconn 256  
    pidfile /var/run/haproxy/haproxy.pid   
 
defaults 
    mode http  
    timeout connect 5000ms  
    timeout client 50000ms  
    timeout server 50000ms 
 
frontend http-in 
    bind *:80 
    default_backend servers   
 
backend servers 
    server server1 192.168.115.128:80 maxconn 32  
server server2 192.168.115.131:80  maxconn 32

    分别重启两个服务

systemctl restart haproxy

systemctl restart keepalived

    测试

 停掉第一台的keepalived

 HAproxy(四十七)_第10张图片

 查看第二台的IP

你可能感兴趣的:(lq,云计算运维学习,运维,云计算,linux)