HaproxyはWebクラスターを構築します(スケジューリングアルゴリズム、クラスター構成、ログ管理、パラメーター最適化)
1つ:一般的なWebクラスタースケジューラー
- 現在の一般的なWebクラスタースケジューラは、ソフトウェアとハードウェアに分かれています
- ソフトウェアは通常、オープンソースのLVS、Haproxy、Nginxを使用します
- 最も一般的に使用されるハードウェアはF5であり、多くの人々はバラクーダ、NSFOCUSなどの一部の国産製品を使用しています。
2:Haproxyアプリケーション分析
- LVSはエンタープライズアプリケーションのリハビリが非常に可能ですが、欠点があります
- LVSは通常の処理をサポートせず、動的分離と静的分離を実現できません
- 大規模なWebサイトの場合、LVSの実装と構成は複雑であり、保守コストは比較的高くなります
- Haproxyは、TCP(4層)およびHTTP(7層)アプリケーションに高可用性、ロードバランシング、およびプロキシソフトウェアを提供するソフトウェアです。
- 高負荷のWebサイトに適しています
- ハードウェアで実行すると、数万の同時接続要求をサポートできます
3:Haproxyスケジューリングアルゴリズムの原則
- Haproxyはさまざまなスケジューリングアルゴリズムをサポートし、最も一般的に使用される3つがあります:RR(ラウンドロビン)、LC(最小接続)、SH(ソースハッシュ)
3.1:RR(ラウンドロビン)
- RRアルゴリズムは、最も単純で最も一般的に使用されるアルゴリズム、つまりラウンドロビンスケジューリングです。
- 例を理解する
- 3つのノードA、B、Cがあります。
- 最初のユーザーアクセスはノードAに割り当てられます
- 2番目のユーザーアクセスはノードBに割り当てられます
- 3番目のユーザーアクセスはノードCに割り当てられます
- 4番目のユーザーアクセスは引き続きノードAに割り当てられ、負荷分散効果を得るためにアクセス要求をポーリングして割り当てます
3.2:LC(最小接続)
- LCアルゴリズムは最小接続アルゴリズムであり、バックエンドノード接続の数に応じてフロントエンド要求を動的に割り当てます
- 例を理解する
- A、B、Cの3つのノードがあり、各ノードの接続数はA:4、B:5、C:6です。このとき、最初のユーザー接続要求があると、Aに割り当てられ、接続数はA:5、B:5、C:6
- 2番目のユーザー要求は引き続きAに割り当てられ、接続数はA6、B:5、C:6になります。新しい要求はBに割り当てられ、新しい要求はそれぞれ、接続数が最小のクライアントに割り当てられます
- A、B、Cの接続数は実際の条件下では動的に解放されるため、同じ接続数にすることは困難です。このため、このアルゴリズムはrrアルゴリズムと比較して大幅に改善されています。現在、より多く使用されているアルゴリズムです。
3.3:SH(ソースハッシュ)
- SHはソースアクセススケジューリングアルゴリズムに基づいています。このアルゴリズムは、セッションセッションがサーバー側で記録されるいくつかのシナリオで使用されます。クラスターのスケジューリングは、ソースIP、Cookieなどに基づいて実行できます。
- 例を理解する
- 3つのノードA、B、Cがあります。最初のユーザーは最初の訪問のAに割り当てられ、2番目のユーザーは最初の訪問のBに割り当てられます。
- 最初のユーザーが2回目にアクセスした場合、2番目のユーザーは引き続きAに割り当てられ、2番目のユーザーはBに引き続き割り当てられます。負荷分散スケジューラが再起動しない限り、最初のユーザーのアクセスが割り当てられますA、2番目のユーザーアクセスはBに割り当てられ、クラスターのスケジューリングを実現します
- このスケジューリングアルゴリズムの利点は、セッションの保持を実現することですが、一部のIPアクセスが非常に大きい場合は、負荷が不均衡になり、一部のノードには過度のアクセスがあり、ビジネスの使用に影響します
4:HaproxyがWebクラスターを構築する
4.1:環境の準備
- VMwareソフトウェア
- NGINXとしての2つのcentos7仮想マシン(IPアドレス:20.0.0.52と他のIPアドレス:20.0.0.47)
- Haproxyとしてのcentos7仮想マシン(IPアドレス:20.0.0.51)
4.2:実験手順
- 2つのWebサーバーにNginxをインストールする
[root@web1 ~]# yum install -y \
pcre-devel \
zlib-devel \
gcc \
gcc-c++ \
make
[root@web1 ~]# useradd -M -s /sbin/nologin nginx
[root@web1 ~]# tar zxvf nginx-1.12.0.tar.gz '解压NGINX源码包'
[root@web1 ~]# cd nginx-1.12.0/
[root@web1 nginx-1.12.2]# ./configure \ 'configure 配置'
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx
[root@web1 nginx-1.12.2]# make && make install '编译安装'
[root@web1 nginx-1.12.2]# cd /usr/local/nginx/html
[root@web1 html]# echo "this is kevin web" > test.html '创建站点首页'
[root@web1 html]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin '创建nginx命令软连接'
[root@web1 html]# nginx -t
[root@web1 html]# nginx '开启nginx'
[root@web1 html]# netstat -ntap |grep nginx
'第二台节点采用相同方法设置,其中站点首页需要更改,内容为this is benet web'
4.3:Haproxyのインストールと起動
- ロードバランサーにHaproxyをインストールする
- インストール手順
- 基本パッケージをインストールする
- haproxyをコンパイルしてインストールする
- オペレーティングシステムのバージョンに注意してください(32ビットシステムでも64ビットシステムでも)。
- Haproxy構成ファイルを作成する
- 構成ファイルのディレクトリー/ etc / haproxyを作成します
- ソースパッケージによって提供されるサンプル構成ファイルhaproxy.cfgを構成ファイルディレクトリにコピーします。
[root@localhost ~]# yum install -y \
pcre-devel \
bzip2-devel \
gcc \
gcc-c++ \
make
[root@localhost ~]# tar zxvf haproxy-1.5.19.tar.gz
[root@localhost ~]# cd haproxy-1.5.19/
[root@localhost haproxy-1.5.19]# make TARGET=linux26
[root@localhost haproxy-1.5.19]# make install
[root@localhost haproxy-1.5.19]# mkdir /etc/haproxy
[root@localhost haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/
[root@localhost haproxy-1.5.19]# cd /etc/haproxy
[root@localhost haproxy]# vim haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
# chroot /usr/share/haproxy '固有目录,可注释掉'
uid 99
gid 99
daemon
#debug
#quiet
defaults
log global
mode http
option httplog
option dontlognull
retries 3
# redispatch '注释'
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
'删除原本listen内容,添加以下内容'
listen webcluster 0.0.0.0:80
option httpchk GET /test.html '监听检查服务器的index.html文件(节点服务器的主页)'
balance roundrobin '负载均衡调度算法使用轮询算法'
server inst1 20.0.0.52:80 check inter 2000 fall 3 '定义在线节点'
server inst2 20.0.0.47:80 check inter 2000 fall 3
[root@localhost haproxy]# cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy '复制创建启动脚本'
[root@localhost haproxy]# cd /etc/init.d/
[root@localhost init.d]# chmod +x haproxy '添加启动脚本权限'
[root@localhost init.d]# chkconfig --add /etc/init.d/haproxy '为service添加启动脚本'
[root@localhost init.d]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy '创建命令软连接'
[root@localhost init.d]# service haproxy start
[root@localhost init.d]# iptables -F
[root@localhost init.d]# setenforce 0
4.4:Haproxy設定ファイルの詳細説明
- Haproxy構成ファイルは通常3つの部分に分かれています
- global:グローバル構成
- デフォルト:デフォルト構成
- listen:アプリケーションコンポーネントの構成
- グローバル構成パラメーター
- log127.0.0.1 lcal0:ロギングを設定します。local0はログデバイスであり、デフォルトでシステムログに保存されます
- log127.0.0.1 loca1通知:通知はログレベルであり、通常は24レベルあります
- maxconn4096:最大接続数
- uid 99:ユーザーuid
- gid 99:ユーザーgid
- デフォルトの構成アイテムは、デフォルトのパラメーターを構成します。これは通常、アプリケーションコンポーネントによって継承されます。アプリケーションコンポーネントに特別なステートメントがない場合、デフォルトの構成パラメーター設定がインストールされます
- log global:グローバル構成でログ定義としてログを定義します
- モードhttp:モードはhttpです
- オプションhttplog:httpログ形式でログを記録
- 再試行3:ノードサーバーに3回連続して障害が発生し、ノードが使用不可と見なされることを確認します
- maxconn2000:接続の最大数
- contimeout5000:接続タイムアウト期間
- clitimeout50000:クライアントのタイムアウト時間
- srvtimeout50000:サーバーのタイムアウト時間
- リッスン構成項目は、通常、アプリケーションモジュールパラメータを構成します
- リッスンappli4-バックアップ0.0.0.0:10004:appli4-バックアップアプリケーションを定義します
- オプションhttpchk /index.htmlサーバーのindex.htmlファイルを確認します
- オプションの持続:要求を強制的に停止したサーバーに送信します
- ラウンドロビンのバランス:負荷分散スケジューリングアルゴリズムはラウンドロビンアルゴリズムを使用します
- server inst1 20.0.0.52:80 2000年秋のチェック3:オンラインノードの定義
- server inst2 20.0.0.47:81 2000秋3のバックアップをチェック:バックアップノードを定義
4.5:構成とテスト
Haproxyクラスターのテスト
- 高性能をテストする
- 2つのテストWebサイトは2つの異なるブラウザーでアクセスでき、2つのWebサイトのテストページは通常の状況で表示されます。
- リフレッシュ
- 高可用性
- Nginxサーバーの1つを無効にし、クライアントブラウザーでHaproxyにアクセスします。通常の状況では、他のNginxサーバーのWebサイトテストページが表示されます。
5:Haproxyログ管理
- Haproxyのログは、デフォルトでシステムのsyslogに出力されます。これは通常、実稼働環境で個別に定義されます
- 定義された方法ステップ
- Haproxy構成ファイルのログ構成オプションを変更し、構成を追加します。
- ログ/ dev / log local0情報
- ログ/ dev / log local0通知
- rsyslog構成を変更して、Haproxy関連の構成を独立して定義します。
- haproxy.confを/etc/rsyslog.d/に配置します
- 構成ファイルを保存し、rsyslogサービスを再起動して、rsyslog構成を完了します。
- Haproxy構成ファイルのログ構成オプションを変更し、構成を追加します。
[root@localhost haproxy]# vim /etc/haproxy/haproxy.cfg '编辑haproxy配置文件'
'在global下,将127.0.0.1修改为/dev/log'
log /dev/log local0 info
log /dev/log local1 notice
[root@localhost haproxy]# service haproxy restart '重启haproxy服务'
[root@localhost haproxy]# touch /etc/rsyslog.d/haproxy.conf '创建一个新haproxy配置文件'
[root@localhost haproxy]# vim /etc/rsyslog.d/haproxy.conf '编写haproxy配置文件脚本'
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
[root@localhost haproxy]# systemctl restart rsyslog.service '重启日志服务'
- HaproxyクラスターテストWebページにアクセスしてログ情報をテストする
'未访问网页,查看/var/log'
[root@haproxy dev]# cd /var/log
[root@haproxy log]# ls
'发现没有haproxy文件生成'
'查看网页之后,再次查看/var/log'
'发现已经生成haproxy文件了,可以进去查看'
[root@localhost haproxy]# cd /var/log/haproxy/
[root@localhost haproxy]# ls
haproxy-info.log haproxy-notice.log
5.1:Haproxyによって最適化できるパラメーターの詳細な説明
- 企業のWebサイトへの負荷が増加するにつれて、haproxyパラメータの最適化は非常に重要です
- maxconn:アプリケーションの実際の状況に応じて調整された最大接続数、10 240を推奨
- デーモン:デーモンプロセスモード、Haproxyは非デーモンプロセスモードで開始できます。デーモンプロセスモードで開始することをお勧めします
- nbproc:負荷分散のための同時プロセスの数現在のサーバーのCPUコアの数と同じか2倍にすることをお勧めします
- 再試行:主にクラスターノードをチェックするために使用される再試行の回数。ノードが多く、同時実行の量が多い場合は、2または3回に設定します。
- オプションhttp-server-close:httpリクエストオプションをアクティブに閉じます。本番環境ではこのオプションを使用することをお勧めします
- timeout http-keep-alive:長い接続タイムアウト時間。長い接続タイムアウト時間を設定します。これは10秒に設定できます。
- timeout http-request:httpリクエストのタイムアウト時間。この時間を5〜10秒に設定し、http接続の解放速度を上げて、
PUコアの数をそれと同じか2倍にすることをお勧めします。 - タイムアウトクライアント:クライアントタイムアウト時間トラフィックが大きすぎてノードの応答が遅い場合は、この時間を短く設定できます。約1分に設定することをお勧めします。