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

推薦する

MySQL で重複時間を削除して時間差を計算する実装

目次必要:ドライブ:アイデア:成し遂げる:個人的には、実際の開発ではストアド プロシージャの使用はお...

jsはショッピングカートの加算と減算、価格計算機能を実現します

この記事では、ショッピングカートの増減と価格計算を実現するためのjsの具体的なコードを紹介します。具...

div タグ内の要素の margin-top が無効である場合の解決策

タイトル通りです。その質問は非常に奇妙です。要素の親タグはdivで、幅や高さなどの属性は設定されてい...

Vueコンポーネント通信方法事例まとめ

目次1. 親コンポーネントが子コンポーネントに値を渡す(props) 2. サブコンポーネントは親コ...

Vueスロットの使用の詳細

目次1. スロットを使用する理由1.1 スロット1.2 コンポーネントのスロット1.3 例2. この...

Linuxカーネルがプロセスアドレス空間に侵入し、プロセスメモリを変更する方法

プロセス アドレス空間の分離は、現代のオペレーティング システムの注目すべき機能です。これは、「古い...

MySQL メタデータで Hive テーブル作成ステートメントのコメント スクリプトを生成する方法

序文この記事は主にMySQLメタデータ生成Hiveテーブル作成ステートメントコメントスクリプトに関す...

HTML のスクロールバーについて/スクロールバーの削除

1. xhtmlの下のスクロールバーの色元の HTML では、ページ全体のスクロール バーを次のよう...

CSS3で実装されたテキストポップアップ効果

成果を達成する実装コードhtml <div>123WORDPRESS.COM</d...

nginxでイメージサーバーを構築する手順の詳しい説明(ルートとエイリアスの違い)

インストール手順は省略します( yum -y install nginx;を使用して直接インストール...

サブクエリ最適化における MySQL 選択の実装

以下のデモはMySQLバージョン5.7.27に基づいています。 1. MySQLサブクエリ最適化戦略...

Mysql は非集計列を選択できません

1. はじめに最近ブログをアップグレードし、記事ページの下部に前の記事と次の記事に直接ジャンプできる...

Linux のユーザーとグループ管理によく使われるコマンドの概要

この記事では、Linux のユーザーとグループの管理によく使用されるコマンドをまとめます。ご参考まで...

Dockerのセキュリティについて Docker-TLS暗号化通信の問題

目次1. Dockerのセキュリティ問題2. Dockerアーキテクチャの欠陥とセキュリティメカニズ...

HTML テーブルタグチュートリアル (19): 行タグ

<TR> タグの属性は、次の表に示すように、テーブル内の各行のプロパティを設定するために...