Keepalived は Nginx の負荷分散と高可用性のサンプル コードを実装します

Keepalived は Nginx の負荷分散と高可用性のサンプル コードを実装します

第1章: keepalivedの紹介

VRRP プロトコルの目的は、静的ルーティングの単一点障害問題を解決することです。

第2章: keepalivedの仕組み

2.1 システムネットワークサービスとしての高可用性機能(フェイルオーバー)

keepalived 高可用性機能の基本原理は次のとおりです。
両方のホストに keepalived ソフトウェアをインストールし、サービスを開始します。 2 つのホストが正常に動作し始めると、マスターの役割を持つホストがすべてのリソースを取得し、ユーザーにサービスを提供します。 バックアップの役割を持つホストは、マスター ホストのホット スタンバイとして機能します。

マスター ロールを持つホストに障害が発生したり、誤動作したりすると、バックアップ ロールを持つホストが、VIP リソースと対応するリソース サービスの引き継ぎを含め、マスター ホストのすべての作業を自動的に引き継ぎます。

マスターの役割を持つホストの障害が修復されると、そのホストは元々処理していた作業を自動的に引き継ぎます。バックアップの役割を持つホストも、マスターホストの障害時に引き継いだ作業を解放します。このとき、2 つのホストは起動時の元の役割と動作状態に戻ります。

2.2 VRRPとは
VRRP、正式名称はVirtual Router Redundancy Protocol、中国語名はVirtual Router Redundancy Protocol
VRRP は、静的ルーティングの単一点障害問題を解決するために作成されました。
VRRP は、キャンペーン メカニズムを通じて VRRP ルーターにルーティング タスクを割り当てます。

VRRP は、選出メカニズムを通じて仮想ルータの機能を実装します。すべてのプロトコル メッセージは、IP マルチキャスト パケット (デフォルトのマルチキャスト アドレス 224.0.0.18) の形式で送信されます。
仮想ルータは、VRID (範囲 0 ~ 255) と IP アドレスのセットで構成され、外部からは既知の MAC アドレス 00-00-5E-00-01-{VRID} として表示されます。
そのため、仮想ルータでは、誰がマスターであっても、外部的には同じ MAC と IP (VIP と呼ばれる) が使用されます。
クライアント ホストは、マスターの変更によってルーティング設定を変更する必要がありません。クライアント ホストにとって、このスイッチは透過的です。

仮想ルータのグループでは、マスターである VRRP ルータのみが常に VRRP ブロードキャスト パケットを送信します。この時点では、バックアップはマスターをプリエンプトしません。
マスターが利用できない場合、バックアップはマスターからのブロードキャスト パケットを受信しません。このとき、複数のバックアップのうち最も優先度の高いルータがマスターとして引き継ぎます。
このプリエンプションは非常に高速 (おそらく 1 秒かそれ以下) で、サービスの継続性を保証します。セキュリティ上の理由から、VRRP データ パケットは暗号化プロトコルを使用して暗号化されます。

2.3 面接中に何を言うべきか<br /> 回答:
Keepalived 高可用性ペアは VRRP 経由で通信するため、まずは VRRP から始めます。
1) VRRP の正式名称は Virtual Router Reduancy Protocol で、静的ルーティングの単一障害点を解決するために設計されています。
2) VRRP はキャンペーン プロトコルを使用して、ルーティング タスクを VRRP ルーターに割り当てます。
3) VRRP は、IP マルチキャスト (デフォルトのマルチキャスト アドレス (224.0.0.18)) を使用して、高可用性ペア間の通信を実現します。
4) 動作中、マスターノードはパケットを送信し、スタンバイノードはそれを受信します。スタンバイノードは、マスターノードから送信されたパケットを受信できない場合、マスターノードのリソースを引き継ぐためにテイクオーバープログラムを起動します。スタンバイノードは複数存在することができ、優先順位によって選出されますが、一般的には、keepalived システムの運用と保守にはペアが存在します。
5) VRRP は暗号化プロトコルを使用してデータを暗号化しますが、keepalived の担当者は現在、認証タイプとパスワードを設定するためにプレーンテキストを使用することを推奨しています。
VRRP を紹介した後、keepalived サービスの動作原理を紹介します。
Keepalived 高可用性ペアは、VRRP を介して相互に通信します。VRRP は、選出メカニズムによってマスターとスタンバイを決定します。マスターはスタンバイよりも優先順位が高くなります。したがって、作業時には、最初にすべてのリソースを取得します。スタンバイ ノードは待機状態です。マスター ノードがハングアップすると、スタンバイ ノードがマスター ノードのリソースを引き継ぎ、マスター ノードに代わって外部サービスを提供します。
keepalived サービス ペア間では、マスター サーバーのみが VRRP ブロードキャスト パケットを送信し続け、バックアップ サーバーにまだ生きていることを伝えます。このとき、バックアップ サーバーはマスター サーバーをプリエンプトしません。マスター サーバーが使用できない場合、つまりバックアップ サーバーがマスター サーバーから送信されたブロードキャスト パケットを監視できない場合、バックアップ サーバーは関連サービスを開始してリソースを引き継ぎ、ビジネスの継続性を確保します。引き継ぎ速度は 1 秒未満と高速です。

第3章: VRRPプロトコル
VRRPは選出メカニズムを通じて仮想ルータの機能を実装します。すべてのプロトコルメッセージはIPマルチキャストパケットを通じて送信されます。デフォルトのマルチキャストアドレスは224.0.0.18です。

VIPの前提条件:
1. 仮想パブリックIPは実在し、利用可能でなければならない
2. 仮想パブリックIPは重複不可
3. マルチキャストアドレスは通信可能である必要がある

第4章: keepalivedのインストールと設定

1. keepalivedをインストールする

yum インストール keepalived -y

2. 設定ファイルの説明

グローバル定義 {  
  router_id lb01 #ルーティングIDを設定します。ホストごとに異なります} 

vrrp_instance VI_1 { #VRRPグループ名を設定し、同じグループ名の状態をMASTERにします #ロールステータスを設定し、MASTERとBACKUPに分けます
    interface eth0 #VIP にバインドされたネットワーク カード virtual_router_id 50 #仮想ルータ ID、同じグループの場合は同じ priority 150 #重み、重みが高いほど優先度が高くなります ads_int 1 #マルチキャストを送信する間隔 authentication { #認証を設定します。パスワードはプレーン テキストです auth_type PASS 
      認証パスワード 1111 
    }
    virtual_ipaddress { #仮想 IP を設定します。この仮想 IP は存在し、有効であり、使用されていない必要があります。
      10.0.0.3
    }
}

3.lb01構成

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
グローバル定義 {
  ルータID lb01
}

vrrp_インスタンス VI_1 {
  状態マスター
    インターフェース eth0
    仮想ルータID 50
    優先度150
    広告_int 1
    認証
      認証タイプ PASS
      認証パスワード 1111
    }
    仮想IPアドレス{
      10.0.0.3
    }
}

4.lb02構成

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
グローバル定義 {
  ルータID lb02
}

vrrp_インスタンス VI_1 {
  状態 バックアップ 
    インターフェース eth0
    仮想ルータID 50
    優先度100
    広告_int 1
    認証
      認証タイプ PASS
      認証パスワード 1111
    }
    仮想IPアドレス{
      10.0.0.3
    }
}

5. スタートアップ

systemctl 開始キープアライブ

6. 任意のマシンをシャットダウンし、VIP がマスターに戻るかどうか、および BACKUP VIP が消えるかどうかを観察してテストします。

第5章 スプリットブレイン現象

1. パケットキャプチャツールをインストールする

yum tcpdump をインストール -y 

2.lb02 パケットキャプチャと表示

tcpdump -nn -i 任意のホスト 224.0.0.18

3. lb02 新しいターミナルを開き、ファイアウォールをオンにします

systemctl は、firewalld.service を起動します。

4.lb02はパケットキャプチャ現象を観察し、両側にVIPがあるかどうかを確認します。

5. リリースルールを追加する

ファイアウォールコマンド --direct --permanent --add-rule ipv4 フィルター INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
ファイアウォールコマンド --direct --permanent --add-rule ipv4 フィルター INPUT 0 --in-interface eth1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
systemctl をリロードします。

6.lb02 パケットキャプチャ現象を観察して、両側にVIPがあるかどうかを確認します。

第6章: keepalivedデュアルマスター実験
1.lb01 設定ファイル

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
グローバル定義 {
  ルータID lb01
}

vrrp_インスタンス VI_1 {
  状態マスター
    インターフェース eth0
    仮想ルータID 50
    優先度150
    広告_int 1
    認証
      認証タイプ PASS
      認証パスワード 1111
    }
    仮想IPアドレス{
      10.0.0.3
    }
}

vrrp_インスタンス VI_2 {
  状態 バックアップ 
    インターフェース eth0
    仮想ルータID 51
    優先度100
    広告_int 1
    認証
      認証タイプ PASS
      認証パスワード 2222 
    }
    仮想IPアドレス{
      10.0.0.4
    }
}

2.lb02 設定ファイル

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
グローバル定義 {
  ルータID lb02
}

vrrp_インスタンス VI_1 {
  状態 バックアップ 
    インターフェース eth0
    仮想ルータID 50
    優先度100
    広告_int 1
    認証
      認証タイプ PASS
      認証パスワード 1111
    }
    仮想IPアドレス{
      10.0.0.3
    }
}

vrrp_インスタンス VI_2 {
  状態マスター 
    インターフェース eth0
    仮想ルータID 51
    優先度150
    広告_int 1
    認証
      認証タイプ PASS
      認証パスワード 2222 
    }
    仮想IPアドレス{
      10.0.0.4
    }
}

3. keepalivedを再起動して現象を観察します

systemctl を再起動する keepalived

第 7 章: keepalived と nginx リバース プロキシ ロード バランシングの組み合わせ
lb サーバーの Nginx 構成:
知らせ! 2つのlbサーバーのNginx設定はまったく同じです

1. 元の設定をバックアップする

mkdir /バックアップ
/etc/nginx/conf.d をコピーします
mv * /バックアップ 

2. Nginx設定ファイルを書く

[root@lb01 /etc/nginx/conf.d]# cat proxy.conf 
アップストリーム web_pools {
  サーバー 172.16.1.7;
  サーバー 172.16.1.8;
}

サーバー{
  聞く 80;
  サーバー名 (www|bbs).mysun.com;
  位置 / {
   proxy_pass http://web_pools;
   proxy_params を含めます。
  }
}

3. nginxをテストして再起動する

nginx -t
systemctl nginx を再起動します 

lb サーバーの Keepalived 構成:

1.lb01 キープアライブ設定

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
グローバル定義 {
  ルータID lb01
}

vrrp_インスタンス VI_1 {
  状態マスター
    インターフェース eth0
    仮想ルータID 50
    優先度150
    広告_int 1
    認証
      認証タイプ PASS
      認証パスワード 1111
    }
    仮想IPアドレス{
      10.0.0.3
    }
}

2.lb02 キープアライブ設定

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
グローバル定義 {
  ルータID lb02
}

vrrp_インスタンス VI_1 {
  状態 バックアップ 
    インターフェース eth0
    仮想ルータID 50
    優先度100
    広告_int 1
    認証
      認証タイプ PASS
      認証パスワード 1111
    }
    仮想IPアドレス{
      10.0.0.3
    }
}

Web サーバーの構成:

知らせ! 2つのWebサーバーは同じ構成です

1. nginxの設定

[root@web01 ~]# cat /etc/nginx/conf.d/www.conf 
サーバー{
 聞く 80;
 サーバー名 www.mysun.com;
 位置 / {
   ルート/コード;
   インデックス www.html;
 }
}

2. テストファイルを書く

echo "$(ホスト名)" >/code/index.html 

第8章: スプリットブレイン防止スクリプト

1. 問題現象:
1.nginxはダウンしているが、keepはまだ生きている
2. 双方にVIPがいる

2. アイデア:
nginx のハング問題を解決する:
1. スクリプトを書く

  • nginxを起動する
  • 起動が2回失敗した場合は、keepalivedを停止します

2.keepalivedはこのスクリプトを定期的に呼び出します

3. 実装:

1. コマンドの実装方法

systemctl nginx を起動します

2. nginxプロセスを確認する

[root@lb01 ~]# ps -ef|grep nginx|grep -v "grep"
root 1210 1 0 11:21 ? 00:00:00 nginx: マスタープロセス /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 1211 1210 0 11:21 ? 00:00:00 nginx: ワーカープロセス
[root@lb01 ~]# ps -ef|grep nginx|grep -v "grep"|wc -l
2
[root@lb01 ~]# ps -ef|grep nginx|grep -v "grep"|wc -l
0

スクリプトの内容:

[root@lb01 ~]# cat check_web.sh 
!/bin/bash

nginx_status=$(ps -C nginx --no-header|wc -l)

[[ ${nginx_status} == 0 ]]の場合
それから
  systemctl start nginx &> /dev/null 
  睡眠1
  nginx_status=$(ps -C nginx --no-header|wc -l)
  [[ ${nginx_status} == 0 ]]の場合
  それから
    systemctl 停止キープアライブ 
  フィ
フィ

Keepalived は次のスクリプトを呼び出します:

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
グローバル定義 {
  ルータID lb01
}

vrrp_script チェックウェブ {
  スクリプト "/server/scripts/check_web.sh"
  間隔5
  重量 50
}

vrrp_インスタンス VI_1 {
  状態マスター
    インターフェース eth0
    仮想ルータID 50
    優先度150
    広告_int 1
    認証
      認証タイプ PASS
      認証パスワード 1111
    }
    仮想IPアドレス{
      10.0.0.3
    }

  トラックスクリプト {
    チェックウェブ
  }

}

4. 2 番目の問題: スプリットブレイン問題<br /> 両側に VIP がいる

現象:
両側にVIP
両側のNginxは生きている

反対側のマスターのNginxはまだ生きている

curl -I -s -w "%{http_code}\n" -o /dev/null 10.0.0.5

しかし、私はまたVIPを持っています

ip a |grep "10.0.0.3"|wc -l

私は自殺する

systemctl 停止 nginx 
systemctl 停止キープアライブ 

スクリプトの内容:

[root@lb02 /server/scripts]# cat check_vip.sh 

#!/bin/bash

マスターステータス=$(curl -I -s -w "%{http_code}\n" -o /dev/null 10.0.0.5)

my_vip=$(ip a |grep "10.0.0.3"|wc -l)

[ ${master_status} == 200 -a ${my_vip} == 1 ] の場合
それから
  systemctl 停止 nginx 
  systemctl 停止キープアライブ 
フィ

keepalived 設定:

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
グローバル定義 {
  ルータID lb02
}

vrrp_script チェックウェブ {
  スクリプト "/server/scripts/check_web.sh"
  間隔5
  重量 50
}

vrrp_script チェック_vip {
  スクリプト "/server/scripts/check_vip.sh"
  間隔5
  重量 50
}

vrrp_インスタンス VI_1 {
  状態 バックアップ 
    インターフェース eth0
    仮想ルータID 50
    優先度100
    広告_int 1
    認証
      認証タイプ PASS
      認証パスワード 1111
    }
    仮想IPアドレス{
      10.0.0.3
    }
  トラックスクリプト {
    チェックウェブ
    チェックvip
  }
}

これで、Keepalived を使用して Nginx の負荷分散と高可用性を実装するためのサンプル コードに関するこの記事は終了です。Keepalived Nginx の負荷分散と高可用性に関するその他の関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker+keepalived+nginx を使用してマスタースレーブホットスタンバイを実装する方法の例
  • Nginx+Keepalived でデュアルマシンのホットスタンバイを実現
  • keepalived デュアルマシンホットスタンバイ nginx の設定方法
  • Nginx は高可用性クラスタ構築を実装します (Keepalived+Haproxy+Nginx)
  • Nginx+Keepalived でデュアルマシン マスターとバックアップを実装する方法
  • nginx+keepalived 高可用性マスタースレーブ構成の詳細な説明
  • Keepalived を使用して Nginx の自動再起動とデュアルアクティブ ホットスタンバイの高可用性を実現する方法について

<<:  VSCode 開発 UNI-APP 構成チュートリアルとプラグイン

>>:  MySQL パスワードは正しいが、ローカルにログインできない -1045

推薦する

Vue 3 での watch と watchEffect の新しい使い方

目次1. 時計の新しい使い方1.1. ウォッチの使用構文1.2. 複数の属性値を監視する1.3. 参...

docker-compose を使用して Clickhouse をすばやくデプロイする方法のチュートリアル

ClickHouse は、オープンソースの列指向 DBMS (Yandex によって開発) です。 ...

標準的なHTMLの書き方は、Dreamweaverによって自動的に生成されるものとは異なります。

コードをコピーコードは次のとおりです。 <!--doctype はドキュメント タイプ htm...

要素テーブルテーブルコンポーネントの複数フィールド(複数列)ソート方法

目次必要:発生した問題:解決する:必要:要素テーブル内の複数の列を並べ替えるには、日付の並べ替えをク...

MySQLの詳細な説明Explain

日常業務では、実行に時間のかかる SQL ステートメントを記録するために、スロー クエリを実行するこ...

MySQLインデックスの基礎となるデータ構造の詳細

目次1. インデックスの種類1. B+ツリー2. MyISAM と InnoDB の B+ ツリー ...

Vueはスクロールロードテーブルを実装します

目次成果を達成する転がり荷重知識備蓄コンポーネントのパッケージ1. コンポーネントの命名2. 小道具...

MySQLのexplain型の詳細な説明

導入:多くの場合、さまざまな選択ステートメントを使用して必要なデータを照会した後、多くの人は作業が正...

Javascriptの基本ループの詳しい説明

目次サイクルのために入室のためのその間しながら行うループから抜け出す要約するサイクルのためにループは...

CSS 線形グラデーション凹型長方形遷移効果の実装

この記事では、線形グラデーションの凹四角形の遷移効果の難しさやアイデアについて説明します。主に、凹四...

AngularでTweenMaxアニメーションライブラリを使用する際の問題と解決策

最近何もすることがないのでCSSをいじっていますより良いアニメーションライブラリTweenMaxを見...

Tomcat の maxPostSize 設定に関する問題と注意事項

1. maxPostSize を設定する理由は何ですか? tomcat コンテナには送信データのサイ...

mysql 5.7.18 winx64 無料インストール設定方法

1. ダウンロード2. 減圧3. パス環境変数を追加し、mysqlが配置されているbinディレクトリ...

CentOS MySQLデータベースのスケジュールバックアップを実装する方法

次のスクリプトは、MySQLデータベース全体のスケジュールされたバックアップに使用されます。 mys...

MySql 5.6.36 64 ビット グリーン バージョンのインストール グラフィック チュートリアル

MySQL のインストールについてはインターネット上に多くの記事がありますが、今日ノート PC にイ...