ホームページ  >  記事  >  PHPフレームワーク  >  負荷分散、分散、クラスタリングについて理解し、複数のサーバー コードを同期する方法

負荷分散、分散、クラスタリングについて理解し、複数のサーバー コードを同期する方法

步履不停
步履不停オリジナル
2019-07-03 14:42:184385ブラウズ

負荷分散、分散、クラスタリングについて理解し、複数のサーバー コードを同期する方法

以下では、これらの用語の概念について説明します。

クラスター

プロジェクトがマシン上で実行される場合、このマシンに障害が発生する場合、またはユーザーリクエストの量は比較的多く、1 台のマシンではサポートできません。当社のウェブサイトにアクセスできない可能性があります。では、どうすれば解決できるのでしょうか?複数のマシンで Web サイトを同時に実行できるように、複数のマシンを使用して同じプログラムをデプロイする必要があります。では、リクエストをすべてのマシンに分散するにはどうすればよいでしょうか。そこで、負荷分散という概念が登場しました。

ロード バランシング

ロード バランシングとは、指定されたポリシー アルゴリズムに基づくリバース プロキシに基づいて、現在のすべてのリクエストをさまざまなサーバーに分散する機能を指します。負荷分散を実現するために一般的に使用されるのは、nginx、lvs です。しかし、ここで問題も発生しました。負荷分散サーバーに問題が発生した場合はどうすればよいでしょうか?冗長性のあらゆる概念が登場します。

冗長性

冗長性は、実際にはマスター サーバーとスレーブ サーバーの 2 つ以上のサーバーです。マスター サーバーの負荷分散サーバーに問題があり、スレーブ サーバーがマスター サーバーに代わって負荷分散を継続できるとします。これを実現する方法は、キープアライブを使用して仮想ホストを捕捉することです。

Distributed

Distributed は、実際には大規模なプロジェクトを個別の部分に分割し、独立して実行することです。

上記の例を考えてみましょう。トラフィックが特に多いとします。 CDNと同じ仕組みで分散させることができます。北京、杭州、深センの 3 か所に同一のクラスターが構築されています。北京に近いユーザーは北京のクラスターにアクセスし、深センに近いユーザーは深センのクラスターにアクセスします。これにより、オンライン バトルが 3 つのエリアに分割され、それぞれが独立しています。

もう 1 つの例は、redis ディストリビューションです。 Redis 分散では、Redis 内のデータが異なるサーバーに分散され、各サーバーには異なるコンテンツが保存されますが、mysql クラスターでは同じデータが各サーバーに保存されます。これにより、分散とクラスタリングの概念も理解できます。

mysql master-slave

mysql マスター サーバーは SQL 操作ログを bin.log ログに書き込み、スレーブ サーバーはマスターの bin.log ログを読み取り、SQL ステートメントを実行します。

マスターとスレーブには次の問題があります。

1. マスター サーバーは書き込みと読み取りが可能ですが、スレーブは書き込みのみ可能です。

スレーブが読み取ったデータはまだ書き込まれていません。この問題を解決するにはどうすればよいですか?

1. キャッシュされている場合は、キャッシュから読み取ります。
2. マスターからの読み取りを強制します。
3. pxc クラスターを使用すると、どのノードでも読み取りと書き込みが可能になり、読み取りと書き込みの一貫性が強くなります。

laravel がデータの不整合を解決する方法

config/database.php mysql 設定ブロックで Sticky を true に設定します

sticky はオプションの値で、即時読み取りに使用できます。現在のリクエスト サイクル中にデータベースに書き込まれたレコードを取得します。スティッキー オプションが有効で、現在のリクエスト サイクル中に「書き込み」操作が実行された場合、「読み取り」操作はすべて「書き込み」接続を使用します。これにより、同じリクエストサイクルで書き込まれたデータを即座に読み出すことができるため、マスター/スレーブの遅延によって引き起こされるデータの不整合の問題が回避されます。ただし、これを有効にするかどうかは、アプリケーションのニーズによって異なります。

コードを複数のサーバーと同期するにはどうすればよいですか?

Laravel は拡張パッケージ laravel/envoy を提供します。これは、リモートサーバーの日常タスクを定義するための簡潔で軽量な構文のセットを提供します。ブレード スタイルの構文は、デプロイメント タスクの構成、アーティザン コマンドの実行などに使用できます。

composer global require laravel/envoy

Envoy タスクはすべて、プロジェクト ルート ディレクトリの Envoy.blade.php で定義する必要があります。コンテンツを記述します

@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2'])

@task('deploy', ['on' => ['web-1', 'web-2']])
    cd site
    git pull origin {{ $branch }}
    composer update
    php artisan migrate
@endtask

上記のコードは、envoy rundeployがコマンドラインで実行されるときに、実行のためにweb-1とweb-2にSSH接続することを意味します

    cd site
    git pull origin {{ $branch }}
    php artisan migrate

もちろん、これは前提条件は、リモートサーバーに SSH 接続していることです。

Laravel 関連の技術記事の詳細については、Laravel チュートリアル 列にアクセスして学習してください。

以上が負荷分散、分散、クラスタリングについて理解し、複数のサーバー コードを同期する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。