haproxy做TCP层的负载均衡

最新项目中发现,大量游戏玩家访问登录服务器时出现延迟,导致玩家无法登录,愿意可能是登录服务器性能达到极限。

所以目前想通过proxy的方式访问登录服务器集群,避免登录延迟。

1.下载haproxy最新版本

http://www.haproxy.org/download/1.5/src/haproxy-1.5.12.tar.gz

2.安装haproxy软件

   tar zxvf haproxy-1.5.12.tar.gz
   cd haproxy-1.5.12
  uname -a    //查看linux内核版本, TARGET是内核版本,2.6就写作26
  make TARGET=linux26 PREFIX=/usr/local/haproxy
  make install PREFIX=/usr/local/haproxy

3.配置haproxy

mkdir /etc/haproxy/conf
vim /etc/haproxy/conf/haproxy.cfg

###########全局配置#########
global
chroot /usr/local/haproxy
daemon
nbproc 1
group nobody
user nobody
pidfile /opt/haproxy/logs/haproxy.pid
ulimit-n 65536
#spread-checks 5m 
#stats timeout 5m
#stats maxconn 100
 
########默认配置############
defaults
mode tcp               #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
retries 3              #两次连接失败就认为是服务器不可用,也可以通过后面设置
option redispatch      #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose    #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
maxconn 32000          #默认的最大连接数
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超时
timeout server 30000ms #服务器超时
#timeout check 2000    #心跳检测超时
log 127.0.0.1 local0 err #[err warning info debug]
 
########test1配置#################
listen test1
bind 0.0.0.0:8008
mode tcp
balance roundrobin
server s1 127.0.0.1:8010 weight 1 maxconn 10000 check inter 10s
server s2 127.0.0.1:8011 weight 1 maxconn 10000 check inter 10s
server s3 127.0.0.1:8012 weight 1 maxconn 10000 check inter 10s
 
########test2配置#################
listen test2
bind 0.0.0.0:8007
mode tcp
balance roundrobin
server s1 192.168.1.88:8010 weight 1 maxconn 10000 check inter 10s
server s2 192.168.1.88:8011 weight 1 maxconn 10000 check inter 10s
########统计页面配置########
listen admin_stats
bind 0.0.0.0:8099 #监听端口
mode http         #http的7层模式
option httplog    #采用http日志格式
#log 127.0.0.1 local0 err
maxconn 10
stats refresh 30s #统计页面自动刷新时间
stats uri /stats  #统计页面url:port/stats
stats realm XingCloud\ Haproxy #统计页面密码框上提示文本

stats auth admin:admin #统计页面用户名和密码设置stats hide-version #隐藏统计页面上HAProxy的版本信息

4.配置启动脚本

vim /usr/local/haproxy/sbin/haproxy.sh
#!/bin/sh
cd /usr/local/haproxy/sbin
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/conf/haproxy.cfg &

5.查看启动进程

ps -ef |grep haproxy  或者netstat -ntpl |grep haproxy

来检查haproxy是否启动成功!

配置详解

####################全局配置信息######################## 
#######参数是进程级的,通常和操作系统(OS)相关######### 
global 
       maxconn 20480                   #默认最大连接数 
       log 127.0.0.1 local3            #[err warning info debug] 
       chroot /var/haproxy             #chroot运行的路径 
       uid 99                          #所属运行的用户uid 
       gid 99                          #所属运行的用户组 
       daemon                          #以后台形式运行haproxy 
       nbproc 1                        #进程数量(可以设置多个进程提高性能) 
       pidfile /var/run/haproxy.pid    #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件 
       ulimit-n 65535                  #ulimit的数量限制 
 
 
#####################默认的全局设置###################### 
##这些参数可以被利用配置到frontend,backend,listen组件## 
defaults 
       log global 
       mode http                       #所处理的类别 (#7层 http;4层tcp  ) 
       maxconn 20480                   #最大连接数 
       option httplog                  #日志类别http日志格式 
       option httpclose                #每次请求完毕后主动关闭http通道 
       option dontlognull              #不记录健康检查的日志信息 
       option forwardfor               #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip  
       option redispatch               #serverId对应的服务器挂掉后,强制定向到其他健康的服务器  
       option abortonclose             #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接 
       stats refresh 30                #统计页面刷新间隔 
       retries 3                       #3次连接失败就认为服务不可用,也可以通过后面设置 
       balance roundrobin              #默认的负载均衡的方式,轮询方式 
      #balance source                  #默认的负载均衡的方式,类似nginx的ip_hash 
      #balance leastconn               #默认的负载均衡的方式,最小连接 
       contimeout 5000                 #连接超时 
       clitimeout 50000                #客户端超时 
       srvtimeout 50000                #服务器超时 
       timeout check 2000              #心跳检测超时 
 
####################监控页面的设置####################### 
listen admin_status                    #Frontend和Backend的组合体,监控组的名称,按需自定义名称 
        bind 0.0.0.0:65532             #监听端口 
        mode http                      #http的7层模式 
        log 127.0.0.1 local3 err       #错误日志记录 
        stats refresh 5s               #每隔5秒自动刷新监控页面 
        stats uri /admin?stats         #监控页面的url 
        stats realm itnihao\ itnihao   #监控页面的提示信息 
        stats auth admin:admin         #监控页面的用户和密码admin,可以设置多个用户名 
        stats auth admin1:admin1       #监控页面的用户和密码admin1 
        stats hide-version             #隐藏统计页面上的HAproxy版本信息  
        stats admin if TRUE            #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本) 
 
 
       errorfile 403 /etc/haproxy/errorfiles/403.http 
       errorfile 500 /etc/haproxy/errorfiles/500.http 
       errorfile 502 /etc/haproxy/errorfiles/502.http 
       errorfile 503 /etc/haproxy/errorfiles/503.http 
       errorfile 504 /etc/haproxy/errorfiles/504.http 
 
       #################HAProxy的日志记录内容设置################### 
       capture request  header Host           len 40 
       capture request  header Content-Length len 10 
       capture request  header Referer        len 200 
       capture response header Server         len 40 
       capture response header Content-Length len 10 
       capture response header Cache-Control  len 8 
 
#######################网站监测listen配置##################### 
###########此用法主要是监控haproxy后端服务器的监控状态############ 
listen site_status 
       bind 0.0.0.0:1081                    #监听端口 
       mode http                            #http的7层模式 
       log 127.0.0.1 local3 err             #[err warning info debug] 
       monitor-uri /site_status             #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503 
       acl site_dead nbsrv(server_web) lt 2 #定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true 
       acl site_dead nbsrv(server_blog) lt 2 
       acl site_dead nbsrv(server_bbs)  lt 2  
       monitor fail if site_dead            #当满足策略的时候返回503,网上文档说的是500,实际测试为503 
       monitor-net 192.168.16.2/32          #来自192.168.16.2的日志信息不会被记录和转发 
       monitor-net 192.168.16.3/32 
 
########frontend配置############ 
#####注意,frontend配置里面可以定义多个acl进行匹配操作######## 
frontend http_80_in 
       bind 0.0.0.0:80      #监听端口,即haproxy提供web服务的端口,和lvs的vip端口类似 
       mode http            #http的7层模式 
       log global           #应用全局的日志配置 
       option httplog       #启用http的log 
       option httpclose     #每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式 
       option forwardfor    #如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中获得客户端IP 
       ########acl策略配置############# 
       acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$    
       #如果请求的域名满足正则表达式中的2个域名返回true -i是忽略大小写 
       acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn 
       #如果请求的域名满足www.itnihao.cn返回true -i是忽略大小写 
       #acl itnihao    hdr(host) -i itnihao.cn 
       #如果请求的域名满足itnihao.cn返回true -i是忽略大小写 
       #acl file_req url_sub -i  killall= 
       #在请求url中包含killall=,则此控制策略返回true,否则为false 
       #acl dir_req url_dir -i allow 
       #在请求url中存在allow作为部分地址路径,则此控制策略返回true,否则返回false 
       #acl missing_cl hdr_cnt(Content-length) eq 0 
       #当请求的header中Content-length等于0时返回true 
 
       ########acl策略匹配相应############# 
       #block if missing_cl 
       #当请求中header中Content-length等于0阻止请求返回403 
       #block if !file_req || dir_req 
       #block表示阻止请求,返回403错误,当前表示如果不满足策略file_req,或者满足策略dir_req,则阻止请求 
       use_backend  server_web  if itnihao_web 
       #当满足itnihao_web的策略时使用server_web的backend 
       use_backend  server_blog if itnihao_blog 
       #当满足itnihao_blog的策略时使用server_blog的backend 
       #redirect prefix http://blog.itniaho.cn code 301 if itnihao 
       #当访问itnihao.cn的时候,用http的301挑转到http://192.168.16.3 
       default_backend server_bbs 
       #以上都不满足的时候使用默认server_bbs的backend 
 
 
 
 
##########backend的设置############## 
#下面我将设置三组服务器 server_web,server_blog,server_bbs
###########################backend server_web############################# 
backend server_web 
       mode http            #http的7层模式 
       balance roundrobin   #负载均衡的方式,roundrobin平均方式 
       cookie SERVERID      #允许插入serverid到cookie中,serverid后面可以定义 
       option httpchk GET /index.html #心跳检测的文件 
       server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1  
       #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用, 
       #fall 3是3次失败认为服务器不可用,weight代表权重 
       server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2 
       #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用, 
       #fall 3是3次失败认为服务器不可用,weight代表权重 
 
###################################backend server_blog############################################### 
backend server_blog 
       mode http            #http的7层模式 
       balance roundrobin   #负载均衡的方式,roundrobin平均方式 
       cookie SERVERID      #允许插入serverid到cookie中,serverid后面可以定义 
       option httpchk GET /index.html #心跳检测的文件 
 
       #服务器定义: 
       #cookie 1表示serverid为web1, 
       #check inter 1500是检测心跳频率
       #rise 3是3次正确认为服务器可用,
       #fall 3是3次失败认为服务器不可用,
       #weight代表权重 
       server blog1 192.168.16.2:80 cookie blog1 check inter 1500 rise 3 fall 3 weight 1  
       server blog2 192.168.16.3:80 cookie blog2 check inter 1500 rise 3 fall 3 weight 2 
 
 
###################################backend server_bbs############################################### 
backend server_bbs 
       mode http            #http的7层模式 
       balance roundrobin   #负载均衡的方式,roundrobin平均方式 
       cookie SERVERID      #允许插入serverid到cookie中,serverid后面可以定义 
       option httpchk GET /index.html #心跳检测的文件 
 
       #服务器定义,
       #cookie 1表示serverid为web1,
       #check inter 1500是检测心跳频率
       #rise 3是3次正确认为服务器可用,
       #fall 3是3次失败认为服务器不可用,
       #weight代表权重
       server bbs1 192.168.16.2:80 cookie bbs1 check inter 1500 rise 3 fall 3 weight 1
       server bbs2 192.168.16.3:80 cookie bbs2 check inter 1500 rise 3 fall 3 weight 2

配置例子1

###########全局配置#########
global
        daemon
        nbproc 1
        pidfile /var/run/haproxy.pid
 
 
########默认配置############
defaults
        mode http               #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
        retries 2               #两次连接失败就认为是服务器不可用,也可以通过后面设置
        option redispatch       #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
        option abortonclose     #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
        maxconn 4096            #默认的最大连接数
        timeout connect 5000ms  #连接超时
        timeout client 30000ms  #客户端超时
        timeout server 30000ms  #服务器超时
        #timeout check 2000      #=心跳检测超时
        log 127.0.0.1 local0 err #[err warning info debug]
 
 
########统计页面配置########
listen admin_stats
        bind 0.0.0.0:1080               #监听端口
        mode http                       #http的7层模式
        option httplog                  #采用http日志格式
        #log 127.0.0.1 local0 err
        maxconn 10
        stats refresh 30s               #统计页面自动刷新时间
        stats uri /stats                #统计页面url
        stats realm XingCloud\ Haproxy  #统计页面密码框上提示文本
        stats auth admin:admin          #统计页面用户名和密码设置
        stats hide-version              #隐藏统计页面上HAProxy的版本信息
 
 
########test1配置#################
listen test1
        bind 0.0.0.0:90
        mode tcp
        #maxconn 4086
        #log 127.0.0.1 local0 debug
        server s1 10.18.138.201:80
        server s2 10.18.102.190:80
        server s3 10.18.102.189:80
        server s4 10.18.102.188:80
        server s5 10.18.102.187:80
########frontend配置##############
 
 
########test2配置#################
listen test2
        bind 0.0.0.0:91
        mode tcp
        #maxconn 4086
        #log 127.0.0.1 local0 debug
        server s1 10.18.138.130:80      weight 1
        server s2 10.18.138.201:8080    weight 6
########frontend配置##############

配置例子2

global
       maxconn 51200 #限制单个进程的最大连接数
        chroot /usr/local/haproxy
       uid 99 #所属运行用户,默认99为nobody
       gid 99 #所属运行用户组,默认99为nobody
       daemon #让进程作为守护进程在后台运行
        quiet
       nbproc 2 #指定作为守护进程运行时的进程数,推荐设置为与CPU核心数相同
        pidfile //usr/local/haproxy/haproxy.pid
 
defaults
 
       mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
       #retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
        option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
        option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
        timeout connect 5000ms #连接超时
        timeout client 30000ms #客户端超时
        timeout server 30000ms #服务器超时
        #timeout check 2000 #=心跳检测超时
        log 127.0.0.1 local0 err #[err warning info debug]
       balance roundrobin                     #负载均衡算法
        #option  httplog                        #日志类别,采用httplog
       #option  httpclose   #每次请求完毕后主动关闭http通道,ha-proxy不支持keep-alive,只能模拟这种模式的实现
        #option  dontlognull
       #option  forwardfor  #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
 
 
listen www.123p6.cn 0.0.0.0:80 #运行的端口及主机名
       mode http #使用http的7层模式
       balance roundrobin #设置服务器负载分配算法
       option httpclose
      option forwardfor
      option httpchk GET /keepalive.html #健康检测页面
       server webapp1 192.168.1.101:80 weight 1 check inter 2000 rise 2 fall 3
      server webapp2 192.168.1.102:80 weight 1 check inter 2000 rise 2 fall 3
      # weight - 调节服务器的负重 
       # check - 允许对该服务器进行健康检查 
       # inter - 设置连续的两次健康检查之间的时间,单位为毫秒(ms),默认值 2000(ms) 
      # rise - 指定多少次连续成功的健康检查后,即可认定该服务器处于可操作状态,默认值 2 
      # fall - 指定多少次不成功的健康检查后,认为服务器为当掉状态,默认值 3 
      # maxconn - 指定可被发送到该服务器的最大并发连接数 
 
listen localhost 0.0.0.0:8888 #监控页面的端口
       mode http
      transparent
      stats refresh 30s #统计页面自动刷新时间
       stats uri /haproxy-stats #监控页面的访问地址
       stats realm Haproxy \ statistic #统计页面密码框上提示文本
       stats auth haproxyadmin:haproxypass #统计页面用户名和密码设置
       stats hide-version #隐藏统计页面上HAProxy的版本信息

参考:

http://lanlian.blog.51cto.com/6790106/1305228
http://itnihao.blog.51cto.com/1741976/915537

还没有评论,快来抢沙发!

发表评论

  • 😉
  • 😐
  • 😡
  • 😈
  • 🙂
  • 😯
  • 🙁
  • 🙄
  • 😛
  • 😳
  • 😮
  • emoji-mrgree
  • 😆
  • 💡
  • 😀
  • 👿
  • 😥
  • 😎
  • ➡
  • 😕
  • ❓
  • ❗
  • 71 queries in 0.440 seconds