做者:李仲舒html
HAProxy 是一个使用 C 语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于 TCP 和 HTTP 的应用程序代理。GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter 和 Tuenti 在内的知名网站,及亚马逊网络服务系统都在使用 HAProxy。git
TiDB Server 做为无限水平扩展的无状态计算节点,须要能提供稳定且高性能的负载均衡组件用对外统一的接口地址来提供服务,而 HAProxy 在负载均衡的生态中占有很大的市场,TiDB 用户能够将这一成熟稳定的开源工具应用在本身的线上业务中,承担负载均衡、高可用的功能。github
HAProxy 由 Linux 内核的核心贡献者 Willy Tarreau 于 2000 年编写,他如今仍然负责该项目的维护,并在开源社区免费提供版本迭代。最新的稳定版本 2.0.0 于 2019 年 8 月 16 日发布,带来更多 优秀的特性。web
高可用性:HAProxy 提供优雅关闭服务和无缝切换的高可用功能;算法
负载均衡:L4(TCP)和 L7(HTTP)负载均衡模式,至少 9 类均衡算法,好比 roundrobin,leastconn,random 等;vim
健康检查:对 HAProxy 配置的 HTTP 或者 TCP 模式状态进行检查;后端
会话保持:在应用程序没有提供会话保持功能的状况下,HAProxy 能够提供该项功能;安全
SSL:支持 HTTPS 通讯和解析;服务器
监控与统计:经过 web 页面能够实时监控服务状态以及具体的流量信息。网络
根据 HAProxy 官方文档 对 HAProxy 的服务器硬件配置有如下建议(也能够根据负载均衡环境进行实际推算,在此基础上提升服务器配置):
硬件资源 | 最低配置 |
---|---|
CPU | 2 核,3.5 GHz |
内存 | 16 GB |
存储容量 | 50 GB(SATA 盘) |
网卡 | 万兆网卡 |
根据官方介绍,咱们对操做系统和依赖包有如下建议(若是是经过 yum 源部署安装 HAProxy 软件,依赖包能够不须要单独安装):
根据官方建议,目前 HAProxy 稳定版本为稳定版 2.0,特性介绍参考 这篇文章。
HAProxy 配置 Database 负载均衡场景操做简单,如下 step by step 操做具备广泛性,不具备特殊性,建议根据实际场景,个性化配置相关的配置文件。
安装 HAProxy:推荐 yum 安装
# yum 安装 HAProxy yum -y install haproxy # 验证 HAProxy 安装是否成功 which haproxy
配置 HAProxy
# yum 安装过程当中会生成配置模版 vim /etc/haproxy/haproxy.cfg
启动 HAProxy
方法一:直接启动
haproxy -f /etc/haproxy/haproxy.cfg
方法二:systemd 启动 HAProxy,默认读取(推荐)
systemctl start haproxy.service
中止 HAProxy
方法一:kill -9
ps -ef | grep haproxy kill -9 haproxy.pid
方法二:systemd 中止 HAProxy(若是使用 systemd 启动)
systemctl stop haproxy.service
经过如下命令查看 HAProxy 的命令列表:
$ haproxy --help Usage : haproxy [-f <cfgfile|cfgdir>]* [ -vdVD ] [ -n <maxconn> ] [ -N <maxpconn> ] [ -p <pidfile> ] [ -m <max megs> ] [ -C <dir> ] [-- <cfgfile>*]
参数 | 描述 |
---|---|
-v | 显示简略的版本信息。 |
-vv | 显示详细的版本信息。 |
-d | debug 模式开启。 |
-db | 仅禁止后台模式 |
-dM [<byte>] | 执行分配内存。 |
-V | 启动过程显示配置和轮询信息。 |
-D | 开启守护进程模式。 |
-C <dir> | 在加载配置文件以前更改目录位置。 |
-W | 主从模式。 |
-q | 静默模式,不输出信息。 |
-c | 只检查配置文件并在尝试绑定以前退出。 |
-n | 设置最大总链接数为 2000。 |
-m | 限制最大可用内存(单位:MB)。 |
-N | 设置单点最大链接数,默认为 2000。 |
-L | 本地实例对等名称。 |
-p | 将 HAProxy 全部子进程的 PID 信息写入该文件。 |
-de | 禁止使用 speculative epoll,epoll 仅在 Linux 2.6 和某些定制的 Linux 2.4 系统上可用。 |
-dp | 禁止使用 epoll,epoll 仅在 Linux 2.6 和某些定制的 Linux 2.4 系统上可用。 |
-dS | 禁止使用 speculative epoll,epoll 仅在 Linux 2.6 和某些定制的 Linux 2.4 系统上可用。 |
-dR | 禁止使用 SO_REUSEPORT。 |
-dr | 忽略服务器地址解析失败。 |
-dV | 禁止在服务器端使用 SSL。 |
-sf/-st <unix_socket> | 在启动后,在 pidlist 中发送 FINISH 信号给 PID。收到此信号的进程将等待全部会话在退出以前完成,即优雅中止服务。此选项必须最后指定,后跟任意数量的 PID,SIGTTOU 和 SIGUSR1 都被发送。 |
-x <unix_socket>,[<bind options>...] | 获取 socket 信息。 |
-S <unix_socket>,[<bind options>...] | 分配新的 socket。 |
global # 全局配置 log 127.0.0.1 local0 # 定义全局的 syslog 服务器,最多能够定义两个 chroot /var/lib/haproxy # 将当前目录为指定目录,设置超级用户权限启动进程,提升安全性 pidfile /var/run/haproxy.pid # 将 HAProxy 进程写入 PID 文件 maxconn 4000 # 设置每一个 HAProxy 进程锁接受的最大并发链接数 user haproxy # 同 uid 参数,使用是用户名 group haproxy # 同 gid 参数,建议专用用户组 nbproc 40 # 启动多个进程来转发请求,须要调整到足够大的值来保证 HAProxy 自己不会成为瓶颈 daemon # 让 HAProxy 以守护进程的方式工做于后台,等同于“-D”选项的功能。固然,也能够在命令行中用“-db”选项将其禁用。 stats socket /var/lib/haproxy/stats # 定义统计信息保存位置 defaults # 默认配置 log global # 日志继承全局配置段的设置 retries 2 # 向上游服务器尝试链接的最大次数,超过此值就认为后端服务器不可用 timeout connect 2s # HAProxy 与后端服务器链接超时时间,若是在同一个局域网内可设置成较短的时间 timeout client 30000s # 定义客户端与 HAProxy 链接后,数据传输完毕,再也不有数据传输,即非活动链接的超时时间 timeout server 30000s # 定义 HAProxy 与上游服务器非活动链接的超时时间 listen admin_stats # frontend 和 backend 的组合体,监控组的名称,按需自定义名称 bind 0.0.0.0:8080 # 配置监听端口 mode http # 配置监控运行的模式,此处为 `http` 模式 option httplog # 表示开始启用记录 HTTP 请求的日志功能 maxconn 10 # 最大并发链接数 stats refresh 30s # 配置每隔 30 秒自动刷新监控页面 stats uri /haproxy # 配置监控页面的 URL stats realm HAProxy # 配置监控页面的提示信息 stats auth admin:pingcap123 # 配置监控页面的用户和密码 admin,能够设置多个用户名 stats hide-version # 配置隐藏统计页面上的 HAProxy 版本信息 stats admin if TRUE # 配置手工启用/禁用,后端服务器(HAProxy-1.4.9 之后版本) listen tidb-cluster # 配置 database 负载均衡 bind 0.0.0.0:3390 # 配置浮动 IP 和 监听端口 mode tcp # HAProxy 中要使用第四层的应用层 balance leastconn # 链接数最少的服务器优先接收链接。`leastconn` 建议用于长会话服务,例如 LDAP、SQL、TSE 等,而不是短会话协议,如 HTTP。该算法是动态的,对于实例启动慢的服务器,权重会在运行中做调整。 server tidb-1 10.9.18.229:4000 check inter 2000 rise 2 fall 3 # 检测 4000 端口,检测频率为 2000 毫秒。若是检测出 2 次正常就认定机器已恢复正常使用,若是检测出 3 次失败便认定该服务器不可用。 server tidb-2 10.9.39.208:4000 check inter 2000 rise 2 fall 3 server tidb-3 10.9.64.166:4000 check inter 2000 rise 2 fall 3
本文介绍了在 TiDB 下使用 HAProxy 的最佳实践,全文对于 HAProxy 的基本使用方法进行较为详细的介绍,这里惟一遗憾的是没有将 HAProxy 的高可用架构和方案加以文字描述,你们在线上使用中能够经过 Linux 的 Keepalived 来实现主备配置,实现 HAProxy 的高可用;在按照该文档搭建 HAProxy 时候,必定要结合本身的具体业务需求和场景,适当调整参数,为业务的负载均衡和可用性提供最佳的保障方案。
最后也但愿活跃在 TiDB 社区的小伙伴能够踊跃分享最佳实践经验,你们能够在 TiDB User Group 问答论坛交流讨论使用技巧(https://asktug.com/)。
原文阅读:https://pingcap.com/blog-cn/best-practice-haproxy/