ホームページ > 運用・保守 > Nginx > keepalived と nginx を組み合わせて高可用性を実現する方法

keepalived と nginx を組み合わせて高可用性を実現する方法

WBOY
リリース: 2023-05-15 21:07:12
転載
1385 人が閲覧しました

1. はじめに

keepalived は、vrrp プロトコルに基づく lvs サービスの高可用性ソリューションであり、単一障害点を回避するために使用できます。 LVS サービスには、キープアライブを実行する 2 つのサーバーがあり、1 つはメイン サーバー (マスター) として、もう 1 つはバックアップ サーバー (バックアップ) として動作しますが、外部からは仮想 IP として表示されます。メイン サーバーは特定のメッセージをバックアップ サーバーに送信します。バックアップサーバーの場合 サーバーがこのメッセージを受信できない場合、つまりメインサーバーがダウンした場合、バックアップサーバーが仮想 IP を引き継いでサービスを提供し続けるため、高可用性が確保されます。 Keepalived は vrrp の完璧な実装であるため、keepalived を紹介する前に、まず vrrp の原理を紹介しましょう。

1. vrrp プロトコルの概要

実際のネットワーク環境では、通信する必要がある 2 つのホストは、ほとんどの場合、直接の物理接続を持っていません。このような状況では、それらの間のルートをどのように選択すればよいでしょうか?ホストは宛先ホストへのネクスト ホップ ルートをどのように選択しますか? この問題には 2 つの一般的な解決策があります:

  1. ホストで動的ルーティング プロトコル (rip、ospf など) を使用する

  2. ホスト上での静的ルーティングの構成

明らかに、ホスト上で動的ルーティングを構成することは、管理とメンテナンスのコストと、サポートされており、その他多くの質問があります。静的ルートの構成は非常に一般的になりましたが、ルーター (またはデフォルト ゲートウェイ) が単一障害点になることがよくあります。 vrrp の目的は、静的ルーティングの単一障害点問題を解決することであり、vrrp は選出プロトコルを使用して、lan 内の仮想ルーターの中の特定の vrrp ルーターにルーティング タスクを動的に割り当てます。

2.vrrp の動作メカニズム

VRRP 仮想ルーターでは、複数の物理 VRRP ルーターが存在しますが、これらの複数の物理マシンは同時に動作することはできません。マスターと呼ばれる 1 つはルーティング作業を担当し、その他はバックアップです。マスターは静的ではありません。vrrp では各 vrrp ルーターが選挙に参加することができ、最終的にはマスターが勝者になります。マスターには仮想ルーターの IP アドレスなどのいくつかの権限があり、ホストはこの IP アドレスをスタティック ルートとして使用します。特権マスターは、ゲートウェイ アドレスに送信されたパケットを転送し、ARP リクエストに応答する責任を負います。

vrrp は、選挙プロトコルを通じて仮想ルーターの機能を実装しており、すべてのプロトコル メッセージは ip マルチキャスト (マルチキャスト) パケット (マルチキャスト アドレス 224.0.0.18) の形式で送信されます。仮想ルーターは、vrid (範囲 0 ~ 255) と IP アドレスのセットで構成されており、外部からは既知の MAC アドレスとして認識されます。したがって、仮想ルーターでは、誰がマスターであっても、外部の mac と IP は同じになります (vip と呼ばれます)。クライアント ホストは、マスターの変更によってルーティング設定を変更する必要がなく、クライアントにとって、このマスター/スレーブの切り替えは透過的です。

仮想ルーターでは、常にマスターである vrrp ルーターのみが vrrp 通知メッセージ (vrrpadvertisement メッセージ) を送信し、優先度が高くない限りバックアップがマスターをプリエンプトすることはありません。マスターが使用できない場合 (バックアップが通知情報を受信できない場合)、複数のバックアップのうち最も優先度の高いバックアップが優先されてマスターになります。このプリエンプションは非常に高速 (1 秒未満) でサービスの継続性を確保します。セキュリティを考慮して、vrrp パッケージは暗号化に暗号化プロトコルを使用します。

3.vrrp ワークフロー

(1).初期化:

ルーターの起動時、ルーターの優先度が 255 の場合(最高の優先順位、ルーターはルーターアドレスを持っています)、vrrp 通知情報を送信し、ルーターの IP アドレスに対応する mac アドレスがルーティング仮想 mac であることを通知するブロードキャスト arp 情報を送信し、通知情報タイマーを設定して送信の準備をします。 vrrp 通知情報を定期的に受信し、マスター状態に移行する ; それ以外の場合は、バックアップ状態に入り、タイマーを設定してマスターからの通知情報を定期的に受信するかどうかを確認します。

(2).master

  1. スケジュールされた通知タイマーを設定します;

  2. vrrp 仮想 MAC アドレスを使用して応答しますルータの IP アドレス arp 要求;

  3. 宛先 MAC が vrrp 仮想 mac であるパケットを転送;

  4. 仮想マシンの所有者である場合router ip, it will be accepted 宛先アドレスが仮想ルーター IP であるデータ パケットは破棄され、それ以外の場合は破棄されます;

  5. シャットダウン イベントを受信すると、スケジュールされた通知タイマーが削除されます。優先度0の通知パケットを送信し、初期化を行います ステータス;

  6. スケジュールされた通知タイマーがタイムアウトした場合、vrrp通知情報が送信されます;

  7. vrrp 通知情報を受信した際、優先度が 0 の場合は vrrp 通知情報を送信し、そうでない場合はデータの優先度が自マシンの優先度より高いかどうかを判定します。等しいが、実際の IP アドレスが実際のローカル IP より大きい場合は、スケジュールされた通知タイマーを設定し、ホスト タイムアウト タイマーをリセットして、バックアップ状態に移行します。それ以外の場合は、通知パケットを破棄します。

(3).backup

  1. ホスト タイムアウト タイマーを設定します。

  2. 仮想ルーター IP の arp 要求情報に応答できません;

  3. 宛先 MAC アドレスが仮想ルーターの MAC アドレスであるすべてのパケットを破棄します;

  4. 仮想ルーター宛てのすべてのデータ パケットを受け入れませんIP;

  5. シャットダウンイベントを受信すると、ホストタイムアウトタイマーを削除し、初期化状態に移行します;

  6. ホスト タイムアウト タイマーがタイムアウトすると、vrrp 通知情報を送信し、arp アドレス情報をブロードキャストし、マスター状態に切り替えます。

  7. 受信すると、 vrrp 通知情報、優先度が 0 の場合はマスター選出に入ったことを意味し、それ以外の場合はデータの優先度がローカル マシンより高いかどうかを判断し、高い場合はマスターが有効であることを認め、ホスト タイムアウト タイマーをリセットします。それ以外の場合は、通知パケットを破棄します。

4.arp クエリ処理

内部ホストが仮想ルーター IP に対応する MAC アドレスをクエリするときarp を介したアドレスの場合、マスター ルータによって応答される MAC アドレスは、実際のネットワーク カードの MAC アドレスではなく、仮想 vrrp MAC アドレスであるため、ルータの切り替え時に内部ネットワーク マシンがそれを検出できなくなり、ルータが再起動されます。ローカル ネットワーク カードの実際の MAC アドレスを積極的に送信することはできません。仮想ルータで arp プロキシ (proxy_arp) 機能が有効になっている場合、プロキシの arp 応答は vrrp 仮想 MAC アドレスにも応答します。

2. 環境を構築します

1. サーバー 1: 10.63.0.154 keeplived をインストールし、優先度の値を 100
2. サーバー 2 : 10.63.0.155 keepalived をインストールし、優先順位の値を 98
3 に設定します。2 つのサーバーに対応する仮想 IP を次のように設定します: 10.63.0.158

3. keepalived マスター ノードをインストールします

この keepalived のインストールは yum モードを採用しており、サーバー 1 にインストールされます。主な手順は次のとおりです:

1. ipvsadm をインストールします (コマンド: yum install ipvsadm)。インストールが完了したら、ipvsadm –v コマンドを実行してバージョン番号を表示できます。
2. keepalived をインストールします (コマンド: yum install keepalived) インストールが完了したら、コマンド keepalived –v を使用してバージョン番号を確認できます。
3. /usr/local/nginx/nginx_check.sh スクリプトを作成します。スクリプトの内容は次のとおりです:

#!/bin/bash
#判断nginx服务是否启动,如果不存在,调用nginx启用命令,并停止2秒,若#启动失败,杀掉keepalived
a=`ps -c nginx --no-header |wc -l`
if [ $a -eq 0 ];then 
 /usr/sbin/nginx
 sleep 2
 if [ `ps -c nginx --no-header |wc -l` -eq 0 ];then
  killall keepalived
 fi
fi
ログイン後にコピー

Set nginx_check.sh Permissions. 設定コマンドは: chmod 777 /usr/local/nginx/nginx_check.sh

4 です。 keepalived ノード情報の構成 (デフォルト) 構成ファイルは /etc/keepalived/keepalived.conf です。 keepalived.conf 設定ファイルは次のとおりです:

! configuration file for keepalived

global_defs {
 router_id nginx_master154
}

vrrp_script chk_nginx {
 script "/usr/local/nginx/nginx_check.sh"
 interval 2
 weight 20
}
vrrp_instance vi_1 {
 state master
 interface eth0
 virtual_router_id 154
 mcast_src_ip 10.63.0.154
 priority 100
 nopreempt
 advert_int 1
 authentication {
  auth_type pass
  auth_pass 1111
 }
 track_script {
  chk_nginx
 }
 virtual_ipaddress {
  10.63.0.158
 }
}
}
ログイン後にコピー

設定ファイルのキー パラメータの説明:

  1. router_id //ノード名を定義します

  2. vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" Interval 2 Weight -20 } // /etc/keepalived/nginx_check.sh スクリプトを 2 秒ごとに実行します。このチェックは、続けて、interval は間隔を表し、重み -20 は、例外を判断するためにスクリプトが実行されるときに、ノード 10.63.0.154 の優先順位が 20 下がることを意味します。

  3. #state master //ノード ロールが master として定義されていることを示します

  4. virtual_router_id 154 //仮想ノード ID を定義します

  5. interface eth0 //次の図に示すように、コマンド ifconfig または ip a を使用してサーバーのネットワーク カード名を表示するネットワーク カード名を定義します。

keepalived と nginx を組み合わせて高可用性を実現する方法

上記の設定ファイルが完成したら、nginx を起動し、keepalived を起動して、仮想 IP アドレスで nginx にアクセスできるかテストします。 keepalived コマンドを開始します: systemctl start keepalived.service 開始後、コマンド systemctl status keepalived.service を使用してステータスを確認できます。仮想 IP を使用した nginx のメイン インターフェイスのスクリーンショットは次のとおりです:

keepalived と nginx を組み合わせて高可用性を実現する方法

3. keepalived バックアップ ノードのインストール

keepalived のインストールサーバー 2 の方法はサーバー 1 の方法とまったく同じです。 keepalived.conf 設定ファイルの 3 か所を変更するだけです:

  1. interface eth0 //ネットワーク カードを定義します。 name を使用して、サーバー 2 のネットワーク カードを表示します。たとえば、ネットワーク カード名は eno24 で、次のように定義されます。interface eno24

  2. priority //優先度の値は 98## に設定されます

  3. mcast_src_ip 10.63.0.155
  4. 2 台のサーバーへのキープアライブのインストールが成功した後、仮想 ip10.63.0.158 呼び出しテストによって、それが見つかりました。プライマリ ノードのページは常にバックアップ ノードのページであり、バックアップ ノードのページは呼び出されませんでした。サーバー 1 でキープアライブを設定し、再度呼び出すと、以下に示すように、スタンバイ ノードのメイン インターフェイスが表示されます。

keepalived と nginx を組み合わせて高可用性を実現する方法

4.linux サービス管理ツールsystemctl

Linux では、サービスを管理するための 2 つのコマンド、service と chkconfig があります。 systemctl はサービスを管理するための主要なツールであり、chkconfig とサービス機能を統合します。 (このコマンドを使用して、yum インストール ソフトウェアを管理し、起動時に開始するかどうかを設定できます)

    systemctl is-enabled servicename.service #起動時にサービスが開始されるかどうかを問い合わせる
  1. systemctl enable *.service #サービスを開始して実行します
  2. systemctl disable *.service #ブートをキャンセルして実行
  3. systemctl start *.service #サービスの開始
  4. systemctl stop *.service #サービスの停止
  5. systemctl restart *.service #重启服务

  6. systemctl reload *.service #重新加载服务配置文件

  7. systemctl status *.service #查询服务运行状态

  8. systemctl --failed #显示启动失败的服务

注:*代表某个服务的名字,如http的服务名为httpd

例如在centos 7 上安装http

[root@centos7 ~]# yum -y install httpd
ログイン後にコピー

启动服务(等同于service httpd start) systemctl start httpd.service
停止服务(等同于service httpd stop) systemctl stop httpd.service
重启服务(等同于service httpd restart) systemctl restart httpd.service
查看服务是否运行(等同于service httpd status) systemctl status httpd.service 开机自启动服务(等同于chkconfig httpd on) systemctl enable httpd.service
开机时禁用服务(等同于chkconfig httpd on) systemctl disable httpd.service

ps -ef | grep nginx #查看服务进程
ログイン後にコピー

#非systemctl配置开机启动:chmod +x /etc/rc.d/rc.local
#打开rc.localvi /etc/rc.local
#加入启动脚本其中路径一定要用全路径如:/usr/local/nginx/sbin/nginx

以上がkeepalived と nginx を組み合わせて高可用性を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート