ホームページ  >  記事  >  運用・保守  >  Apache で負荷分散を構成する方法

Apache で負荷分散を構成する方法

步履不停
步履不停転載
2019-06-29 10:39:5111652ブラウズ

負荷分散とは何ですか? Apacheで負荷分散を設定するにはどうすればよいですか? Apacheの負荷分散設定方法については以下の記事で紹介していますので、ご参考になれば幸いです。

Apache で負荷分散を構成する方法

#負荷分散とは

負荷分散 (負荷分散) は、分散システム アーキテクチャの一部です。設計 考慮する必要がある要素の 1 つは、通常、

実行のために複数のオペレーティング ユニットにリクエスト/データを [均等に] 割り当てることを指します。負荷分散の鍵は、[均等に] です。

#一般的な負荷分散ソリューション


##一般的なインターネット分散アーキテクチャは上記のとおりで、次のように分かれています。

クライアント層、リバースプロキシnginx層、サイト層、サービス層、データ層

。各ダウンストリームには複数のアップストリーム呼び出しがあることがわかりますが、各アップストリームが各ダウンストリームに均等にアクセスする限り、「リクエスト/データを複数の演算ユニットに均等に分散して実行する」ことが実現できます。

[クライアント層 -> リバースプロキシ層]の負荷分散


[クライアント層]への負荷分散[リバース プロキシ レイヤー] は、「

DNS ポーリング

」によって実現されます。DNS サーバーは ドメイン名に対して複数の解決 IP で構成されており、各 DNS 解決リクエストにアクセスします。DNS サーバーはポーリングし、これらの ip を返して、各 IP の解決確率が同じであることを確認します。これらの IP は nginx の外部ネットワーク IP であるため、各 nginx のリクエスト分散もバランスがとれます。

[リバース プロキシ レイヤー - > サイト レイヤー] 負荷分散


[リバース プロキシ レイヤー] 負荷分散[サイト レイヤー] は

"nginx" を通じて実現されます。 nginx.conf

を変更することで、さまざまな負荷分散戦略を実装できます。 1) リクエスト ポーリング: DNS ポーリングと同様に、リクエストは各 Web サーバーに順番にルーティングされます

2 )最小接続ルーティング: どの Web サーバーの接続数が少ないか、どの Web サーバーがルーティングされるか

3) IP ハッシュ: Web サーバーは、アクセスしているユーザーの IP ハッシュ値に従ってルーティングされます。ユーザーの IP 分布が均一である限り、リクエストは理論的には均一です。IP ハッシュ バランシング方式でこれを実現できます。同じユーザーのリクエストは常に同じ Web サーバーに送られます。この戦略は、次のようなステートフル サービスに適しています。 as session (58 Chen Jian のコメント: これを行うことはできますが、強くお勧めしません。サイト層のステートレス性は分散アーキテクチャ設計の基本原則の 1 つです。セッションをデータ層に保存するのが最善です)

#4)…

[サイト層 -> サービス層] 負荷分散


[サイト層] から [サービス層] への負荷分散は、「サービス接続プール
」を通じて実現されます。

アップストリーム接続プールはダウンストリーム サービスとの複数の接続を確立し、各リクエストはダウンストリーム サービスにアクセスするための接続を「ランダムに」選択します。 前の記事「RPC クライアント実装の詳細」には、ロード バランシング、フェイルオーバー、タイムアウト処理について詳しく説明されています。リンクをクリックして参照してください。ここでは展開しません。

[データ層]の負荷分散

データ量が多い場合、データ層(db、キャッシュ)はデータを水平に分割するため、データ層の負荷分散はさらに複雑で、「データ分散」と「リクエスト分散」に分かれています。

データバランスとは、水平分割後の各サービス(db、キャッシュ)のデータ量がほぼ同じであることを指します。

リクエストのバランスとは、水平分割後の各サービス (db、キャッシュ) の

リクエスト量がほぼ同じであることを指します。

業界では、一般的な水平方向のセグメンテーション方法がいくつかあります:

1. 範囲に応じた水平方向のセグメンテーション

各データ サービスは、特定範囲のデータを保存します、上の図は例です:

user0 サービス、uid 範囲 1 ~ 1kw

# を保存します# #user1 サービス、ストレージ uid 範囲 1kw-2kw このソリューションの利点は次のとおりです:

(1) ルールは単純で、サービスはルーティングする uid 範囲を決定するだけで済みます。

##(2) データバランスが良くなる

(3) 拡張が比較的容易で、任意の場所にuid [2kw, 3kw]のデータサービスを追加できます。時間

欠点は次のとおりです:

(1) リクエストの負荷は必ずしも均等ではありません。一般に、新規登録ユーザーの方が古いユーザーよりもアクティブになり、広範囲のサービス リクエストに対するプレッシャーが大きくなります。

2. ID ハッシュの水平セグメンテーションに従って、


各データ サービスは、特定のキー値でハッシュされたデータの一部を格納します、上に示すように 例:

user0 サービス、偶数の uid データを保存します

user1 サービス、奇数の uid データを保存します

このソリューションの利点は次のとおりです:

(1) ルールは単純です。サービスは、対応するストレージ サービスにルーティングされる uid をハッシュするだけで済みます。

(2) データ バランスは良好です

(3) ) リクエストの均一性が良い

デメリットは:

#(1) 拡張が容易ではない データサービスを拡張する場合、ハッシュ方式が変わるとデータ移行が必要になる場合があります

#概要

負荷分散 (ロード バランス) は、分散システム アーキテクチャの設計において考慮する必要がある要素の 1 つであり、通常、リクエスト/データを [均等に割り当てること] を指します。 ] を複数のオペレーティング ユニットに実行させます。負荷分散の鍵は [均等に] です。

(1) [クライアント層]から[リバースプロキシ層]への負荷分散は「DNSポーリング」により実現します

(2) [リバースプロキシ層]から[サイト層]への負荷分散「nginx」を通じて実現されます

#(3) [サイト層] から [サービス層] への負荷分散は「サービス接続プール」を通じて実現されます

(4) [データ層] 負荷分散は必要です「データバランス」と「リクエストバランス」の2点を考慮する 一般的な方法としては「範囲による水平分割」「ハッシュ水平分割」

Apache負荷分散設定方法

一般的に、負荷分散とは、負荷分散の目的を達成するために、クライアントのリクエストをバックエンド上のさまざまな実サーバーに分散することです。もう 1 つの方法は、2 台のサーバーを使用し、1 台をメイン サーバー (マスター) として、もう 1 台をホット バックアップ (ホット スタンバイ) として使用することです。すべてのリクエストはメイン サーバーに与えられ、メイン サーバーがダウンすると、すぐにメイン サーバーに切り替えられます。バックアップ サーバー システム全体の可用性を向上させるために

私もこのタイトルを初めて見たときは驚きましたが、Apache って本当に負荷分散ができるのですか?とても強力です。調べてみると、確かにそれは可能で、機能的にも悪くないことが分かりました。これはすべて mod_proxy モジュールのおかげです。まさに強力な Apache です。

早速、負荷分散の設定方法を説明しましょう。

一般に、負荷分散とは、負荷分散の目的を達成するために、クライアントのリクエストをバックエンドのさまざまな実サーバーに分散することです。もう 1 つの方法は、2 台のサーバーを使用し、1 台をメイン サーバー (マスター) として、もう 1 台をホット バックアップ (ホット スタンバイ) として使用することです。すべてのリクエストはメイン サーバーに与えられ、メイン サーバーがダウンすると、すぐにメイン サーバーに切り替えられます。バックアップ サーバー。システム全体の信頼性を向上させます。

1. 負荷分散設定

1). 基本構成

Apache は、上記 2 つのニーズを満たすことができます。まず、負荷分散を行う方法について説明します。 Apache サーバーのドメイン名が www.a.com であると仮定すると、最初に Apache のいくつかのモジュールを有効にする必要があります。

コードは次のとおりです。

LoadModule proxy_module modules/mod_proxy.so 
 LoadModule proxy_balancer_module modules/mod_proxy_balancer.so 
 LoadModule proxy_http_module modules/mod_proxy_http.so

mod_proxy は次のとおりです。 mod_proxy_balancer はプロキシ サーバー機能を提供し、mod_proxy_balancer は負荷分散機能を提供し、mod_proxy_http はプロキシ サーバーが HTTP プロトコルをサポートできるようにします。 mod_proxy_http を他のプロトコル モジュール (mod_proxy_ftp など) に置き換えると、他のプロトコルの負荷分散をサポートできる可能性があります。興味のある方は、自分で試してみてください。

次に、次の構成を追加します:

コードは次のとおりです:

ProxyRequests Off 
 <Proxy balancer://mycluster> 
 BalancerMember http://node-a.myserver.com:8080 
 BalancerMember http://node-b.myserver.com:8080 
 </Proxy> 
 ProxyPass / balancer://mycluster/ 
 # 警告:以下这段配置仅用于调试,绝不要添加到生产环境中!!! 
 <Location /balancer-manager> 
 SetHandler balancer-manager 
 order Deny,Allow 
 Deny from all 
 Allow from localhost 
 </Location>

注: node-a.myserver.com、node-b.myserver.com は、node-a.myserver.com、node-b.myserver.com のドメイン名です。他の 2 つのサーバー 現在のサーバーのドメイン名ではありません

上記の ProxyRequests Off からわかるように、ロード バランサーは実際にはリバース プロキシですが、そのプロキシ転送アドレスは特定のサーバーではありません。 Balancer:// プロトコル:

ProxyPass / Balancer://mycluster プロトコル アドレスは任意に定義できます。次に、セクションでバランサープロトコルの内容を設定します。 BalancerMember ディレクティブは、負荷分散グループに実サーバーのアドレスを追加できます。

次の段落 ba087f03004fe4f66fd7615e84a09336 は、ロード バランシングの動作ステータスを監視するために使用されます。デバッグ中に追加できます (本番環境での使用は禁止されています!)。その後、http:/ にアクセスしてください。 /localhost/balancer-manager/ を参照して、ロードバランシングの動作ステータスを確認します。

OK、変更を加えた後、サーバーを再起動し、Apache サーバーのアドレス (www.a.com) にアクセスして、負荷分散の効果を確認してください。

出错提示: 
访问网页提示Internal Serveral Error,察看error.log文件

Error.log コード

[warn] proxy: No protocol handler was valid for the URL /admin/login_form. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

理由は構成です: # ProxyPass / Balancer://mycluster might be missing one /

2). 負荷比例配分

バランサー マネージャー インターフェイスを開くと、リクエストが均等に分散されていることがわかります。

如果不想平均分配怎么办?给 BalancerMember 加上 loadfactor 参数即可,取值范围为1-100。比如你有三台服务器,负载分配比例为 7:2:1,只需这样设置: 

Httpd.conf代码 

ProxyRequests Off 
 <Proxy balancer://mycluster> 
 BalancerMember http://node-a.myserver.com:8080 loadfactor=7 
 BalancerMember http://node-b.myserver.com:8080 loadfactor=2 
 BalancerMember http://node-c.myserver.com:8080 loadfactor=1 
 </Proxy> 
 ProxyPass / balancer://mycluster

3).负载分配算法 

默认情况下,负载均衡会尽量让各个服务器接受的请求次数满足预设的比例。如果要改变算法,可以使用 lbmethod 属性。如: 

代码如下:

ProxyRequests Off 
 <Proxy balancer://mycluster> 
 BalancerMember http://node-a.myserver.com:8080 loadfactor=7 
 BalancerMember http://node-b.myserver.com:8080 loadfactor=2 
 BalancerMember http://node-c.myserver.com:8080 loadfactor=1 
 </Proxy> 
 ProxyPass / balancer://mycluster 
 ProxySet lbmethod=bytraffic

lbmethod可能的取值有: 

  • lbmethod=byrequests 按照请求次数均衡(默认) 

  • lbmethod=bytraffic 按照流量均衡 

  • lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器) 

各种算法的原理请参见Apache的文档。 

2. 热备份(Hot Standby) 

热备份的实现很简单,只需添加 status=+H 属性,就可以把某台服务器指定为备份服务器: 

代码如下:

ProxyRequests Off 
 <Proxy balancer://mycluster> 
 BalancerMember http://node-a.myserver.com:8080 
 BalancerMember http://node-b.myserver.com:8080 status=+H 
 </Proxy> 
 ProxyPass / balancer://mycluster

从 balancer-manager 界面中可以看到,请求总是流向 node-a ,一旦node-a挂掉, Apache会检测到错误并把请求分流给 node-b。Apache会每隔几分钟检测一下 node-a 的状况,如果node-a恢复,就继续使用node-a。

apache负载均衡的安装和实现方法

其实无论是分布式,数据缓存,还是负载均衡,无非就是改善网站的性能瓶颈,在网站源码不做优化的情况下,负载均衡可以说是最直接的手段了。其实抛开这个名词,放开了说,就是希望用户能够分流,也就是说把所有用户的访问压力分散到多台服务器上,也可以分散到多个tomcat里,如果一台服务器装多个tomcat,那么即使是负载均衡,性能也提高不了太多,不过可以提高稳定性,即容错性。当其中一个主tomcat当掉,其他的tomcat也可以补上,因为tomcat之间实现了Session共享。待tomcat服务器修复后再次启动,就会自动拷贝所有session数据,然后加入集群。这样就可以不间断的提供服务。如果要真正从本质上提升性能,必须要分布到多台服务器。同样tomcat也可以做到。网上相关资料比较多,可以很方便的查到,但是质量不算高。我希望可以通过这篇随笔,系统的总结。

本文的 例子是同一台服务器上运行两个tomcat,做两个tomcat之间的负载均衡。其实多台服务器各配置一个tomcat也可以,而且那样的话,可以使用安装版的tomcat,而不用是下文中的免安装的tomcat,而且tomcat端口配置也就不用修改了。下文也会提到。 

tomcat的负载均衡需要apache服务器的加入来实现。在进行配置之前请先卸载调已安装的tomcat,然后检查apache的版本。我这次配置使用的是apache-tomcat-6.0.18免安装版本,我亲自测试后推断安装版的tomcat在同一台机子上会不能启动两个以上,可能是因为安装版的tomcat侵入了系统,导致即使在server.xml里修改了配置,还是会引起冲突。所以我使用tomcat免安装版。 

apache使用的是apache_2.2.11-win32-x86-no_ssl.msi。如果版本低于2.2Apache负载均衡的配置要有所不同,因为这个2.2.11和2.2.8版本集成了jk2等负载均衡工具,所以配置要简单许多。别的版本我没有具体测试,有待考究。这两个软件可以到官方网站下载。 

把Apache安装为运行在80端口的Windows服务,安装成功后在系统服务列表中可以看到Apache2.2服务。服务启动后在浏览器中输入http://localhost进行测试,如果能看到一个"It works!"的页面就代表Apache已经正常工作了。把tomcat解压到任意目录,赋值一个另命名。起名和路径对配置没有影响。但要保证端口不要冲突,如果装有Oracle或IIS的用户需要修改或关闭相关接口的服务。当然jdk的配置也是必须的,这个不再过多叙述。 

想要达到负载均衡的目的,首先,在Apache安装目录下找到conf/httpd.conf文件,去掉以下文本前的注释符(#)以便让Apache在启动时自动加载代理(proxy)模块。

代码如下:

LoadModule proxy_module modules/mod_proxy.so 
 LoadModule proxy_ajp_module modules/mod_proxy_ajp.so 
 LoadModule proxy_balancer_module modules/mod_proxy_balancer.so 
 LoadModule proxy_connect_module modules/mod_proxy_connect.so 
 LoadModule proxy_ftp_module modules/mod_proxy_ftp.so 
 LoadModule proxy_http_module modules/mod_proxy_http.so

向下拉动文档找到794ea01c23a0d5c1a7b2f169e4879de9节点,在DirectoryIndex index.html后加上index.jsp,这一步只是为了待会配置完tomcat后能看到小猫首页,可以不做。继续下拉文档找到Include conf/extra/httpd-vhosts.conf,去掉前面的注释符。 

然后打开conf/extra/httpd-vhosts.conf,配置虚拟站点,在最下面加上 

代码如下:

<VirtualHost *:80> 
 ServerAdmin 管理员邮箱 
 ServerName localhost 
 ServerAlias localhost 
 ProxyPass / balancer://sy/ stickysession=jsessionid nofailover=On 
 ProxyPassReverse / balancer://sy/ 
 ErrorLog "logs/sy-error.log" 
 CustomLog "logs/sy-access.log" common 
 </VirtualHost>

然后回到httpd.conf,在文档最下面加上 

代码如下:

ProxyRequests Off 
 <proxy balancer://sy> 
 BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=jvm1 
 BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=jvm2 
 </proxy>

ProxyRequests Off 是告诉Apache需要使用反向代理,ip地址和端口唯一确定了tomcat节点和配置的ajp接受端口。loadfactor是负载因子,Apache会按负载因子的比例向后端tomcat节点转发请求,负载因子越大,对应的tomcat服务器就会处理越多的请求,如两个tomcat都是1,Apache就按1:1的比例转发,如果是2和1就按2:1的比例转发。这样就可以使配置更灵活,例如可以给性能好的服务器增加处理工作的比例,如果采取多台服务器,只需要修改ip地址和端口就可以了。route参数对应后续tomcat负载均衡配置中的引擎路径(jvmRoute)

以上がApache で負荷分散を構成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。