Haproxy combined with FTP cluster for load balancing
时间:2022-07-22
本文章向大家介绍Haproxy combined with FTP cluster for load balancing,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Haproxy介绍
Haproxy具有以下功能:
- 第4层(TCP)和第7层(HTTP)负载均衡
- URL重写
- 限速
- GZIP压缩
- 代理协议支持
- 健康检查
- 多线程
Haproxy主要支持以下算法:
- rr轮询算法,用于短连接
- lc最少连接数算法,用于长连接
- source源地址算法,用于SSL集群或者终端服务器集群,直接根据客户端的源IP地址来选择对应服务器
- uri算法,用于HTTP缓存
- hdr算法,根据指定的HTTP HEADER内容来选择对应服务器
- first算法,用于短生命周期的虚拟机
安装与配置
目前的最新稳定版是1.9,后面使用的均是此版本
导入仓库源并下载 sudo add-apt-repository ppa:vbernat/haproxy-1.9 sudo apt-get update sudo apt install haproxy haproxy -v
配置介绍
分为两大部分
- global配置段,用于设定全局配置参数
- proxy配置段
- defaults,用于为其他配置段提供默认参数
- frontend,用于定义一系列监听的地址和端口信息,用于客户端与之建立连接
- backend,用于后端服务器,代理会将对应客户端的请求转发至服务器
- listen,通过关联frontend和backend,定义了一个完整的代理,通常只对TCP流量有用
配置参考
$ cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0 #日志输出配置,所有日志都记录在本机,通过local0输出
log 127.0.0.1 local1 notice #定义haproxy的日志级别,[error warnning notice info debug]
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon #以后台形式运行
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
# An alternative list with additional directives can be obtained from
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode tcp #有三种[tcp http health],其中health只会返回ok
option tcplog #日志类别
option dontlognull #不记录健康检查日志信息
retries 2 #两次连接失败认为是服务器不可用
timeout connect 5000 #连接超时
timeout client 50000 #客户端超时时间
timeout server 50000 #服务端超时时间
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend ftp-server
bind *:21
default_backend ftp-server-pool
frontend ftp-server-244
bind *:20001-20500
default_backend ftp-port-range-244
frontend ftp-server-245
bind *:20501-30000
default_backend ftp-port-range-245
frontend ftp-server-246
bind *:30001-30500
default_backend ftp-port-range-246
backend ftp-server-pool
balance roundrobin
server ftp-port-range-244 10.1.1.244 check port 21 inter 10s rise 1 fall 2
server ftp-port-range-245 10.1.1.245 check port 21 inter 10s rise 1 fall 2
server ftp-port-range-246 10.1.1.246 check port 21 inter 10s rise 1 fall 2
#check inter 10s 是检测心跳频率
#rise 2 是两次正确认为服务器可用
#fall 2 两次失败认为服务器不可用
backend ftp-port-range-244
server ftp-port-range-244 10.1.1.244 check port 21 inter 10s rise 1 fall 2
backend ftp-port-range-245
server ftp-port-range-245 10.1.1.245 check port 21 inter 10s rise 1 fall 2
backend ftp-port-range-246
server ftp-port-range-246 10.1.1.246 check port 21 inter 10s rise 1 fall 2
启动测试
启动之前先检查配置文件是否正确
$ haproxy -f /etc/haproxy/haproxy.cfg -c
Configuration file is valid
启动
$ sudo systemctl restart haproxy
FTP集群部署
参考之前的博客:
ubuntu下部署FTP服务器
centos7下搭建ftp服务器
- reflow和repaint(摘录自张鑫旭的翻译)
- git删除本地分支
- org.springframework.data.redis.serializer.SerializationException: Cannot serialize;
- 样式化加载失败的图片
- 使用telnet命令验证邮箱(r4笔记第19天)
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存
- 前端开发中的字符编码
- 算法工程师的面试难不难,如何准备?-图像处理/CV/ML/DL到HR面总结
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(九)Linux下安装redis及redis的常用命令和操作
- 通过使用hint unnest调优sql语句(r4笔记第38天)
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十一)redis密码设置、安全设置
- 极简增强学习新手教程 返回专栏查看评论
- 经典Java面试题收集
- 百度魅族深度学习大赛初赛冠军作品(图像识别.源码)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 11.深入k8s:kubelet工作原理及其初始化源码分析
- 关于搜索,你不知道的是.....
- oracle查询表前十条数据
- sql语句查oracle版本号
- 商业鬼才教你 模板方法模式
- 用SQL语句查看Oracle数据表的结构信息
- Oracle建表语法
- 剑指Offer第1题详解(附Java、Python实现代码)
- (美团)动态规划,打家劫舍!
- POIEasyExcel
- 剑指Offer第2题详解(附Python、Java代码实现)
- 剑指Offer第3题详解(附Java、Python源码)
- 从String中移除空白字符的多种方式!?差别竟然这么大!
- Stack.peek() 与 Stack.pop() 的区别
- 傅里叶变换有什么用?