keepalived+nginx の高可用性を実装する方法の例

keepalived+nginx の高可用性を実装する方法の例

1. keepalived の紹介

Keepalived は、もともと LVS クラスタ システム内の各サービス ノードの状態を管理および監視するための LVS 負荷分散ソフトウェアとして設計されました。その後、高可用性を実現するために VRRP 機能が追加されました。 LVS ソフトウェアの管理に加えて、keepalived は他のサービスの高可用性ソリューションもサポートできます。

keepalived は VRRP プロトコルを通じて高可用性を実現します。 VRRP (Virtual Router Redundancy Protocol) 仮想ルーティング冗長プロトコル。 VRRP の目的は、静的ルーティングの単一点障害問題を解決することです。これにより、個々のノードに障害が発生しても、ネットワーク全体が中断することなく動作できるようになります。

2. Keepalived の高可用性フェイルオーバーの原則

keepalived 高可用性サービス間のフェイルオーバーは、VRRP を通じて実現されます。 keepalived サービスが動作している場合、メインのマスター ノードはバックアップ ノードに (マルチキャスト) ハートビート メッセージを継続的に送信し、バックアップ ノードにまだ動作していることを伝えます。

プライマリ ノードに障害が発生すると、スタンバイ ノードにハートビート メッセージを送信できなくなります。スタンバイ ノードがプライマリ ノードからのハートビートを継続的に検出できない場合。独自の引き継ぎプログラムを呼び出して、メイン ノードの IP リソースとサービスを引き継ぎます。マスター ノードが回復すると、スタンバイ ノードは、マスター ノードの障害時に引き継いだ IP リソースとサービスを解放し、元のスタンバイ ロールに戻ります。

3. nginxをインストールする

3.1. マスターノード (192.168.80.22)

3.1.1. コンパイルツールとライブラリファイルのインストール

yum -y インストール make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

3.1.2. pcreをインストールする

#ディレクトリに入る cd /usr/local/develop/anginx

#インストールファイルをアップロードして解凍します tar -zxvf pcre-8.38.tar.gz

#インストールディレクトリに入る cd pcre-8.38

# 設定を確認する ./configure

#コンパイルしてインストールする make && make install

# pcre バージョンを表示する pcre-config --version

3.1.3. nginxをインストールする

#ディレクトリに入る cd /usr/local/develop/anginx
​
#インストールファイルをアップロードして解凍します tar -zxvf nginx-1.8.1.tar.gz
​
#インストールディレクトリに入る cd nginx-1.8.1
​
# 設定を確認します ./configure --prefix=/usr/local/develop/anginx/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/develop/anginx/pcre-8.38
​
#コンパイルしてインストールする make && make install
​
# nginxのバージョンを表示する /usr/local/develop/anginx/webserver/nginx/sbin/nginx -v
--------------------------------------------------------
[root@hadoop02 ウェブサーバー]# /usr/local/develop/anginx/webserver/nginx/sbin/nginx -v
nginx バージョン: nginx/1.8.1
​
#nginx の設定 (チェック)
/usr/local/develop/anginx/webserver/nginx/sbin/nginx -t
​
#nginx 管理コマンド /usr/local/develop/anginx/webserver/nginx/sbin/nginx # Nginx を起動します
/usr/local/develop/anginx/webserver/nginx/sbin/nginx -s stop # Nginxを停止します
/usr/local/develop/anginx/webserver/nginx/sbin/nginx -s reload # 設定ファイルを再読み込みします /usr/local/develop/anginx/webserver/nginx/sbin/nginx -s reopen # Nginx を再起動します

3.1.4.nginxの基本設定

vi nginx.conf

#ユーザーnobody;
ワーカープロセス 1;
​
#error_log ログ/error.log;
#error_log ログ/error.log 通知;
#error_log ログ/error.log 情報;
​
pid ログ/nginx.pid;
​
​
イベント {
  ワーカー接続 1024;
}
​
​
http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;
​
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
           '$status $body_bytes_sent "$http_referer" '
           '"$http_user_agent" "$http_x_forwarded_for"';
​
  access_log ログ/access.log メイン;
​
  ファイル送信オン;
  #tcp_nopush オン;
​
  #キープアライブタイムアウト 0;
  キープアライブタイムアウト65;
​
  #gzip オン;
  
  # tomcat リストを追加します。実際のアプリケーション サーバーはここに配置されます。upstream tomcat_pool{
    #server tomcat アドレス: ポート番号 weight は重みを示し、重みが大きいほど割り当てられる可能性が高くなります。
    サーバー 192.168.80.22:8080 重み=4 max_fails=2 fail_timeout=30s;
    サーバー 192.168.80.22:8081 weight=4 max_fails=2 fail_timeout=30s;
    
  }
​
  サーバー{
    聞く 80;
    サーバー名 tomcat_pool;
​
    #文字セット koi8-r;
​
    #access_log ログ/host.access.log メイン;
​
    位置 / {
      #ルートhtml;
      #インデックス index.html index.htm;
      proxy_pass http://tomcat_pool; # tomcat に処理を指示する proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
​
    #エラーページ 404 /404.html;
​
    # サーバーのエラーページを静的ページ /50x.html にリダイレクトします
    #
    エラーページ 500 502 503 504 /50x.html;
    場所 = /50x.html {
      ルートhtml;
    }
​
​
}

3.2. スタンバイノード(192.168.80.21)

注: インストール方法は nginx マスターノードと同じです。

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

4.1. マスターノード (192.168.80.22)

#keepalivedをインストールする
yum インストール keepalived -y
​
#keepalivedサービスを開始します /etc/init.d/keepalived start
-------------------------------------------
[root@hadoop02 anginx]# /etc/init.d/keepalived を開始
keepalived を開始しています: [ OK ]
[root@hadoop02 anginx]# ps -ef |grep keepalived
ルート 15723 1 0 00:59 ? 00:00:00 /usr/sbin/keepalived -D
ルート 15724 15723 0 00:59 ? 00:00:00 /usr/sbin/keepalived -D
ルート 15725 15723 0 00:59 ? 00:00:00 /usr/sbin/keepalived -D
ルート 15731 15622 0 00:59 pts/1 00:00:00 grep keepalived
[root@hadoop02 anginx]#
​
#システムを自動的に起動するように設定する echo "/etc/init.d/keepalived start" >>/etc/rc.local
​
#keepalived サービスをシャットダウンします /etc/init.d/keepalived stop
​
#keepalived設定ファイルを編集する vi /etc/keepalived/keepalived.conf
​
-----------------------------------------------------------
! keepalived の設定ファイル
​
グローバル定義 {
  通知メール{
   メールアドレス
   フェイルオーバー@firewall.loc
   [email protected]
  }
  通知メール送信者 [email protected]
  SMTPサーバー 192.168.200.1
  SMTP_接続タイムアウト 30
  ルータID lb01
}
​
vrrp_インスタンス VI_1 {
  状態マスター
  インターフェース eth1
  仮想ルータID 55
  優先度150
  広告_int 1
  認証
    認証タイプ PASS
    auth_pass サーバー123
  }
  仮想IPアドレス{
    192.168.80.100 dev eth1 ラベル eth1:1
  }
}
.............................................................

設定手順について:

  • [router_id] はルーターの識別子であり、LAN 内で一意である必要があります。
    • 【vrrp_instance VI_1】{...}これは、keepalivedのマスター/スレーブステータス、インターフェース、優先度、認証、IP情報を定義するVRRPインスタンスです。
    • [状態]はVRRPの役割を定義します
    • [interface] は使用するインターフェースを定義します。ここでは、サーバーが使用するネットワーク カードは eth1 です。
    • [virtual_router_id]は仮想ルータIDです。keepalived設定のグループ内のマスターとバックアップは同じに設定されます。
    • [priority]は優先度です。数字が大きいほど優先度が高くなります。
    • 【auth_type】は認証方式です
    • 【auth_pass】は認証パスワードです
  • 【virtual_ipaddress】 {...} 仮想IPアドレスを定義します。複数のIPアドレスを設定できます。ここでは、ネットワークインターフェースeth1、仮想インターフェースeth1:1にバインドされた192.168.80.100として定義します。

4.2. スタンバイノード(192.168.80.21)

#keepalivedをインストールする
yum インストール keepalived -y
​
#keepalivedサービスを開始します /etc/init.d/keepalived start
-------------------------------------------
[root@hadoop02 anginx]# /etc/init.d/keepalived を開始
keepalived を開始しています: [ OK ]
[root@hadoop02 anginx]# ps -ef |grep keepalived
ルート 15723 1 0 00:59 ? 00:00:00 /usr/sbin/keepalived -D
ルート 15724 15723 0 00:59 ? 00:00:00 /usr/sbin/keepalived -D
ルート 15725 15723 0 00:59 ? 00:00:00 /usr/sbin/keepalived -D
ルート 15731 15622 0 00:59 pts/1 00:00:00 grep keepalived
[root@hadoop02 anginx]#
​
#システムを自動的に起動するように設定する echo "/etc/init.d/keepalived start" >>/etc/rc.local
​
#keepalived サービスをシャットダウンします /etc/init.d/keepalived stop
​
#keepalived設定ファイルを編集する vi /etc/keepalived/keepalived.conf
​
-----------------------------------------------------------------
! keepalived の設定ファイル
​
グローバル定義 {
  通知メール{
   メールアドレス
   フェイルオーバー@firewall.loc
   [email protected]
  }
  通知メール送信者 [email protected]
  SMTPサーバー 192.168.200.1
  SMTP_接続タイムアウト 30
  ルータID lb02
}
​
vrrp_インスタンス VI_1 {
  状態 バックアップ
  インターフェース eth1
  仮想ルータID 55
  優先度100
  広告_int 1
  認証
    認証タイプ PASS
    auth_pass サーバー123
  }
  仮想IPアドレス{
    192.168.80.100 dev eth1 ラベル eth1:1
  }
}
.............................................................
​
​

5. テスト

5.1. マスターノードとスタンバイノードのkeepalivedサービスを開始する

#ノード1(192.168.80.22)で実行
/etc/init.d/keepalived 開始
-------------------------------------
[root@hadoop02 anginx]# ps -ef |grep keepalived
ルート 15788 1 0 01:09 ? 00:00:00 /usr/sbin/keepalived -D
ルート 15790 15788 0 01:09 ? 00:00:00 /usr/sbin/keepalived -D
ルート 15791 15788 0 01:09 ? 00:00:00 /usr/sbin/keepalived -D
ルート 15807 15622 0 01:33 pts/1 00:00:00 grep keepalived
[root@hadoop02 anginx]#
​
​
#ノード2(192.168.80.21)で実行
/etc/init.d/keepalived 開始
---------------------------------------
[root@hadoop01 ~]# ps -ef |grep keepalived
ルート 11542 1 0 01:30 ? 00:00:00 /usr/sbin/keepalived -D
ルート 11544 11542 0 01:30 ? 00:00:00 /usr/sbin/keepalived -D
ルート 11545 11542 0 01:30 ? 00:00:00 /usr/sbin/keepalived -D
ルート 11550 11512 0 01:33 pts/1 00:00:00 grep keepalived
[root@hadoop01 ~]#

5.2. 仮想IP経由でサービスにアクセスする

http://192.168.80.100/セッション-redis-デモ/

5.3. マスターノードのkeepalivedサービスを停止する

#ノード1(192.168.80.22)で実行
/etc/init.d/keepalived 停止
​
#スタンバイノードのIPアドレスの変更を確認します
-------------------------------------------
[root@hadoop01 ~]# IPアドレス
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 状態 不明 
  リンク/ループバック 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 スコープ ホスト lo
  inet6 ::1/128 スコープホスト 
    valid_lft 永久 preferred_lft 永久
2: eth1: <BROADCAST、MULTICAST、UP、LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  リンク/イーサ 00:50:56:38:e5:46 brd ff:ff:ff:ff:ff:ff
  inet 192.168.80.21/24 brd 192.168.80.255 スコープ グローバル eth1
  inet 192.168.80.100/32 スコープ グローバル eth1:1
  inet6 fe80::250:56ff:fe38:e546/64 スコープ リンク 
    valid_lft 永久 preferred_lft 永久
[root@hadoop01 ~]#

5.4. 仮想IP経由でサービスへのアクセスを継続する

http://192.168.80.100/セッション-redis-デモ/

6.Keepalived+nginxの統合

説明: nginx デーモン スクリプトを作成します。nginx サービスが失敗した場合は、現在のノードの keepalived サービスを停止します。自動的にスタンバイノードに切り替えます。

6.1. nginxデーモンスクリプトを書く

vi nginx_check.sh
​
--------------------------------------
#!/bin/bash
真実である
する
[ $(netstat -tlnp | grep nginx | ​​wc -l) -ne 1 ]の場合
それから
  /etc/init.d/keepalived 停止
フィ
睡眠2
終わり
​
#スクリプトを承認する chmod u+x nginx_check.sh
​
#スクリプトを実行する nohup /usr/local/develop/anginx/shell/nginx_check.sh &

6.2. マスターノードのnginxサービスを停止する

#マスターノードの nginx サービスを停止します /usr/local/develop/anginx/webserver/nginx/sbin/nginx -s stop
​
#プロセス[root@hadoop02 ~]を検索# ps -ef |grep nginx
ルート 15915 1 0 01:51 ? 00:00:00 /bin/bash /usr/local/develop/anginx/shell/nginx_check.sh
ルート 16516 15753 0 01:54 pts/5 00:00:00 grep nginx
[root@hadoop02 ~]#
​
#スタンバイノードの変化を観察する [サービスは正常です]
IPアドレス
--------------------------------------
[root@hadoop01 シェル]# IPアドレス
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 状態 不明 
  リンク/ループバック 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 スコープ ホスト lo
  inet6 ::1/128 スコープホスト 
    valid_lft 永久 preferred_lft 永久
2: eth1: <BROADCAST、MULTICAST、UP、LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  リンク/イーサ 00:50:56:38:e5:46 brd ff:ff:ff:ff:ff:ff
  inet 192.168.80.21/24 brd 192.168.80.255 スコープ グローバル eth1
  inet 192.168.80.100/32 スコープ グローバル eth1:1
  inet6 fe80::250:56ff:fe38:e546/64 スコープ リンク 
    valid_lft 永久 preferred_lft 永久
[root@hadoop01 シェル]#
​
#マスターノードの nginx と keepalived サービスを再度再起動します /usr/local/develop/anginx/webserver/nginx/sbin/nginx
​
/etc/init.d/keepalived 開始

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 高可用性負荷分散を実現するための HAProxy+Keepalived (理論部分)
  • Vue キャッシュでキープアライブ ページのデータをリフレッシュする方法
  • Java クライアント Etcd の公式リポジトリである jetcd での KeepAlive インターフェイスの実装

<<:  クラウド サーバー Ubuntu_Server_16.04.1 に MySQL をインストールしてリモート接続を有効にする方法

>>:  JavaScript の new 演算子を自分で実装する方法

推薦する

JavaScriptの厳密モードが8進数をサポートしていない問題の説明

JavaScript厳密モードが 8 進数をサポートしていないという問題に関して、まず、 Java...

mysql インストーラ ウェブ コミュニティ 5.7.21.0.msi インストール グラフィック チュートリアル

この記事の例では、Androidの9グリッド画像を表示するための具体的なコードを参考までに共有してい...

Mapper SQL ステートメント フィールドとエンティティ クラス属性名の関係は何ですか?

背景: 1. データベースに通知テーブルがある あなたは見ることができますgmt_create、通知...

MySQL の列から行への変換と年月グループ化の例

以下のように表示されます。 SELECT count(DISTINCT(a.rect_id)) zc...

高品質なコードを書く Web フロントエンド開発実践書の抜粋

(P4) Web 標準は一連の標準で構成されています。中心となる概念は、Web ページの構造、スタイ...

CentOS7 で docker を使用して Apollo 構成センターをデプロイする実装

Apollo オープンソース アドレス: https://github.com/ctripcorp/...

ウェブページコンテンツの閲覧設計手法に関する議論

<br />コンテンツ ページの記事の場合、記事が長すぎる場合やカテゴリ (ランキング)...

カスタムスクロールバー効果を実現するJavaScript

実際のプロジェクトでは、上下のスクロール バーと左右のスクロール バーは DIV 内にないため、右の...

overflow:autoの使い方の詳しい説明

本文に入る前に、オーバーフローとフレックスレイアウトの使い方をいくつか紹介します。 overflow...

WeChatアプレットでのwxsファイルの素晴らしい使い方をいくつか紹介します

目次序文応用フィルタードラッグファイル間での参照の受け渡しwxsはjsロジック層にパラメータを渡しま...

JavaScript 組み込みの日付と時刻の書式設定のサンプル コード

1. 基礎知識(日付オブジェクトのメソッド) 😜 getFullYear() は年を表す4桁の数字を...

Vue で axios を使用して画像をアップロードするときに発生する問題

目次FormDataとは何ですか? vueとaxiosの協力による実践的な体験追加()セット()消去...

Linux 編集の開始、停止、再起動の Springboot jar パッケージ スクリプトの例

序文springboot設定ファイルでは、設定ファイルの名前には独自の意味と用途があります。 dev...

Linux に MySQL 8.0.19 をインストールするための詳細な手順と問題解決方法

最近Tencent Cloudサーバーを購入し、環境を構築しました。このメモは、これまで MySQL...

Linux yum コマンドを使用して mysql8.0 をインストールする方法の詳細なチュートリアル

1. 設置前によく掃除する rpm -pa | grep mysql または rpm -qa | g...