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

推薦する

Dockerコンテナの起動失敗を解決する方法

質問: コンピュータを再起動した後、docker の mysql コンテナを再起動できません。原因が...

全体的なユーザーエクスペリエンスを確保する方法

関連記事:ユーザーエクスペリエンスのためのウェブサイトデザイン今朝、GMail がまた不調になり、接...

H5ウェイクアップアプリの実装方法と注意点のまとめ

目次序文APPメソッドにジャンプURLスキームメタタグユニバーサルリンクさまざまな使い方URLスキー...

Navicat for SQLite で中国語データを CSV にインポートする方法

この記事では、参考までに、csv中国語データをNavicat for SQLiteにインポートする具...

Mysql の 2 つのテーブル間の結合クエリの 4 つの状況の概要

一般的に言えば、より完全な結果を得るためには、2 つ以上のテーブルから結果を取得する必要があります。...

vue3 のさまざまな構文形式を比較したサンプルコード

デフォルトのテンプレートメソッドはvue2に似ており、コンポーネント内のセットアップ関数を使用します...

MySQL テーブルタイプ ストレージエンジンの選択

目次1. 現在のデータベース支出のストレージエンジンを表示する方法1:方法2: 2. ENGINE=...

MySQL 8.0.12 のインストールと設定のチュートリアル

この記事はMySQL 8.0.12のインストールと設定に関する詳細なチュートリアルを記録しています。...

WeChatミニプログラム抽選コンポーネントの使い方

WeChatコンポーネントの形式で提供されます。コンポーネント内部ではasync/awaitが使用さ...

CSS3 タイムラインアニメーション

成果を達成する html <h2>CSS3 タイムライン</h2> <...

「MySQL サービスを開始できません エラー 1069」を解決する方法

今日、外出中に同僚から、ウェブサイトのバックエンドにアクセスできないというメッセージが届きました。と...

解決策 - BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 権限が不十分です

1) jdkファイルが保存されているフォルダパスを入力します私はここにいますusr/local/jd...

MySQL テーブルを作成するためによく使用される SQL ステートメントの概要

最近、私はプロジェクトに取り組んでおり、背景を記述するために SQL ステートメントを使用する必要が...

HTML ページ内の js および css ファイルのキャッシュを自動的にクリーンアップします (バージョン番号を自動的に追加します)

Web プロジェクトの開発プロセスでは、CSS ファイルや JS ファイルを参照することがよくあり...