鸬鹚洲 发表于 2017-4-18 07:56:56

企业级高可用Web架构之HAProxy+Keepalived

  细数下来,算是东莞的项目的话,HAProxy+Keepalived我差不多也有三套在线上跑了,另外,这套Web方案也是我的一拍网的备份方案之一,目前也在测试,如果速度和稳定性够强劲的话,我也考虑将LVS+Keepalived换成HAProxy+Keepalived,关于HAProxy的语法和安装步骤请参考我的专题系列文章http://network.iyunv.com/art/201101/241997.htm,另外,此篇文章跟刘天斯的不一样,我主要用其作为Web级别的负载均衡(七层应用)。
  一、线上跑的HAProxy配置文件,代码如下:
  global
  log 127.0.0.1   local0
  maxconn 65535
  chroot /usr/local/haproxy
  uid 99
  gid 99
  daemon
  nbproc 8
  pidfile /usr/local/haproxy/haproxy.pid
  debug
  defaults
  log     127.0.0.1       local3
  mode   http
  option httplog
  option httpclose
  option dontlognull
  option forwardfor
  option redispatch
  retries 2
  maxconn 2000
  balance source
  stats   uri     /web-status
  contimeout      5000
  clitimeout      50000
  srvtimeout      50000
  listen  www.1paituan.com
  bind *:80
  mode http
  option httplog
  log global
  option httpchk HEAD /index.jsp HTTP/1.0
  server web1  203.93.236.147:80 weight 5  check inter 2000 rise 2 fall 3
  server web2  203.93.236.146:80 weight 3  check inter 2000 rise 2 fall 3
  二、HAProxy的启动、关闭和重启脚本,代码如下:
  #!/bin/sh
  # chkconfig 35 on
  # description: HAProxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments.
  # 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
  [ -f /usr/local/haproxy/conf/haproxy.cfg ] || exit 1
  RETVAL=0
  start() {
  /usr/local/haproxy/sbin/haproxy -c -q -f /usr/local/haproxy/conf/haproxy.cfg
  if [ $? -ne 0 ]; then
  echo "Errors found in configuration file."
  return 1
  fi
  echo -n "Starting HAproxy: "
  daemon /usr/local/haproxy/sbin/haproxy -D -f /usr/local/haproxy/conf/haproxy.cfg -p /var/run/haproxy.pid
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch /var/lock/subsys/haproxy
  return $RETVAL
  }
  stop() {
  echo -n "Shutting down HAproxy: "
  killproc haproxy -USR1
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/haproxy
  [ $RETVAL -eq 0 ] && rm -f /var/run/haproxy.pid
  return $RETVAL
  }
  restart() {
  /usr/local/haproxy/sbin/haproxy -c -q -f /usr/local/haproxy/conf/haproxy.cfg
  if [ $? -ne 0 ]; then
  echo "Errors found in configuration file, check it with 'haproxy check'."
  return 1
  fi
  stop
  start
  }
  check() {
  /usr/local/haproxy/sbin/haproxy -c -q -V -f /usr/local/haproxy/conf/haproxy.cfg
  }
  rhstatus() {
  status haproxy
  }
  condrestart() {
  [ -e /var/lock/subsys/haproxy ] && restart || :
  }
  # See how we were called.
  case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;
  restart)
  restart
  ;;
  reload)
  restart
  ;;
  condrestart)
  condrestart
  ;;
  status)
  rhstatus
  ;;
  check)
  check
  ;;
  *)
  echo $"Usage: haproxy {start|stop|restart|reload|condrestart|status|check}"
  RETVAL=1
  esac
  exit $RETVAL
  三、HAProxy的监控脚本我没有做,这个实施起来也简单,我们可以用curl -s --head http://www.1paituan.com/index.jsp | awk '/HTTP/ {print $2}'的方法,判断是否返回了正常的200代码。
  四、加上日志支持,代码如下:
  #vim /etc/syslog.conf
  添加:
  local3.*        /var/log/haproxy.log
  local0.*        /var/log/haproxy.log
  #vim /etc/sysconfig/syslog
  修改:
  SYSLOGD_OPTIONS="-r -m 0"
  service syslog restart
  五、大家需要注意的几个地方是:
  1)HAProyx采用的是balance source机制,它跟Nginx的ip_hash机制原理类似,是让客户机访问时始终访问后端的某一台真实的web服务器,这样让session就固定下来了;
  2)option httpchk HEAD /index.jsp HTTP/1.0 是网页监控,如果HAProxy检测不到Web的根目录下没有index.jsp,就会产生503报错。
  3)有网友说HAProxy必须采用listen 203.93.236.141:80这样类似的格式,这样其实不好,做集群时会导致从机启动不了,我们可以用bind *:80的方式代替。
  4)HAProxy的并发监控和日志收集分析是下一步考虑的事情。
页: [1]
查看完整版本: 企业级高可用Web架构之HAProxy+Keepalived