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. TFS二次开发05——下载文件(DownloadFile)

    前面介绍了怎样读取TFS上目录和文件的信息,怎么建立服务器和本地的映射(Mapping). 本节介绍怎样把TFS服务器上的文件下载到本地. 下载文件可以有两种方式: using Microsoft.T ...

  2. opencv3在CMakeLists.txt中的调用问题

    在cmake工程中使用opencv需要在CMakeLists.txt文件中加以调用,在opencv2.xx版本,可以用以下语句 # 寻找OpenCV库 find_package( OpenCV REQ ...

  3. Python实现KNN算法及手写程序识别

    1.Python实现KNN算法 输入:inX:与现有数据集(1xN)进行比较的向量   dataSet:已知向量的大小m数据集(NxM)   个标签:数据集标签(1xM矢量)   k:用于比较的邻居数 ...

  4. 计蒜客 31452 - Supreme Number - [简单数学][2018ICPC沈阳网络预赛K题]

    题目链接:https://nanti.jisuanke.com/t/31452 A prime number (or a prime) is a natural number greater than ...

  5. 2016江苏省CPC省赛 I - Itinerary Planning

    Description Mike moved to a new city. There are bus stations in the city, each has a unique name. Ea ...

  6. OpenJ_Bailian - 4152 最佳加法表达式 dp

    http://bailian.openjudge.cn/practice/4152?lang=en_US 题解 :dp[i][j]代表前i个字符加j个加号可以得到的最小值,于是dp[i+k[j+1]可 ...

  7. linux:查看以及管理进程

    学习笔记内容概要 进程查看的命令:top,ps,pstree 进程管理的命令:kill,nice,renice 查看进程: 一.top工具 top 工具是我们常用的一个查看工具,能实时的查看我们系统的 ...

  8. select.select的使用注意事项

    1.select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制. 2.select()所维护的存储 ...

  9. sql中select into和insert into的区别

    select into主要是作用于没有新建表,在复制数据的时候新建 insert into主要作用于已经新建了一个表,直接把要复制的数据复制到新建好的表中

  10. MySQL left join right join inner join

    好记性不如烂笔头 sql连接共三种:内连接,外连接,交叉连接. 内连接包含:等值连接,不等值连接,自然连接 外连接包含:左连接(左外连接),右连接(右外连接) 具体理论见我的博文http://blog ...