本次使用haproxy仅测试web端的高可用以及负载均衡,存在的问题是haproxy是单点,所以还需要借助keepalived对haproxy高可用,下次说明。

服务器:

*.*.*.*:haproxy

两台   http 

需要掌握的是:

1.高可用和负载均衡;

2.系统日志rsyslog;

3.动静分离

一:haproxy简介:

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

HAProxy的优点

1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段);

2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;

3、支持url检测后端的服务器;

4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;

5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;

6、HAProxy的算法较多,达到8种;

安装:


#wget http://fossies.org/linux/misc/haproxy-1.6.9.tar.gz  (这个需要先登陆到网页查看haproxy版本,只有一个最新的版本)

#解压

#tar -zxvf haproxy-1.6.9.tar.gz

#cd haproxy-1.6.9

#安装

#make TARGET=linux3100 ARCH=x86_64 PREFIX=/root/haproxy  #编译 

#make install PREFIX=/root/haproxy

#参数说明

TARGET=linux3100 #内核版本,

ARCH=x86_64 #系统位数

PREFIX=/root/haprpxy #/root/haprpxy为haprpxy安装路径

#touch  /root/haproxy/conf/haproxy.cfg(此配置文件需要自己手动创建)

补充:

在Unix类操作系统上,rsyslog广泛应用于系统日志。rsyslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器。接收syslog的服务器可以对多个设备的syslog消息进行统一的存储,或者解析其中的内容做相应的处理。常见的应用场景是网络管理工具、安全管理系统、日志审计系统。


先说haproxy的系统日志设置; (注意这是centos7上面的,centos6上的文件配置不在这里)

2. 开启rsyslog记录haproxy日志功能

编辑“/etc/rsyslog.conf”打开如下配置项:

# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

添加如下内容:

# Save haproxy log
local0.*                       /var/log/haproxy.log

3. 修改“/etc/sysconfig/rsyslog”文件,内容如下

# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-r -m 0 "


相关解释说明:
-r:打开接受外来日志消息的功能,其监控514 UDP端口;
-x:关闭自动解析对方日志服务器的FQDN信息,这能避免DNS不完整所带来的麻烦;
-m:修改syslog的内部mark消息写入间隔时间(0为关闭),例如240为每隔240分钟写入一次"--MARK--"信息;
-h:默认情况下,syslog不会发送从远端接受过来的消息到其他主机,而使用该选项,则把该开关打开,所有
接受到的信息都可根据syslog.conf中定义的@主机转发过去

4. 配置haproxy

编辑haproxy配置文件,在全局变量中配置,也就是第二行;

log 127.0.0.1 local0


###重启服务
service  restart rsyslog

###查看日志记录
tailf /var/log/haproxy.log

下来手写haproxy启动脚本:

#!/bin/bash
#set -e
export LANG='zh_CN.UTF-8'
source /etc/init.d/functions

#PATH=$PATH:/root/haproxy/sbin
dir=/root/haproxy
name=haproxy
DAEMON=$dir/sbin/$name

CONFIG=$dir/conf/$name.cfg
#PIDFILE=$dir/conf/$name.pid
#aa=`ps -ef | grep haproxy | grep -v grep | awk '{print $2}'`


test -x $DAEMON || exit 0

start() {
  $DAEMON -f $CONFIG >/dev/null
  a=$?
  if [ $a -eq 0 ]; then
    action "haproxy服务启动正常"   /bin/true
  fi
}
stop() {
  killall haproxy
  b=$?
  if [ $b -eq 0 ]; then
    action "haproxy服务关闭正常"   /bin/true
  fi
}
restart() {
  [ ! -n $PIDFILE ] && start || stop

  start
}
case "$1" in
start)
  start
  ;;
stop)
  stop
  ;;
restart)
  restart
   ;;
*)
  echo "正确的参数,start|stop|restart"
esac

下来时创建haproxy的配置文件:

vim /root/haproxy/conf/haproxy.cfg

global
log 127.0.0.1 local0
maxconn 65536
chroot /root/haproxy
pidfile /root/haproxy/conf/haproxy.pid
#log
#user haproxy
#group haproxy
daemon

defaults
mode  http    #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
log global
option dontlognull  #不记录健康检查日志信息
option httpclose  #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
retries 3    #三次连接失败就认为是服务器不可用,也可以通过后面设置
maxconn 65536
timeout connect 70000
timeout client 70000
timeout server 70000

listen stats     #监控
bind 0.0.0.0:1080           # 端口
stats uri /admin-status     # 监控的uri
stats auth admin:admin    #用户用:密码
mode http
option httplog


frontend main
   bind *:80
  acl web hdr(host) -i www.abc.com  #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发web规则,。
  acl img hdr(host) -i img.abc.com
   use_backend webserver if web #如果上面定义的web规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域
   use_backend imgserver if img
#   default_backend dynamic  #不满足则响应backend的默认页面

backend webserver
mode http
balance roundrobin
server web1  192.168.116.135:80 check inter 2000 rise 2  fall 3
server web2  192.168.116.136:80 check inter 2000 rise 2 fall 3
#check inter 2000 是检测心跳频率 fall 3是3次失败认为服务器不可用,weight代表权重
backend imgserver
mode http
#option httpchk /index.php
balance roundrobin
server img01 192.168.116.136:80 check inter 2000 fall 3
server img02 192.168.116.136:80 check inter 2000 fall 3

#backend dynamic
#  balance roundrobin
#  server test1 10.0.0.152:80 check maxconn 2000
#  server test2 10.0.0.155:80 check maxconn 2000

执行结果如下:

image.png

当关闭135或者137上面的httpd服务后,就会请求另一个httpd服务。


将服务加入到系统中:

编辑/etc/init.d/haproxy添加:

#chkconfig 2345  20 80

#service haproxy

然后在外面执行命令:

#chkconfig  --add  haproxy

#chkconfig  --list   haproxy

下来就可以使用命令执行启动和关闭了: 

image.png