HA是高可用
Proxy 代理
HAProxy 能实现高可用反向代理工具
到目前所使用的主流的高可用加反向代理负载均衡的工具 lvs+keepad nginx haproxy
负载均衡(Load Balance,简称LB)是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展。
要么是软件 要么是硬件 但是用上硬件的可能性不大了 就像我们一个交换机 服务器 路由器那样的一个硬件设备 实现的高可用反向代理技术
硬件有:
F5 #https://f5.com/zh
Netscaler #https://www.citrix.com.cn/products/citrix-adc/
Array #https://www.arraynetworks.com.cn/
深信服 #http://www.sangfor.com.cn/
北京灵州 #http://www.lingzhou.com.cn/cpzx/llfzjh/
这是硬件级设备 超级昂贵
贼几把贵 比较出名的 F5 Netscaler
很贵 买一台 也就实现个负载均衡 还实现不了高可用
所以一买就是两台 一个便宜的设备都好几十万
两个硬件级的负载均衡设备都上百万 一两百万
现在中小公司 用不到 大公司也不再使用了
因为 业务量 办公量比较大 一两台 解决不了 上百台 太特么贵了
公司那点b毛钱 承受不了
四层的反向代理 基于tcp层的负载均衡
LVS(Linux Virtual Server)
HAProxy(High Availability Proxy)
Nginx(1.9) nginx 也有4层的 很少用就是
七层的反向代理 主流的就下面这俩
HAProxy
Nginx
这节课讲HAProxy 他能实现四层的 也能实现七层的
服务级别的负载均衡设备
什么叫做负载均衡?
他是把将特定的业务 不管是web服务 还是一些后端 纯tcp的服务 网络流量等
分担给指定的一个或多个后端特定多的服务器
就是之前nginx 通过upstream 把一个域名的服务 直接分给后端多台机器上去
他就是把一个服务 分发给后端不同的多台服务器或虚拟机 提供公司业务的并发能力
主要是水平的扩容! 并不是无限的 也是有限的 就是增加到一定数量 到一定级别 到他的天花板 不一定能提高性能 就是增加服务器 反而会降低 服务器的性能
这种水平扩容性 并不是无限制的
为什么要使用负载均衡呢?
软件级的负载均衡
最终是为了提高服务器的处理并发能力!
应用场景
四层是用在 mysql redis rabbitmq Memcache
七层的就比较多了 所有的web 服务器都是七层的 就是http 的 nginx 的 tomcat 的 apache php 图片 动静分离 API 等
HAProxy介绍: C语言开发的
HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件,是一款具备高并发(一万 以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换(几乎所有的反向代理和负载均衡设备都有这个功能,nginx 也有他会自动的去识别后端的健康状态
lvs和hproxy也有 他俩都是基于tcp 和http 两种方式),支持正则表达式及web状态 统计,目前最新TLS版本为2.0
HAProxy和Nginx 一样分两个版本
一个是企业版 一个是社区版本
从2013年HAProxy 分为社区版和企业版,企业版将提供更多的特性和功能以及全天24小时的技术支持等服务。
https://www.haproxy.com/ #企业版
上图是社区版网站 截图
如图 2.4 2.2 2.0 后面的LST 是长期支持版本的意思
一般偶数的版本为长期支持版本
如 2.0 版本 他后面显示 最多支持到 2024年
我们下载2.0
在这下载 Debian/Ubuntu packages
apt-get install --no-install-recommends software-properties-common
add-apt-repository ppa:vbernat/haproxy-2.0
apt-get install haproxy=2.0.\*
启一台机器 HAProxy-1
apt-get install --no-install-recommends software-properties-common
安装依赖包
add-apt-repository ppa:vbernat/haproxy-2.0
添加个apt 的仓库 apt源
apt update
刷新一下
apt-cache madison haproxy
查看一下 apt源里 可安装的haproxy版本
显示最高可安装2.0的
apt-get install haproxy=2.0.\*
或者
apt -y install haproxy
安装haproxy 2.0 版本
haproxy -v
查看版本
dpkg -L haproxy
安装完了后 用dpkg命令看下路径
他的默认路径在
vim /etc/haproxy/haproxy.cfg
但是这些我们都不要
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
拷贝一份
然后从新创建
vim /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /var/lib/haproxy
stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1
stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 2
uid 111
gid 115
daemon
nbproc 2
#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
spread-checks 5
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info
defaults
option redispatch
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
no option http-use-htx
上面的配置文件中 容易变动的是 uid 和gid
有可能会不一样
我们看下
cat /etc/passwd | grep haproxy
出现的uid 和gid 填到上面
我们启动他 因为Ubuntu上apt安装的应用 都会默认启动
我们启动的话 要关闭后再启动
systemctl restart haproxy
启动 haproxy
解释配置文件内容
chroot /var/lib/haproxy
这个chroot目录必须得存在 这个目录存在 就能正常启动
全局配置段 global 配置段 他是配置进程 比如
这两行就是 haproxy 启动的进程
还有性能调整相关参数如图
除了global 全局配置外
还一个是proxies 代理配置段
不过默认配置文件里面 没有给我们提供proxies 代理配置段
所以需要自己加proxies
如图 defaults 属于代理配置段之一
proxues代理配置段包括:
default
frontend(前端)
backend(后端)
listen
整个配置段就这些
haproxy从功能上来说 几乎和nginx 是类似的
nginx 能实现的haproxy几乎都可以实现
只是没有虚拟主机的概念 从反向代理 和负载均衡 nginx 有的 haproxy都有
功能可能比nginx 还要强大
再回到global段 全局段
##最大连接数 10万 一个haproxy进程所能 处理的连接数
如果有两个进程 就是10万2 100个进程就是10万100
##这个chroot目录必须得存在 这个目录存在 就能正常启动 不在就启动不了
这个叫锁定运行目录 就是我这 haproxy 一旦运行起来 就跳不出这个文件 这个目录必须存在 不存在就启动不来 不过这个目录默认是存在的 因为这个是haproxy的家目录
如果给他改了一个不存在的目录的话 他会报错 整个haproxy 就启动不来了
一旦出现 意外情况 比如当前的haproxy被黑客入侵了 入侵了以后 虽然他以haproxy 这个用户入侵的话 因为这个用户的权限很低 所以也干不了啥大事
没啥权限 就在这个目录下做操作
## haproxy 有几个进程 决定了sock文件的位置 还有级别 mode 进程名 process 1 进程1 process 2 进程2
这里是启动了两个process
##进程输入是这个值决定的 也就是这个数 * 10万 也就是2*10万=20万
开启多少haproxy进程
## 以哪个用户运行 和那个组
也可以改成
user haproxy
group haproxy
是否以守护进程的方式启动 是否后台启动
cpu绑定 和nginx 亲和度一样
## 后端server 状态 check(检查) 随机提前或者延迟的百分比 这里写着5 就相当于5%
这个生产上 建议 2-5之间
## 启动haproxy 后产生的进程号
##日志 syslog日志 127.0.0.1 本机的syslog 服务器
local3 定义在我本地的syslog服务里面 他所在的级别
而info 是日志记录的级别
以上的就是全局段
然后下面是proxues配置段
defaults 代理配置段包括:
default
frontend(前端)
backend(后端)
listen
这几个字段
关于listen frontend 和backend 还没有讲 他是关于反向代理的
默认是defaults 字段
##默认配置 他的作用域 针对listen frontend backend 这三个 配置段 生效
option redispatch 当server id 对应的服务器down后 强制将请求 从新定向 到其他健康机器 (后端服务都有个id 号 )
开启回话保持 类似长连接
##透传客户端真实ip 至后端web服务
##最大连接数
##模式 支持反向代理的模式 默认的工作模式 默认就是 http 和tcp
##超时时间
## 第一个 timeout connect 300000ms 30万毫秒 就是300秒 就是5分钟 客户端请求从haproxy到后端server 的最长连接等待时间
## 第二个timeout client 300000ms 设置haproxy 与客户端的最长活动时间
## 第三个timeout server 300000ms 客户端请求 从haproxy 到后端 服务器的处理超时时间
这些选项 会对后端 等下我们定义的其他字段 lissten backend frontend 这三个字段都生效的
虽然说都生效 如果说有相同的 比如frontend 也有这些选项 他是以他们自己段的选项为准的
fronend
##是前端的意思
backend
##后端的 意思
listen
##前端加后端
frontend 和backend 能实现的 listen 都能实现
在nginx 里面配置反向代理
我们是从server里面配置的 先定义一个虚拟主机
nginx:
upstream name {
server ip:port;
server ip:port;
}
server {
bind
server_name ;
proxy_pass http://upstream name;
}
是这样做的
haproxy是这么做的 :
frontend name
bind 80 #自己定义 只要没有被占用就行
mode http #模式可写可不写 因为在defaults字段里面写了
use_backend backend_name #使用的那个backend 使用的后端
backend name
mode http #模式可写可不写 因为在defaults字段里面写了
server server_id ip:port
server server_id ip:port
换成listen 就更简单了 他需要之前两个字段写的 统一在下面写就ok了
listen name
bind port
mode http
server server_id ip:port
server server_id ip:port
以上就是haproxy 和ngixn 反向代理对比
再生产上 如果使用纯反向代理的话 通常使用listen
开始操作
我们去启动两台tomcat服务器
用haproxy 来实现两台后端tomcat 的负载均衡 反向代理
vim /etc/haproxy/haproxy.cfg
打开配置文件
在最底下添加以下内容
frontend tomcat
bind :8080
mode http
use_backend tomcat-backend
backend tomcat-backend
mode http
server web1 10.2.3.11:8080
server web2 10.2.3.12:8080
解释:
frontend tomcat
#frontend(前端)起个名字 随意 起个tomcat
bind :8080
##这个端口号随意写 不冲突就行
mode http
## 默认http 写不写都行
use_backend tomcat-backend
##使用那个backend(后端) 起个名字名字随意但是后面要引用这个名字 tomcat-backend
backend tomcat-backend
##这个名称是引用 前面的tomcat-backend
mode http
## 因为默认就是http 写不写无所谓
server web1 10.2.3.11:8080
server web2 10.2.3.12:8080
## server id号 id是字母或者数字都可以 起个名字就是 后面跟上ip和端口号
前端加后端就类似 nginx 里的虚拟主机加upstream 反向代理负载均衡
保存退出
systemctl restart haproxy
重启haproxy
浏览器访问 haproxy ip+8080端口
10.2.3.1:8080
我们再使用listen 的方式来写
vim /etc/haproxy/haproxy.cfg
添加进去
listen tomcat-1
mode http
bind :8081
server web1 10.2.3.11:8080
server web2 10.2.3.12:8080
因为是继续写的 8080端口号被使用了 所以用的8081
server 后面的id号web1 只要是不在一个字段内 就不会冲突 和上面web1 没啥关系
systemctl restart haproxy
重启
然后浏览器访问 haproxy主机 10.2.3.1:8081
所以红框和黄框表达的意思是一样的
在生产上 我们习惯用 listen 的方式
因为简单!
我们现在只讲listen
listen 里面能使用的参数 frontend 和backend 都可以用
就比如 server 后面还可以加很多东西 权重 监测机制 加监测时长
bind 也是可以改的 可以起多个 8082 起多个 8800-8810 如下图
systemctl restart haproxy
重启
ss -tnl | grep 80
这样的话 就可以整个给我们起来
而且bind支持写ip地址
就可以看到 这些端口号 就默认只启动到了127.0.0.1上了
生产上不会写这么多 没啥用 所以我们只写一个就完事
最主要的还是server字段
他的默认机制是加权轮巡 和nginx 一样
加权重 默认权重都为1
weogjt ?
还可以加
inter 2000ms
这个是健康状态检查 每2000毫秒(2秒)监测一次
是haproxy服务来检测这个服务器 这个端口
还可以加fall他的默认数是fall 3 默认失败监测次数 就是后端监测 这个数的次数不可用 就真的代表他不可用了 写3 就是 监测三次 inter 2000s 每隔 2秒监测一次 就需要6秒
还可以加 rise 后端服务器检测是从不健康状态 检测是不是可用 健康状态检测 会一直检测这个机器 直到把这个机器给删掉 监测不健康的机器 重新检测恢复正常了 会把机器从新加到 配置里面去
rise 默认2 两次监测 为正常后 就代表正常了 就添加进来
除了这个以外 nginx 里面有backup 这里面也可以加
但是和nginx 的backup 不一样 这里是 永久关闭的意思 就是 注释的意思
除了这些以外
还有个状态页
haproxy状态页
vim /etc/haproxy/haproxy.cfg
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
option httplog
capture request header X-Forwarded-For len 15
capture request header User-Agent len 512
#stats refresh 2
stats admin if TRUE
stats uri /haproxy-status
stats auth haadmin:123456
listen stats ##名字必须叫stats
mode http ##默认使用http
bind 0.0.0.0:9999 ##端口号 随便写
stats enable ##开启状态页监测
log global ##使用全局日志
option httplog ##选项是httplog
capture request header X-Forwarded-For len 15 ##定义长度的
capture request header User-Agent len 512 ##定义长度的
#stats refresh 2
stats admin if TRUE ##当admin 为真
stats uri /haproxy-status
##指定一个uri 我就访问 上面bind 定义的端口号 uri地址/haproxy-status 就可以访问状态页
stats auth haadmin:123456 ##验证 用户名叫haadmin 密码123456
我们去看看 保存退出
systemctl restart haproxy
输入haproxy ip+端口 uri 是上面定义的stats uri /haproxy-status
10.2.3.1:9999/haproxy-status
输入账号 密码 也是配置文件定义的stats auth haadmin:123456
到这个页面
里面有 tocamt-backend- 和tomcat-1 还有tomcat 还有stats
这四个要不然listen 要不然frontend 要不然backend
现在是没有颜色变化的 我们加个值 在server 后面加上check
check
systemctl restart haprosy
现在这个颜色是绿色的 如果服务给他停了 他就会变色
然后就变成 黄色 然后再变成红色
正常是绿色
Frontend 前端 Queue 当前请求 Session rate 队列
Sessions 限制 里面有个 Limit 最大连接数 10万
Bytes 字节
Denied 拒绝多少
Errors 错误多少
Warnings 警告多少
server
前面不管看后面
Server 里面 有个 Status 和LastChk
当前都为 UP 说明状态可用的 no check 不检查
LastChk 最后一次检测 就是0毫秒以前 L4OK 默认值是L4级别的 监测OK
就是tcp 的检测为ok
再就是后面 Server
wght 权重
Act 确认值为 Y 代表正常的
Bck Chk
所有监测在里面都可以看到
然后可以通过这里关闭
给他down 掉
但是一般情况不在这做修改
当前haproxy 的pid是谁 4210
然后一共启动了 nbproc =2 一共两个进程 nbthread =1 每个进程启动了一个线程
刷新 就会看到更改
可以看到的
一个root 用户启动的 root 用户启动的是主进程
还有两个haproxy用户启动的 子进程
一共两个进程 每个进程启动了一个线程 nbthread =1
其他的就是定义的一堆大小值了
这个就是我们所写的首页文件
给我们提供了 web1 web_1 web2 stats 这个是 给我们记录了 所有的frontend listen 字段的名称
显示的是 backend 和listen 的后端服务器 都会显示出来
他只显示名称
比如我们把 名称 web1 web_1 这类的名字 改为 他的ip 我们再看一下
然后他们的名字就改变了