haproxy和nginx在功能上比较相似,但是又各有不同,接下来我先跟大家阐述这两个方法的区别:
nginx是master-workers多进程,每个进程单线程,多核CPU能充分利用; haproxy是多线程,单进程就能实现超高性能,虽然haproxy也能多进程,但是网上资料多认为开了多进程也不能提升性能,不建议多进程跑。
即使做反向代理nginx性能略低于haproxy。
各自特点如下:
nginx:
使用花括号,层级化的配置文件结构
除了自带的map、if语句可以实现简单逻辑,原生支持js/perl脚本,非官方支持lua
除了做负载均衡还可以做静态web服务器,缓存服务器(Haproxy不行)
模块化,按需编译,因为模块化,所以可选很多第三方扩展模块
开源版本只有基础功能,更多的功能要折腾第三方模块,或者花钱买官方扩展版的nginx plus
haproxy:
定义和引用,命令式的配置结构
支持acl,但不支持其他脚本语言(评论里有人说现在可以支持了)
做负载均衡性能比nginx好
有一个状态统计页面官方支持会话保持、健康检查等(nginx开源版不带)
基础功能覆盖要比nginx开源版好,但是不易扩展,缺乏第三方资源。
Nginx的优点: 1、优点工作在OSI第7层,可以针对http应用做一些分流的策略 2、Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能 3、Nginx安装和配置比较简单 4、可以承担高的负载压力且稳定 5、Nginx可以通过端口检测到服务器内部的故障 6、Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器 Nginx的缺点: 1、Nginx不支持url来检测。 2、Nginx仅能支持http和Email,这个它的弱势。 3、Nginx的Session的保持,Cookie的引导能力相对欠缺。 HAProxy的优点: 1、HAProxy是支持虚拟主机的 2、支持url检测后端的服务器 3、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的; 4、HAProxy可以对Mysql读进行负载均衡,节点检测 5、HAProxy的算法较多
一. HAProxy的基本配置
下载好之后就有了haproxy用户,在以下文件添加该用户
更改haproxy的配置文件:
添加status,以方便一会查看
更改两个server的ip以及其httpd服务端口:
开启haproxy服务: 查看日志,以确定haproxy是否开启成功:
在网页上查看服务状态:
红色标注就是服务未开启
开启httpd服务之后,先是黄色填充:
等待一下就变成绿色:
查看负载均衡的结果:
二. haproxy的优化策略
Haproxy的8种负载均衡算法:
roundrobin,表示简单的轮询
static-rr,表示根据权重,
leastconn,表示最少连接者先处理,
source,表示根据请求源IP,
uri,表示根据请求的URI;
url_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name
hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
测试:balance source <一>
先更改配置文件:
开启acl权限以及静态访问:
将server服务器只保留一个:
访问haproxy服务页面:
在静态访问的ip里上传一张图片以便观察结果:
当我们访问172.25.2.5的images/vim.jpg时,虽然我们并没有配置server5上的httpd服务,但是会默认访问172.25.2.7上的文件:
<二>
更改配置文件:
balance roundrobin :haproxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常见的默认配置。
balance source :haproxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务器时,需要配置此选项。
停掉server6的httpd服务:
此时curl ip ,就只能定位到server7:
重新开启server6,因为同一IP地址的所有请求都发送到同一服务器,所以一旦检测到服务开启就会继续把之前的ip访问定位到之前的服务器:
更改权重:
这时curl就会发现,server6出现的次数比server7多:
将server5当作backup:
因为80端口开启服务已被占用,为了不冲突,更改端口为8080:
查看一下端口:
访问ip,最下栏显示已经配置成功:
查看实验结果:
停掉server6,7的服务:
curl ip,显示server5: 配置成功!!!
配置访问密码:
需要密码用户访问:
三. 读写分离
为了便于查找日志,排错,需要读写分离:
设置黑名单:
把真机ip配置到黑名单:
真机无法访问:
但是server6可以:
黑名单重定向:
让黑名单重定向403错误:
curl -I,配置成功:
黑名单重定向百度:
结合php服务:
在server5上添加php服务:
在server6上配置php上传文件的大小:
server6,7配置相同,直接将server6的文件传过去:
在server5上重新启用roundrobin:
访问网页: 在日志上查看现在是app1服务:
上传图片:
在server7查看upload目录,有上传记录: server6上没有:
五. haproxy高可用
安装pacemaker:
配置软件仓库:
做免密协议:
在server4安装:
启用服务: 更改hacluster密码:
查看集群是否成功: 显示success就成功:
开启server4,5的服务:
查看状态:
发现有warning:
设置stonish-enabled为false就好:
将配置文件传给server4:
访问server4,配置成功:
列出资源和提供者:
配置vip以及监控: ip addr配置成功:
停掉server5的服务:
再列出就只有server4online:
开启server5:
停掉server4,5的haproxy:
再再server’4上试着查看服务状态:
将vip加入服务:
此时vip在server4上: 重新开启服务:
down掉server4: server4会自动重启
server5上查看服务:
现在服务由server5接管,并且vip也飘到了server5上:
|