HAProxy 介绍

https://www.haproxy.org/ (官方网站)

https://www.haproxy.org/download/1.8/src/ (下载地址)

http://cbonte.github.io/haproxy-dconv/1.8/configuration.html (文档Haproxy 1.8 文档)

(负载均衡的类型讲解;无负载、四层、七层)

HAProxy 是一个使用C语言编写的 自由及开放源代码软件,其提供高可用性、负载均衡,以及基于 TCP 和 HTTP 的应用程序代理。

  • HAProxy 特别适用于那些负载特大的 web 站点,这些站点通常又需要会话保持或七层处理。
  • HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进你当前的架构中,同时可以保护你的 web 服务器不被暴露到网络上。
  • HAProxy 实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化,以使每个 CPU 时间片 Cycle 做更多的工作。
  • 相较于 Nginx ,HAProxy 更专注于反向代理,因此它可以支持更多的选项,更精细的控制,更多的健康状态检测机制和负载均衡算法。
  • 包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter 和 Tuenti 在内的知名网站,及亚马逊网络服务系统都使用了 HAProxy。


Haproxy 的特性:

  1. 可靠性与稳定性都非常出色,可与硬件级设备媲美。
  2. 支持连接拒绝,可以用于防止 DDoS 攻击。
  3. 支持长连接、断连接和日志功能,可根据需要灵活配置。
  4. 路由 HTTP 请求到后端服务器,基于 cookie 做会话绑定;同时支持通过获取指定的 url 来检测后端服务器的状态。
  5. HAProxy 还拥有功能强大的 ACL 支持,可灵活配置路由功能,实现动静分离,在架构设计与实现上带来很大方便。
  6. 可支持四层和七层负载均衡,几乎能为所有服务常见的提供负载均衡功能。
  7. 拥有功能强大的后端服务器的状态监控 web 页面,可以实时了解设备的运行状态,还可实现设备上下线等简单操作。
  8. 支持多种负载均衡调度算法,并且也支持 session 保持。
  9. Haproxy 七层负载均衡模式下,负载均衡与客户端及后端的服务器会分别建立一次 TCP 连接,而在四层负载均衡模式下(DR),仅建立一次 TCP 连接;七层负载均衡对负载均衡设备的要求更高,处理能力也低于四层负载均衡。


Haproxy 的配置文件由两部分组成:

  1. 全局设定(global settings)
  2. 对代理的设定(proxies)


全局设定:

global settings:主要用于定义 haproxy 进程管理安全及性能相关的参数。



代理设定:

proxies 共分为4段:defaults、frontend、backend、listen

proxies:代理相关的配置可以有如下几个配置端组成

defaults:为除了 global 以外的其它配置段提供默认参数,默认配置参数可由下一个 “defaults” 重新设定。

frontend:定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。

backend:定义 “后端” 服务器,前端代理服务器将会把客户端的请求调度至这些服务器。

listen:定义监听的套接字和后端的服务器。类似于将 frontend 和 backend 段放在一起

所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和 :(冒号)。此外,ACL 名称会区分字母大小写。


配置文件详细介绍

注意:此处只做配置文件介绍,不作为后期负载均衡配置

global
	log 127.0.0.1 local0 # 定义全局的 syslog 服务器,最多可定义2个,格式:log <address> <facility> [max level [min level]]
	chroot /var/lib/haproxy # 修改 haproxy 的工作目录至指定的目录并在放弃权限之前执行,保证haproxy的安全,使用配置文件默认值即可
	pidfile /var/run/haproxy.pid
	maxconn 10000 # 设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;
	user haproxy # 以指定的 user 运行haproxy,建议使用专用于运行 haproxy 的 user, 以免因权限问题带来风险;
	group haproxy # 以指定的 group 运行haproxy,建议使用专用于运行 haproxy 的 group, 以免因权限问题带来风险;
	daemon # 让 haproxy 以守护进程的方式工作于后台,其等同于 “-D” 选项的功能, 当然,也可以在命令行中以 “-db” 选项将其禁用;
	ulimit-n 100000 # 设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;Linux默认单进程打开文件数为1024个
	stats socket /var/lib/haproxy/stats level admin process 1 # 开启一个 socket 管理接口
	nbproc 12 # 指定启动的 haproxy 进程个数,只能用于守护进程模式的 haproxy;默认只启动一个进程,
	cpu-map 1 0 # 绑定 cpu,和 nbproc 数量相对。进程号从1开始,cpu 核数从0开始;

defaults
	log global
	option tcplog # 启用日志记录;tcplog 请求;
	option dontlognull # 日志中将不会记录空连接;
	retries 3 # 定义连接后端服务器的失败重连次数
	timeout connect 2s # 定义 haproxy 将客户端请求转发至后端服务器所等待的超时时长
	timeout client 3600s # 客户端非活动状态的超时时长
	timeout server 3600s # 客户端与服务器端建立连接后,等待服务器端的超时时长
	maxconn 10000 # 默认和前段的最大连接数,但不能超过 global 中的 maxconn 限制数

listen admin_stats # 开启一个统计报告服务
	bind *:1080 # 监听1080端口
	mode http # 基于http协议
	maxconn 10
	stats refresh 10s # 统计页面自动刷新时间间隔
	stats uri /haproxy # url 地址
	stats realm Haproxy # 统计页面密码框上提示文本
	stats auth admin:admin # 账号:密码
	stats hide-version # 隐藏统计报告版本信息
	stats admin if TRUE # 在制定条件下开启admin 功能

frontend haproxy # 前端应用
	bind *:40000 # 端口
	mode tcp # tcp 模式
	default_backend tidb # 此前端对应的后端应用

backend tidb # 后端应用
	balance leastconn # balance 基于最少连接数
	mode tcp # tcp 模式
	# acl internal_networks src 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 127.0.0.1 定义一条ACL,ACL是根据数据包的指定属性以指定表达式计算出的true/false值。
	# tcp-request content reject if ! internal_networks
	# option mysql-check user haproxy post-41
	server tidb1 10.0.1.4:4000 check # 后端应用地址,代理将会将对应客户端的请求转发至这些服务器。
	server tidb2 10.0.1.10:4000 check



环境搭建准备:

服务器名称

IP

操作系统

安装服务

MySQL-Master

192.168.183.180

CentOS7.1

mysql、elasticsearch

MySQL-Slave1

192.168.183.181

CentOS7.1

mysql、Mycat、haproxy、Keepalived

MySQL-Slave2

192.168.183.182

CentOS7.1

mysql、haproxy、Keepalived


HAProxy 安装与环境配置

在 192.168.183.181 与 192.168.183.182(负载均衡服务器)中安装与配置如下:

一、安装 haproxy 负载均衡器

yum install haproxy -y

二、配置 haproxy 配置文件,目录:/etc/haproxy/haproxy.cfg

global
	log 127.0.0.1 local2
	chroot /var/lib/haproxy
	pidfile /var/run/haproxy.pid
	maxconn 4000
	user haproxy
	group haproxy
	daemon
	stats socket /var/lib/haproxy/stats
	
defaults
	mode tcp
	log global
	option tcplog
	option dontlognull
	option http-server-close
	option redispatch
	retries 3
	timeout http-request 10s
	timeout queue 1m
	timeout connect 10s
	timeout client 1m
	timeout server 1m
	timeout http-keep-alive 10s
	timeout check 10s
	maxconn 3000

frontend mysql
	bind 0.0.0.0:3307
	mode tcp
	log global
	default_backend mysql_server

backend mysql_server
	balance roundrobin
	server mysql1 192.168.183.182:3306 check inter 5s rise 2 fall 3
	server mysql2 192.168.183.181:3306 check inter 5s rise 2 fall 3

listen stats
	mode http
	bind 0.0.0.0:1080
	stats enable
	stats hide-version
	stats uri /haproxyadmin?stats
	stats realm Haproxy\ Statistics
	stats auth admin:admin
	stats admin if TRUE

三、启动 haproxy 负载均衡

/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg