1)HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。

2)HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。

3)HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

4)HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
--------------------- 原文:https://blog.csdn.net/sj349781478/article/details/78862315

安装haproxy

推荐直接yum安装吧:

yum install -y haproxy

haproxy的配置文件在/etc/haproxy/下面!

haproxy配置文件参数,在http://www.ywnds.com/?p=6749  博客中有详细的说明,这里只说明haproxy的用法以及涉及到的参数说明!

首先来测试负载均衡:

两台后端服务器ip为:10.0.102.204和10.0.102.214,是nginx服务器!

10.0.102.179作为调度器,使用的是haproxy!

yum安装完成之后,在配置文件中加入如下参数,也可以修改原配置文件!

frontend  webserver
bind *:
default_backend web_test backend web_test
balance roundrobin
server app1 10.0.102.204: check
server app2 10.0.102.214: check #frontend定义了一些监听的套接字,bind监听套接字的端口,*表示监听所有的ip,default_backend定义了real server服务器组
#backend:指定后端服务器组,与前面的frontend对应,balance表示使用的调度算法,server指定的是后面真实服务器的地

测试如下:

[root@mgt01 ~]# curl 10.0.102.179
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.179
The hosname is test3

使用listen命令

上面的配置可以使用一个listen配置,同时还可以加上权重:

listen  webserver
bind *:
stats enable #启用haproxy自带的界面监控
balance roundrobin
server app1 10.0.102.204: check weight
server app2 10.0.102.214: check weight

访问测试:

[root@mgt01 ~]# curl 10.0.102.179
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.179
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.179
The hosname is test3
[root@mgt01 ~]# curl 10.0.102.179
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.179
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.179
The hosname is test3
[root@mgt01 ~]#

访问其web界面:

url的格式如下:

http://10.0.102.179/haproxy?stats

这个界面的信息统计还是蛮全面的!

访问这个界面的时候,界面上显示了haproxy的版本号,我们可以设置不显示版本号,并且还可以加上用户认证!

配置如下:

listen  webserver
bind *:
stats enable
stats hide-version #隐藏版本信息
stats realm FUCK #显示提示信息
stats auth admin:123456 #认证的用户名和密码
balance roundrobin
server app1 10.0.102.204: check weight
server app2 10.0.102.214: check weight

再次访问url时候,会出现如下提示:

输入正确的用户名和密码之后,会进入到监控界面,可以看到监控界面中haproxy的版本信息已经消失!

相比较于lvs和keepalived,haproxy的web界面已经很让人惊奇了!我们还可以在web界面进行一些操作,只需要打开管理员的窗口即可!

listen  webserver
bind *:
stats enable
stats hide-version
stats realm FUCK
stats auth admin:
stats admin if TRUE
stats uri /admin?admin balance roundrobin
server app1 10.0.102.204: check weight
server app2 10.0.102.214: check weight

打开如下的url:

http://10.0.102.179/admin?admin

输入用户名和密码之后

上面的监听都是监听同一端口,可以借助于listen和frontend设置监听不同的端口!

我们把其中的一个后端服务器的端口改为监听8080端口!

[root@test2 sbin]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0.0.0.0: 0.0.0.0:* LISTEN /sshd
tcp 0.0.0.0: 0.0.0.0:* LISTEN /nginx
tcp ::: :::* LISTEN /sshd
[root@test2 sbin]#

修改haproxy的配置文件如下:

listen  webserver
bind *:
balance roundrobin
server app1 10.0.102.214: check weight stats enable
stats hide-version
stats realm FUCK
stats auth admin:
stats admin if TRUE
stats uri /admin?admin frontend test
bind *:
default_backend back_srv
backend back_srv
balance roundrobin
server app2 10.0.102.204: check weight

然后重新haproxy,测试结果如下:

[root@mgt01 ~]# curl 10.0.102.179
The hosname is test3
[root@mgt01 ~]# curl 10.0.102.179:
The host ip is 10.0.102.204

上面说明了haproxy的一些简单应用,但是haproxy都是单机的,接下来我们测试haproxy+keepalived的应用!

使用haproxy做负载均衡,使用keepalived做高可用!

keeplaived配置参数详解,很详细的地址: https://blog.csdn.net/mofiu/article/details/76644012

在这里我们引入了一个vrrp_script参数:

作用:添加一个周期性执行的脚本。脚本的退出状态码会被调用它的所有的VRRP Instance记录。
注意:至少有一个VRRP实例调用它并且优先级不能为0.优先级范围是1-.
vrrp_script <SCRIPT_NAME> {
...
} 选项说明:
scrip "/path/to/somewhere":指定要执行的脚本的路径。
interval <INTEGER>:指定脚本执行的间隔。单位是秒。默认为1s。
timeout <INTEGER>:指定在多少秒后,脚本被认为执行失败。
weight <- --- >:调整优先级。默认为2.
rise <INTEGER>:执行成功多少次才认为是成功。
fall <INTEGER>:执行失败多少次才认为失败。
user <USERNAME> [GROUPNAME]:运行脚本的用户和组。
init_fail:假设脚本初始状态是失败状态。 解释:
weight:
. 如果脚本执行成功(退出状态码为0),weight大于0,则priority增加。
. 如果脚本执行失败(退出状态码为非0),weight小于0,则priority减少。
. 其他情况下,priority不变。

做为master的配置文件如下:

! Configuration File for keepalived

vrrp_script check_haproxy {
script "/root/check_haproxy_status.sh"
interval
weight -
} vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
} track_script { check_haproxy
}
virtual_ipaddress {
10.0.102.110 dev eth0
}
}

从的配置文件与主基本相似,需要更改的是state的状态和权重值!需要保证两台主备的virtual_router_id数值是一样的!

然后是添加检测脚本文件:

cat check_haproxy_status.sh
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq ];then
service haproxy start
fi
sleep
if [ $(ps -C haproxy --no-header | wc -l) -eq ];then
service keepalived stop
fi

然后分别在master和backup上启动keepalived!

测试VIP如下:

[root@test3 sbin]# curl 10.0.102.110
The hosname is test3
[root@test3 sbin]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@test3 sbin]# curl 10.0.102.110
The hosname is test3
[root@test3 sbin]# curl 10.0.102.110
The hosname is test3
[root@test3 sbin]# curl 10.0.102.110
The host ip is 10.0.102.204

我们可以在主上模拟,停掉haproxy的服务,观察VIP的漂移情况,只有在主上的keepalived服务停掉之后,VIP才会发生漂移!

在线上环境中有一个问题,好像是bug吧!就是keepalived运行长时间之后,会忽然停掉,不知道什么原因造成。在这里使用了自己写的shell脚本,对keepalived进行监控。

在master上配置文件,监控脚本,如下:

[root@test1 log]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived vrrp_script check_haproxy {
script "/root/check_haproxy_status.sh"
interval
weight -
} vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id
priority
nopreempt
advert_int
authentication {
auth_type PASS
auth_pass
} track_script { check_haproxy
}
virtual_ipaddress {
10.0.102.110 dev eth0
}
} [root@test1 log]#

cat /etc/keepalived/keepalived.conf

监控脚本如下:

[root@test1 log]# cat /root/moniter_keepalived.sh
#!/bin/bash
#
#
VIP=10.0.102.110
MASTER=10.0.102.179
BACKUP=10.8.102.221
CONF=/etc/keepalived/keepalived.conf
NodeRole=`grep -i "state" /etc/keepalived/keepalived.conf | awk '{print $2}'` check_Vip() {
ping -c -w $VIP &> /dev/null && return || return
} restart_Server() {
if [ $NodeRole == "MASTER" ];then
ping -c -w $BACKUP &> /dev/null
if [ $? -eq ];then
ssh -l root $BACKUP "/etc/init.d/keepalived stop"
sleep
/etc/init.d/keepalived restart
echo `date +%Y-%m-%d_%H:%M` "NodeRole--MASTER: if"
check_Vip && ssh -l root $BACKUP "/etc/init.d/keepalived start"
else
/etc/init.d/keepalived restart
echo `date +%Y-%m-%d_%H:%M` "NodeRole-Master: else"
fi
elif [ $NodeRole == "BACKUP" ];then
ping -c -w $MASTER &> /dev/null
if [ $? -eq ];then
/etc/init.d/keepalived stop
ssh -l root $MASTER "/etc/init.d/keepalived restart"
check_Vip && /etc/init.d/keepalived start
echo $(date +%F_%H-%M-%S) "NodeRole-BACKUP: if"
else
/etc/init.d/keepalived restart
echo $(date +%F_%H-%M-%S) "NodeRole-Backup: else" fi
fi
} while true;do
check_Vip
if [ $? -eq ];then
restart_Server
else
echo "ok"
fi
sleep
done

cat /root/moniter_keepalived.sh

监控脚本加上可执行权限,然后放到后台运行!

nohup /root/moniter_keepalived.sh  > /var/log/nohup.log  >& &

在backup上配置文件如下:

[root@mgt01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived vrrp_script check_haproxy {
script "/root/check_haproxy_status.sh"
interval
weight -
} vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
} track_script { check_haproxy
}
virtual_ipaddress {
10.0.102.110 dev eth0
}
}

cat /etc/keepalived/keepalived.conf

监控脚本如下:

[root@mgt01 ~]# cat moniter_keepalived.sh
#!/bin/bash
#
#
VIP=10.0.102.110
MASTER=10.0.102.179
BACKUP=10.0.102.221
CONF=/etc/keepalived/keepalived.conf
NodeRole=`grep -i "state" /etc/keepalived/keepalived.conf | awk '{print $2}'` check_Vip() {
ping -c -w $VIP &> /dev/null && return || return
} restart_Server() {
if [ $NodeRole == "MASTER" ];then
ping -c -w $BACKUP &> /dev/null
if [ $? -eq ];then
ssh -l root $BACKUP "/etc/init.d/keepalived stop"
sleep
/etc/init.d/keepalived restart
echo `date +%Y-%m-%d_%H:%M` "NodeRole--MASTER: if"
check_Vip && ssh -l root $BACKUP "/etc/init.d/keepalived start"
else
/etc/init.d/keepalived restart
echo `date +%Y-%m-%d_%H:%M` "NodeRole-Master: else"
fi
elif [ $NodeRole == "BACKUP" ];then
ping -c -w $MASTER &> /dev/null
if [ $? -eq ];then
/etc/init.d/keepalived stop
ssh -l root $MASTER "/etc/init.d/keepalived restart"
check_Vip && /etc/init.d/keepalived start
echo $(date +%F_%H-%M-%S) "NodeRole-BACKUP: if"
else
/etc/init.d/keepalived restart
echo $(date +%F_%H-%M-%S) "NodeRole-Backup: else" fi
fi
} check_Vip
if [ $? -eq ];then
restart_Server
fi

cat /root/moniter_keepalived.sh

把此监控脚本加入可执行计划!

[root@mgt01 ~]# crontab -l
*/ * * * * sh /root/moniter_keepalived.sh

当主和备的keepalived都宕机时,主的keepalived就会重新启动!

负载均衡之-haproxy的更多相关文章

  1. 千万级高并发负载均衡软件HAproxy

    1负载均衡产品介绍 基于硬件的负载均衡设备例如F5,Big-IP,基于软件的负载均衡产品HAproxy,LVS,nginx在这些软件产品中,又分为基于操作系统的软负载实现和基于第三方应用的软负载实现. ...

  2. Nodejs负载均衡:haproxy,slb以及node-slb - i5ting的个人空间 - 开源中国社区

    Nodejs负载均衡:haproxy,slb以及node-slb - i5ting的个人空间 - 开源中国社区 undefined

  3. http层负载均衡之haproxy

    http层负载均衡之haproxy实践篇(一) 方案 上篇文章讲到了负载均衡的相关理论知识,这篇文章我打算讲讲实践方法以及实践中遇到的问题 方案:haproxy http层负载均衡 安装一个hapro ...

  4. 烂泥:高负载均衡学习haproxy之关键词介绍

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 上一篇文章我们简单讲解了有关haproxy的安装与搭建,在这篇文章我们把haproxy配置文件中使用到的关键词一一介绍下. 关注我微信ilann ...

  5. 烂泥:高负载均衡学习haproxy之安装与配置

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 有关高负载均衡的软件,目前使用比较多的是haproxy.nginx和lvs.下面我们就开始学习haprxoy这款软件. 一.haproxy介绍 以下开始介 ...

  6. 大型网站系统架构实践(四)http层负载均衡之haproxy实践篇(一)

    方案 上篇文章讲到了负载均衡的相关理论知识,这篇文章我打算讲讲实践方法以及实践中遇到的问题 方案:haproxy http层负载均衡 安装一个haproxy服务,两个web服务 haproxy:192 ...

  7. 负载均衡之Haproxy配置详解(及httpd配置)

    下图描述了使用keepalived+Haproxy主从配置来达到能够针对前段流量进行负载均衡到多台后端web1.web2.web3.img1.img2.但是由于haproxy会存在单点故障问题,因此使 ...

  8. 千万级高并发负载均衡软件haproxy配置文件详解

    balance roundrobin         #轮询方式 balance source               #将用户IP经过hash计算后,使同一IP地址的所有请求都发送到同一固定的后 ...

  9. 负载均衡之haproxy负载均衡算法及haproxy的工作模式

    haproxy负载均衡的算法有如下7种: .roundrobin : 基于权重轮循. static-rr : 基于权重轮循.静态算法,运行时改变无法生效 source : 基于请求源IP的算法.对请求 ...

随机推荐

  1. IDEA2016.3搭建Struts2+Hibernate+Spring项目环境

    IDEA搭建SSH环境 1.环境 软件版本:IntelliJ IDEA 2016.3.2 系统:windows 7 32位 / ubuntu 框架:Hibernate3,Spring3.2, Stru ...

  2. 使用TensorFlow Serving优化TensorFlow模型

    使用TensorFlow Serving优化TensorFlow模型 https://www.tensorflowers.cn/t/7464 https://mp.weixin.qq.com/s/qO ...

  3. idea 创建的maven+spring+mybatis项目整合 报错无法创建bean

    报错如下: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with n ...

  4. BZOJ4614 UVA1742 Oil 计算几何+搜索+扫描线

    正解:计算几何+搜索+扫描线 解题报告: 传送门 哇我是真的觉得这题很妙了!各个方面都很妙啊... 首先有一个很重要的结论:最优线一定可以通过各种变换(旋转/平移)使得经过一条线段的左端点(...并不 ...

  5. javaScript高级教程(九) ------javascript对象字面量--------困扰已久的问题

    在编程语言中,字面量是一种表示值的记法.例如,"Hello, World!" 在许多语言中都表示一个字符串字面量(string literal ),JavaScript也不例外. ...

  6. 【深入理解javascript】执行上下文

    参考原文:执行上下文 1.每一个执行上下文,工作分为三个阶段: 准备阶段–>执行阶段–>调用阶段 准备阶段:代码执行之前,设置数据,相当于初始化. 执行阶段:开始执行每一行代码. 调用阶段 ...

  7. 通过Tacker将NFV引入OpenStack

    14年的这个时候,我们还在OpenStack社区中为NFV是否属于OpenStack而争论不休.如今这一争议已经被解决了.OpenStack已经成为NFV讨论中的重要部分,正如下面的ETSI MANO ...

  8. 机器学习理论基础学习1——频率派 VS 贝叶斯派

    频率派 贝叶斯派 theta是个未知的常量,X是随机变量, theta是个随机变量,X是随机变量 MLE最大似然估计 MAE最大后验概率 统计机器学习,优化问题 1)建立模型.概率 2)定义损失函数 ...

  9. Windows程序自启动方法汇总

    文件夹 一.当前用户专有的启动文件夹 二.对所有用户有效的启动文件夹 三.Load注册键 四.Userinit注册键 五.Explorer\Run注册键 六.RunServicesOnce注册键 七. ...

  10. selenium webdriver testng自动化测试数据驱动

    selenium webdriver testng自动化测试数据驱动 selenium webdriver testng自动化测试数据驱动 一.数据驱动测试概念 数据驱动测试是相同的测试脚本使用不同的 ...