TiDB 最佳實踐系列(六)HAProxy 的使用

做者:李仲舒html

HAProxy 是一個使用 C 語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基於 TCP 和 HTTP 的應用程序代理。GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter 和 Tuenti 在內的知名網站,及亞馬遜網絡服務系統都在使用 HAProxy。git

TiDB Server 做爲無限水平擴展的無狀態計算節點,須要能提供穩定且高性能的負載均衡組件用對外統一的接口地址來提供服務,而 HAProxy 在負載均衡的生態中佔有很大的市場,TiDB 用戶能夠將這一成熟穩定的開源工具應用在本身的線上業務中,承擔負載均衡、高可用的功能。github

圖 1 部署架構

HAProxy 簡介

HAProxy 由 Linux 內核的核心貢獻者 Willy Tarreau 於 2000 年編寫,他如今仍然負責該項目的維護,並在開源社區免費提供版本迭代。最新的穩定版本 2.0.0 於 2019 年 8 月 16 日發佈,帶來更多 優秀的特性web

HAProxy 部分核心功能

  • 高可用性:HAProxy 提供優雅關閉服務和無縫切換的高可用功能;算法

  • 負載均衡:L4(TCP)和 L7(HTTP)負載均衡模式,至少 9 類均衡算法,好比 roundrobin,leastconn,random 等;vim

  • 健康檢查:對 HAProxy 配置的 HTTP 或者 TCP 模式狀態進行檢查;後端

  • 會話保持:在應用程序沒有提供會話保持功能的狀況下,HAProxy 能夠提供該項功能;安全

  • SSL:支持 HTTPS 通訊和解析;服務器

  • 監控與統計:經過 web 頁面能夠實時監控服務狀態以及具體的流量信息。網絡

HAProxy 部署操做

1. 硬件要求

根據 HAProxy 官方文檔 對 HAProxy 的服務器硬件配置有如下建議(也能夠根據負載均衡環境進行實際推算,在此基礎上提升服務器配置):

硬件資源 最低配置
CPU 2 核,3.5 GHz
內存 16 GB
存儲容量 50 GB(SATA 盤)
網卡 萬兆網卡

2. 軟件要求

根據官方介紹,咱們對操做系統和依賴包有如下建議(若是是經過 yum 源部署安裝 HAProxy 軟件,依賴包能夠不須要單獨安裝):

操做系統

  • Linux 2.4 操做系統,支持 x8六、x86_6四、Alpha、SPARC、MIPS 和 PA-RISC 架構。
  • Linux 2.6 或 3.x 操做系統,支持 x8六、x86_6四、ARM、SPARC 和 PPC64 架構。
  • Solaris 8 或 9 操做系統,支持 UltraSPARC II 和 UltraSPARC III 架構。
  • Solaris 10 操做系統,支持 Opteron 和 UltraSPARC 架構。
  • FreeBSD 4.10~10 操做系統,支持 x86 架構。
  • OpenBSD 3.1 及以上版本操做系統,支持 i38六、AMD6四、macppc、Alpha 和 SPARC64 架構。
  • AIX 5.1~5.3 操做系統,支持 Power™ 架構。

依賴包

  • epel-release
  • gcc
  • systemd-devel

3. 推薦版本

根據官方建議,目前 HAProxy 穩定版本爲穩定版 2.0,特性介紹參考 這篇文章

4.操做步驟

HAProxy 配置 Database 負載均衡場景操做簡單,如下 step by step 操做具備廣泛性,不具備特殊性,建議根據實際場景,個性化配置相關的配置文件。

  1. 安裝 HAProxy:推薦 yum 安裝

    # yum 安裝 HAProxy
    	yum -y install haproxy
    	# 驗證 HAProxy 安裝是否成功
    	which haproxy
  2. 配置 HAProxy

    # yum 安裝過程當中會生成配置模版
    vim /etc/haproxy/haproxy.cfg
  3. 啓動 HAProxy

    方法一:直接啓動

    haproxy -f /etc/haproxy/haproxy.cfg

    方法二:systemd 啓動 HAProxy,默認讀取(推薦)

    systemctl start haproxy.service
  4. 中止 HAProxy

    方法一:kill -9

    ps -ef | grep haproxy 
    kill -9 haproxy.pid

    方法二:systemd 中止 HAProxy(若是使用 systemd 啓動)

    systemctl stop haproxy.service

HAProxy 命令介紹

經過如下命令查看 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。

HAProxy 最佳實踐

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/

相關文章
相關標籤/搜索