地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【HAProxy】入門する

f:id:ryuichi1208:20210720195534p:plain

背景

HAProxyに触れる機会が出てきそうなので調べたメモ的な記事。業務で使ってたことはあるけど実は要件書通りのパラメータで構築してそれっぽいテストしただけで実はどんな機能があってどのような特徴があるとかは何も分かってないレベル。要件定義とかも見てすらないので何もわからなんので復習も兼ねて書いた。

(ちなみによくわからないけど2年くらい運用してトラブル起きたこと1回くらいしかないからソフトウェア的にはすごく安定してそう(小並感))

HAProxyとは

多機能なプロキシサーバです。ソフトウェアロードバランサの一種。(L4だけかと思ってたけど全然違うらしいというのを初めて知った。)高パフォーマンスと安定性のあるTCP通信やHTTP通信の負荷分散や、Proxyサーバ機能が有名。C言語で実装されている。比較対象ってなるとLVSとかNginxのplus版とかになるんでしょうか。

github.com

haproxy + keepalived で構成することにより、冗長化構成のロードバランサーとして機能する。最新版は2021年5月14日:HAProxy2.4.0とのことで最近でも開発が続いているのが伺える。

HAProxyの機能

ja.wikipedia.org

↑あたりから抜粋。単純な負荷分散だけでなくSSLの終端やらgRPCサポートとかサーキットブレーカの役目もこなすらしい。

* Layer 4(TCP)およびLayer 7(HTTP)でのロードバランス
* URLのrewrite
* レート制限
* SSL/TLS termination
* Gzip圧縮
* Proxy Protocolのサポート
* ヘルスチェック
* コネクションとHTTPメッセージのログ
* HTTP/2
* Hitless Reloads
* gRPCのサポート
* LuaおよびSPOEのサポート
* APIのサポート
* Layer 4でのリトライ
* 簡易的なサーキットブレーカー

MySQLとかRedisの手前においてL4のリトライをここでやってもらうみたいなのもありなのかなーとか考えたりしました。オンプレでやるならDBへの接続過多とかで過負荷になるみたいなのを防ぐとかもありなのかなぁと。

スケジューリングアルゴリズム

対応しているのは下記。/etc/haproxy/haproxy.cfg辺りのファイルのbackend セクションにある balance パラメーターで編集できるとのこと。RDP Cookieだけ不思議な機能でTCPレイヤでも動作しそうな感じだけどどういう仕組みなのかはよくわからなかった。

* Round-Robin
* 静的ラウンドロビン
* 最小接続 
* ソース
* URI
* URL パラメーター
* ヘッダー名
* RDP Cookie

詳しい設定例は以下に載っていた。server_timeoutとかmaxconとかの数値はチューニング可能な数値となっている。

access.redhat.com

docs.aws.amazon.com

configファイル自体はこんな感じで書いていく

HAProxy全体に関連する設定を記述する
global
  <設定項目1> <設定値1>
  <設定項目2> <設定値2>

各セクションにおけるパラメータのデフォルト値を記述する
defaults
  <設定項目1> <設定値1>
  <設定項目2> <設定値2>

プロクシの動作に関連する設定
<listen/frontend/backendセクション1> <名前>
  <設定項目1> <設定値1>
  <設定項目2> <設定値2>

イベント駆動型モデルの話

HAProxyでもNginxとかNode.jsで使われているようなイベント駆動型のモデルで作られているらしい。preforkとかでやるとどうしてもc10k問題とかが絡んでくるためだと思われる。マルチスレッドを使用したCPUのコアを活かした上げ方も可能らしい。

www.haproxy.com

性能の話だと最近書かれている記事で2 Million HTTP Requests per Secondとか言っている。桁が違いすぎてよくわからない。言及している内容がL2キャッシュとかL3キャッシュとかCPUとかの低レイヤの話であったりIRQアフィニティが出てきたりと知見が全然ないのでなんかすごいしかわからない。

www.haproxy.com

イベント駆動あたりはソースを眺める限りはシステムコール呼び出ししている感じだったのでエンジンごと独自実装になっていそう。

github.com