記事のディレクトリ
前書き
- Haproxyは、人気のあるクラスタースケジューリングツールです。LVSやNginxなど、同様のクラスタースケジューリングツールが多数あります。比較すると、LVSのパフォーマンスは最高ですが、構築は比較的複雑です。Nginxのアップストリームモジュールはクラスター機能をサポートしていますが、クラスターノードのヘルスチェック機能は強力ではなく、パフォーマンスはHaproxyほど良くありません。
- Haproxyの公式ウェブサイトはhttp://haproxy.1wt.eu/です。
1.一般的なWebクラスタースケジューラ
- 現在の一般的なWebクラスタースケジューラは、ソフトウェアとハードウェアに分かれています。
- ソフトウェアは通常、オープンソースのLVS、Haproxy、Nginxを使用します。
- ハードウェアは一般的に使用されており、F5にはバラクーダやNSFOCUSなどの国内製品を使用している人もたくさんいます。
2.Haproxyアプリケーション分析
LVSは、エンタープライズアプリケーションで強力なアンチロード機能を備えていますが、欠点があります。
- LVSは通常の処理をサポートしておらず、動的および静的な分離を実現できません。
- 大規模なWebサイトの場合、LVSの実装と構成は複雑であり、メンテナンスコストは比較的高くなります。
Haproxyは、TCPおよびHTTPアプリケーションに基づいて、高可用性、負荷分散、およびプロキシを提供するソフトウェアです。
- 負荷の高いWebサイトに適しています。
- ハードウェアで実行すると、何万もの同時接続要求をサポートできます。
3.Haproxyスケジューリングアルゴリズムの原則
Haproxyはさまざまなスケジューリングアルゴリズムをサポートしており、最も一般的に使用されるものは3つあります。
RR(ラウンドロビン)、LC(最小接続)、SH(ソースハッシュ)
3.1RRスケジューリングアルゴリズムの概要
- RRアルゴリズムは、最も単純で最も一般的に使用されるアルゴリズム、つまりラウンドロビンスケジューリングです。
- 理解例:3つのノードA、B、Cがあります。
最初のユーザーアクセスはノードAに割り当てられます
。2番目のユーザーアクセスはノードBに割り当てられます
。3番目のユーザーアクセスはノードCに割り当てられます。4
番目のユーザーアクセスノードAに割り当てられ、負荷分散効果を実現するためにアクセス要求をポーリングおよび割り当てます。
3.2LCスケジューリングアルゴリズムの導入
-
最小接続数アルゴリズムは、バックエンドノード接続の数に応じてフロントエンド要求を動的に割り当てます
-
理解例:ノードA、B、Cが3つあり、各ノードの接続数はA:4、B:5、C:6です。
(1)最初のユーザー接続要求はAに割り当てられ、接続数が変化しますA:5、B:5、C:6です
(2)2番目のユーザーリクエストは引き続きAに割り当てられ、接続数はA:6、B:5、C:6になります、および新しい要求が割り当てられますBの場合、接続数が最も少ないクライアントに新しい要求が割り当てられるたびに
(3)A、B、およびCの接続数は実際の条件下で動的に解放されるため、同じ数の接続を持つことは困難です -
rrアルゴリズムと比較して、このアルゴリズムは大幅に改善されており、現在より多く使用されているアルゴリズムです。
3.3SHスケジューリングアルゴリズムの概要
- ソースアクセススケジューリングアルゴリズムに基づいて、セッションセッションがサーバー側で記録されるいくつかのシナリオで使用されます。クラスタースケジューリングは、ソースIP、Cookieなどに基づいて実行できます。
- 理解の例:
(1)3つのノードA、B、およびCがあります。最初のユーザーは最初の訪問でAに割り当てられ、2番目のユーザーは最初の訪問でBに割り当てられます。
(2)最初のユーザーが訪問は初めて二の訪問の間に、それはAに割り当てられていきます、と2番目のユーザーがまだ第二の訪問中にBに割り当てられます。スケジューラの負荷分散が最初のユーザーのアクセスが可能になる、再起動しない限り、 Aに割り当てられ、2番目のユーザーAccessがBに割り当てられて、クラスターのスケジューリングを実現します。 - このスケジューリングアルゴリズムの利点は、セッションの保持を実現することですが、一部のIP訪問が非常に大きい場合、負荷が不均衡になり、一部のノードで過剰な訪問が発生し、ビジネスでの使用に影響します。
4.Haproxyのインストールと起動
ロードバランサーにHaproxyをインストールします
- インストール手順:基本的なソフトウェアパッケージをインストールし、haproxyをコンパイルしてインストールし、32ビットシステムか64ビットシステムかに関係なく、オペレーティングシステムのバージョンに注意します。
Haproxy構成ファイルを作成する
- 構成ファイルディレクトリ/ etc / haproxyを作成します
- ソースパッケージで提供されているサンプル構成ファイルhaproxy.cfgを構成ファイルディレクトリにコピーします
4.1Haproxy設定ファイルの詳細な説明
Haproxy構成ファイルは通常3つの部分に分かれています
- グローバル:グローバル構成
- デフォルト:デフォルト構成
- リッスン:アプリケーションコンポーネントの構成
グローバル構成パラメーター
- 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ファイルを確認します
- オプションpersist:ダウンしているサーバーにリクエストを強制的に送信します
- バランスラウンドロビン:負荷分散スケジューリングアルゴリズムはラウンドロビンアルゴリズムを使用します
- server inst1 192.168.114.56:80チェックインター2000秋3:オンラインノードを定義する
- server inst2 192.168 114.56:81 2000年秋3バックアップ間チェック:バックアップノードを定義します
4.2ログレベル
- 0(EMERG、緊急)
- 1(アラート、警告)
- 2(CRIT、深刻)
- 3(ERR、エラー)
- 4(警告、リマインダー)
- 5(注意、注意)
- 6(情報、情報)
- 7(DEBUG、デバッグ)
5.Haproxyクラスター構成
5.1プロジェクト環境
(1)1つのHaproxyサーバー
- IPアドレス:192.168.70.10
(2)2つのnginxサーバー
- IPアドレス:192.168.70.11(web1)
- IPアドレス:192.168.70.12(web2)
(3)1つのNFS共有サーバー
- IPアドレス:192.168.70.13
(4)テストおよび検証用の1台のクライアントコンピューター
- IPアドレス:192.168.70.14
注:同じネットワークセグメントが相互に通信できることを確認する必要があります
5.2実験の目的
- クライアントはhaproxyサーバーアドレス192.168.70.10にアクセスし、ポーリングで2つのnginxホストのWebページにアクセスできます。それが高性能および高可用性クラスターの特性を満たしているかどうかをテストします。
- nfsネットワークファイルストレージサービスを構築します。
5.3Nginxのインストールと起動
2つのWebサーバーにNginxをインストールし、サービスを開始します
- ソースコードのコンパイルを使用してインストールする
- ファイアウォールをオフにする
- 基本パッケージをインストールします
- システムユーザーアカウントnginxを増やします
- Nginxをコンパイルしてインストールし、開始します
2つのNginxでテストWebサイトを構成します。テストページのコンテンツは、テスト用に異なる必要があります
5.4プロジェクトのステップ
5.4.1NFSストレージサーバーの構成
[root@nfs ~]# rpm -qa | grep rpcbind //默认虚拟机已安装rpcbind模块
rpcbind-0.2.0-42.el7.x86_64
[root@nfs ~]# yum -y install nfs-utils //确认是否安装nfs-utils软件包
已加载插件:fastestmirror, langpacks
base | 3.6 kB 00:00
Loading mirror speeds from cached hostfile
* base:
软件包 1:nfs-utils-1.3.0-0.48.el7.x86_64 已安装并且是最新版本
无须任何处理
[root@nfs ~]# mkdir /opt/web1
[root@nfs ~]# mkdir /opt/web2
[root@nfs ~]# echo "<h1>this is server1.</h1>" > /opt/web1/index.html
[root@nfs ~]# echo "<h1>this is server2.</h1>" > /opt/web2/index.html
[root@nfs ~]# vi /etc/exports
/opt/web1 192.168.70.11/32 (ro)
/opt/web2 192.168.70.12/32 (ro)
[root@nfs ~]# systemctl restart nfs
[root@nfs ~]# systemctl restart rpcbind
[root@nfs ~]# showmount -e
Export list for nfs:
/opt/web2 (everyone)
/opt/web1 (everyone)
5.4.2nginxサーバーを構成する
パッケージのインポート
- 2つのnginxサーバーでの同じ構成は次のとおりです
[root@web ~]# useradd -M -s /sbin/nologin nginx
[root@web ~]# tar zxvf nginx-1.12.2.tar.gz
[root@web ~]# cd nginx-1.12.2/
[root@web nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@web nginx-1.12.2]# make && make install
[root@web nginx-1.12.2]# cd
[root@web ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
[root@web ~]# cd /usr/local/nginx/html/
[root@web html]# ls -lh
总用量 8.0K
-rw-r--r--. 1 root root 537 12月 11 00:05 50x.html
-rw-r--r--. 1 root root 612 12月 11 00:05 index.html
- web1での構成
[root@web1 html]# mount 192.168.70.13:/opt/web1 /usr/local/nginx/html/
[root@web1 html]# df -Th
[root@web1 html]# cd
[root@web1 ~]# nginx
[root@web1 ~]# curl http://localhost
<h1>this is server1.</h1>
- web2での構成
[root@web2 html]# mount 192.168.70.13:/opt/web2 /usr/local/nginx/html/
[root@web2 html]# df -Th
[root@web2 html]# cd
[root@web2 ~]# nginx
[root@web2 ~]# curl http://localhost
<h1>this is server2.</h1>
5.4.3haproxyスケジューラを設定する
パッケージのインポート
[root@haproxy ~]# yum -y install gcc gcc-c++ make pcre-devel bzip2-devel
[root@haproxy ~]# tar zxvf haproxy-1.4.24.tar.gz
[root@haproxy ~]# mkdir /etc/haproxy
[root@haproxy ~]# cd haproxy-1.4.24/
[root@haproxy haproxy-1.4.24]# make TARGET=linux26
[root@haproxy haproxy-1.4.24]# make install
[root@haproxy haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy
[root@haproxy haproxy-1.4.24]# vi /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log 127.0.0.1 local0 //日志输出配置
log 127.0.0.1 local1 notice //notice为日志级别
#log loghost local0 info
maxconn 4096
chroot /usr/share/haproxy
uid 99 //用户uid
gid 99 //用户gid
daemon
#debug
#quiet
defaults
log global //定义日志为global配置中的日志定义
mode http //模式为http
option httplog //采用http日志格式记录日志
option dontlognull
retries 3 //检查节点服务器失败次数,连续达到三次失败,则节点不可用
#redispatch //请求继续发个DOWN的节点
maxconn 10240 //最大连接数
contimeout 5000 //连接超时时间
clitimeout 50000 //客户端超时时间
srvtimeout 50000 //服务器超时时间
listen webcluster 0.0.0.0:80
option httpchk GET /index.html //检查服务器的文件
balance roundrobin
server web1 192.168.70.11:80 check inter 2000 fall 3
server web2 192.168.70.12:80 check inter 2000 fall 3
[root@haproxy haproxy-1.4.24]# cp examples/haproxy.init /etc/init.d/haproxy
[root@haproxy haproxy-1.4.24]# vi /etc/init.d/haproxy
#!/bin/sh
#
# chkconfig: 35 85 15 //将"-"改为35
...
[root@haproxy haproxy-1.4.24]# chmod 755 /etc/init.d/haproxy
[root@haproxy haproxy-1.4.24]# chkconfig --add haproxy
[root@haproxy haproxy-1.4.24]# chkconfig --list
注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。
要列出 systemd 服务,请执行 'systemctl list-unit-files'。
查看在具体 target 启用的服务请执行
'systemctl list-dependencies [target]'。
haproxy 0:关 1:关 2:关 3:开 4:关 5:开 6:关
netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关
network 0:关 1:关 2:开 3:开 4:开 5:开 6:关
[root@haproxy haproxy-1.4.24]# cd
[root@haproxy ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/
[root@haproxy ~]# systemctl enable haproxy
[root@haproxy ~]# systemctl start haproxy
5.5Webクラスターのテスト
- クライアントで確認する
注意:若在启动haproxy服务时,出现 Cannot chroot(/usr/share/haproxy) 失败,只需要写入以下命令即可
mkdir -p /usr/share/haproxy
5.6ログ定義
- ロギングを構成し、スクリプトを追加します
[root@haproxy ~]# vi /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log /dev/log local0 info
log /dev/log local0 notice
...
[root@haproxy ~]# systemctl restart haproxy
[root@haproxy ~]# touch /etc/rsyslog.d/haproxy.conf
[root@haproxy ~]# vi /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~ //当程序名匹配到haproxy 和 日志级别是info时,输出到/var/log/haproxy/haproxy-info.log里
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~ //当程序名匹配到haproxy 和 日志级别是notice时,输出到/var/log/haproxy/haproxy-notice.log里
[root@haproxy ~]# systemctl restart rsyslog //重启系统日志
[root@haproxy ~]# systemctl restart haproxy //重启服务才能有日志文件
[root@haproxy ~]# cat /var/log/haproxy/haproxy-info.log //查看haproxy调度信息
[root@haproxy ~]# cat /var/log/haproxy/haproxy-notice.log //查看haproxy启动信息
6.Haproxyパラメータの最適化
- 企業のWebサイトの負荷が増加するにつれて、haproxyパラメータの最適化は非常に重要です
1)maxconn:最大连接数,根据应用实际情况进行调整,推荐使用10 240
2)daemon:守护进程模式, Haproxy可以使用非守护进程模式启动,建议使用守护进程模式启动
3)nbproc:负载均衡的并发进程数,建议与当前服务器CPU核数相等或为其2倍
4)retries:重试次数,主要用于对集群节点的检查,如果节点多,且并发量大,设置为2次或3次
5)option http-server-close:主动关闭http请求选项,建议在生产环境中使用此选项
6)timeout http-keep-alive:长连接超时时间,设置长连接超时时间,可以设置为10s
7)timeout http-request:http请求超时时间,建议将此时间设置为5~10s,增加http连接释放速度
8)timeout client:客户端超时时间,如果访问量过大,节点响应慢,可以将此时间设置短一些,建议设置为1min左右就可以了