高可用性 Web クラスターを実現する Keepalived+Nginx+Tomcat 1. Nginxのインストールプロセス 1. Nginxインストールパッケージをダウンロードし、依存環境パッケージをインストールします。 (1)C++コンパイル環境をインストールする yum -y gcc をインストール #C++ (2)PCREをインストールする yum -y pcre-devel をインストールします (3)zlibをインストールする yum -y zlib-develをインストールします (4)Nginxをインストールする nginxの解凍ファイルの場所を見つけて、コンパイルとインストールのコマンドを実行します。 [root@localhost nginx-1.12.2]# パスワード nginx-1.12.2 をローカルにインストールします。 [root@localhost nginx-1.12.2]# ./configure && make && make install (5) Nginxを起動する インストールが完了したら、まずインストールが完了したディレクトリの場所を見つけます。 [root@localhost nginx-1.12.2]# nginxはどこにあるか nginx: /usr/local/nginx [ルート@localhost nginx-1.12.2]# Nginxサブディレクトリsbinに入り、Nginxを起動します。 [root@localhost sbin]# ls nginx [root@localhost sbin]# ./nginx & [1] 5768 [root@localhost sbin]# Nginxが起動しているか確認する または、プロセスを通じてNginxの起動ステータスを確認します [root@localhost sbin]# ps -aux|grep nginx root 5769 0.0 0.0 20484 608 ? Ss 14:03 0:00 nginx: マスタープロセス ./nginx 誰も 5770 0.0 0.0 23012 1620 ? S 14:03 0:00 nginx: ワーカープロセス ルート 5796 0.0 0.0 112668 972 ポイント/0 R+ 14:07 0:00 grep --color=auto nginx [1]+ ./nginx を完了しました [root@localhost sbin]# この時点で、Nginx は正常にインストールされ、起動されます。 (6) Nginxのクイックスタートとブート構成 Nginx クイック スタート スクリプトを編集します [ Nginx インストール パスに注意してください。独自の NGINX パスに応じて変更する必要があります] [root@localhost init.d]# vim /etc/rc.d/init.d/nginx #!/bin/sh # # nginx - このスクリプトはnginxデーモンを起動および停止します # # chkconfig: -85 15 # 説明: Nginx は HTTP(S) サーバーであり、HTTP(S) リバースです \ # プロキシと IMAP/POP3 プロキシ サーバー # プロセス名: nginx # 設定: /etc/nginx/nginx.conf # 設定: /usr/local/nginx/conf/nginx.conf # pidファイル: /usr/local/nginx/logs/nginx.pid # ソース関数ライブラリ。 . /etc/rc.d/init.d/functions # ソースネットワーク構成。 . /etc/sysconfig/ネットワーク # ネットワークが稼働していることを確認します。 [ "$NETWORKING" = "no" ] && 終了 0 nginx="/usr/local/nginx/sbin/nginx" prog=$(ベース名 $nginx) NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx ロックファイル=/var/lock/subsys/nginx ディレクトリを作る() { # 必要なディレクトリを作成する user=`$nginx -V 2>&1 | grep "configure 引数:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` if [ -z "`grep $user /etc/passwd`" ]; then ユーザー追加 -M -s /bin/nologin $user フィ options=`$nginx -V 2>&1 | grep 'configure 引数:'` オプトイン$options; を行う if [ `echo $opt | grep '.*-temp-path'` ]; then 値=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "作成中" $value mkdir -p $value && chown -R $user $value フィ フィ 終わり } 始める() { [ -x $nginx ] || 終了 5 [ -f $NGINX_CONF_FILE ] || 終了 6 ディレクトリの作成 echo -n $"$prog を開始しています: " デーモン $nginx -c $NGINX_CONF_FILE 戻り値=$? エコー [ $retval -eq 0 ] && $lockfile をタッチ $retvalを返す } 停止() { echo -n $"$prog を停止しています: " プロセスを終了する $prog -QUIT 戻り値=$? エコー [ $retval -eq 0 ] && rm -f $lockfile $retvalを返す } 再起動() { #configtest || $ を返しますか? 停止 睡眠1 始める } リロード() { #configtest || $ を返しますか? echo -n $"$prog を再ロードしています: " nginx を killproc する -HUP RETVAL=$? エコー } 強制リロード() { 再起動 } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { ステータス $prog } rh_status_q() { rh_status >/dev/null 2>&1 } ケース「$1」 始める) rh_status_q && 終了 0 1ドル ;; 停止) rh_status_q || 終了 0 1ドル ;; 再起動|構成テスト) 1ドル ;; リロード rh_status_q || 終了 7 1ドル ;; 強制リロード 強制リロード ;; 状態) rh_ステータス ;; condrestart|再起動を試みる) rh_status_q || 終了 0 ;; *) echo $"使用法: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" 出口2 エサック 起動スクリプトを承認し、起動に追加します [root@localhost init.d]# chmod -R 777 /etc/rc.d/init.d/nginx [root@localhost init.d]# chkconfig nginx Nginxを起動する [root@localhost init.d]# ./nginx を起動します システム環境変数にNginxを追加する [root@localhost init.d]# echo 'export PATH=$PATH:/usr/local/nginx/sbin' >>/etc/profile && source /etc/profile Nginx コマンド [service nginx (start|stop|restart)] [root@localhost init.d]# サービス nginx を開始 nginx を起動しています (systemctl 経由): [ OK ] ヒント:クイックコマンド サービス nginx (開始|停止|再起動) 2. KeepAlivedのインストールと設定 1. Keepalived依存環境をインストールする yum インストール -y popt-devel yum インストール -y ipvsadm yum インストール -y libnl* yum インストール -y libnf* yum インストール -y openssl-devel 2. Keepalivedをコンパイルしてインストールする [root@localhost keepalived-1.3.9]# ./configure [root@localhost keepalived-1.3.9]# 作成 && インストール 3. システムサービスとしてKeepaliveをインストールする [root@localhost など]# mkdir /etc/keepalived [root@localhost など]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ デフォルトの設定ファイルを手動でデフォルトのパスにコピーする [root@localhost など]# mkdir /etc/keepalived [root@localhost など]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ [root@localhost など]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ keepalived のソフトリンクを作成する [root@localhost sysconfig]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/ 起動時にKeepalivedを自動的に起動するように設定する [root@localhost sysconfig]# chkconfig keepalived オン 注: リクエストを 'systemctl enable keepalived.service' に転送します。 /etc/systemd/system/multi-user.target.wants/keepalived.service から /usr/lib/systemd/system/keepalived.service へのシンボリックリンクを作成しました Keepalivedサービスを開始する [root@localhost keepalived]# keepalived -D -f /etc/keepalived/keepalived.conf Keepalivedサービスを停止する [root@localhost keepalived]# killall keepalived 3. クラスターの計画と構築 環境準備: セントOS7.2 Keepalived バージョン 1.4.0 - 2017 年 12 月 29 日 Nginx バージョン: nginx/1.12.2 Tomcat バージョン:8 クラスター計画チェックリスト |
仮想マシン | IP | 例示する |
---|---|---|
Keepalived+Nginx1[マスター] | 192.168.43.101 | Nginx サーバー 01 |
Keepalived+Nginx[バックアップ] | 192.168.43.102 | Nginx サーバー 02 |
トムキャット01 | 192.168.43.103 | Tomcat Web サーバー01 |
トムキャット02 | 192.168.43.104 | Tomcat Web サーバー02 |
上級 | 192.168.43.150 | バーチャルドリフトIP |
1. Tomcatのデフォルトのウェルカムページを変更してWebへの切り替えを識別します。
TomcatServer01 ノードの ROOT/index.jsp 情報を変更し、Tomcat IP アドレスを追加し、Nginx 値を追加します。つまり、ノード 192.168.43.103 情報を次のように変更します。
<div id="asf-box"> <h1>${pageContext.servletContext.serverInfo}(192.168.224.103)<%=request.getHeader("X-NGINX")%></h1> </div>
TomcatServer02 ノードの ROOT/index.jsp 情報を変更し、Tomcat IP アドレスを追加し、Nginx 値を追加します。つまり、ノード 192.168.43.104 情報を次のように変更します。
<div id="asf-box"> <h1>${pageContext.servletContext.serverInfo}(192.168.224.104)<%=request.getHeader("X-NGINX")%></h1> </div>
2. Tomcat サービスを起動し、Tomcat サービスの IP 情報を確認します。この時点では Nginx は起動されていないため、リクエスト ヘッダーには Nginx 情報が含まれません。
3. Nginxプロキシ情報を設定する
1. マスターノード[192.168.43.101]のプロキシ情報を設定する
アップストリームTomcat { サーバー 192.168.43.103:8080 重み=1; サーバー 192.168.43.104:8080 重み=1; } サーバ{ 位置 / { proxy_pass http://tomcat; proxy_set_header X-NGINX "NGINX-1"; } #......その他省略}
2. バックアップノード[192.168.43.102]のプロキシ情報を構成する
アップストリームTomcat { サーバー 192.168.43.103:8080 重み=1; サーバー 192.168.43.104:8080 重み=1; } サーバ{ 位置 / { proxy_pass http://tomcat; proxy_set_header X-NGINX "NGINX-2"; } #......その他省略}
3. マスターノードのNginxサービスを開始する
[root@localhost init.d]# サービス nginx を開始 nginx を起動しています (systemctl 経由): [ OK ]
このとき、192.168.43.101 にアクセスすると、Tcomat ノード 103 と 104 が交互に表示され、Nginx サービスが 2 つの tomcat にリクエストをロードしたことがわかります。
4. 同様に、バックアップ [192.168.43.102] Nginx 情報を設定します。Nginx を起動した後、192.168.43.102 にアクセスすると、バックアップ ノードが負荷の役割を果たしていることがわかります。
4. Keepalivedスクリプト情報を設定する
1.マスターノードとスレーブノードの/etc/keepalivedディレクトリにcheck_nginx.shファイルを追加して、Nginxのインベントリステータスを検出し、keepalived.confファイルを追加します。
check_nginx.sh ファイルの情報は次のとおりです。
#!/bin/bash #ログを記録するために使用される時間変数 d=`date --date today +%Y%m%d_%H:%M:%S` # nginx プロセスの数を計算します n=`ps -C nginx --no-heading|wc -l` #プロセスが0の場合は、nginxを起動して、nginxプロセスの数を再度確認します。 #まだ0の場合は、nginxを起動できないことを意味し、keepalivedをオフにする必要があります [ $n -eq "0" ]の場合; /etc/rc.d/init.d/nginx を起動します n2=`ps -C nginx --no-heading|wc -l` [ $n2 -eq "0" ]の場合; echo "$d nginx がダウンしました。keepalived は停止します" >> /var/log/check_ng.log systemctl 停止キープアライブ フィ フィ
追加後、スクリプトが実行権限を取得できるように check_nginx.sh ファイルを承認します。
[root@localhost keepalived]# chmod -R 777 /etc/keepalived/check_nginx.sh
2. マスターノードの /etc/keepalived ディレクトリに keepalived.conf ファイルを追加します。具体的な情報は次のとおりです。
vrrp_script chk_nginx { スクリプト "/etc/keepalived/check_nginx.sh" // nginx プロセスを検出するためのスクリプト間隔 2 体重 -20 } グローバル定義 { 通知メール{ //メールリマインダーを追加できます} } vrrp_インスタンス VI_1 { 状態 MASTER #状態が MASTER であり、バックアップマシンが BACKUP であることを示します インターフェース ens33 #インスタンスにバインドされたネットワーク カードを設定します (IP アドレスを確認し、個人のネットワーク カードに応じてバインドする必要があります) virtual_router_id 51 #同じインスタンスではvirtual_router_idは同じである必要があります mcast_src_ip 192.168.43.101 優先度250 #MASTERはBACKUPよりも優先度が高い。例えば、BACKUPは240である。 advert_int 1 #マスターとバックアップのロードバランサー間の同期チェックの間隔(秒単位) nopreempt #非プリエンプティブモード authentication { #認証を設定する auth_type PASS #マスタースレーブサーバー認証方法 auth_pass 123456 } トラックスクリプト { チェック_nginx } virtual_ipaddress { #VIPを設定する 192.168.43.150 # 複数の仮想 IP を設定できます。行を折り返すだけです} }
3. バックアップノードのetc/keepalivedディレクトリにkeepalived.conf設定ファイルを追加します。
情報は以下の通りです。
vrrp_script chk_nginx { スクリプト "/etc/keepalived/check_nginx.sh" // nginx プロセスを検出するためのスクリプト間隔 2 体重 -20 } グローバル定義 { 通知メール{ //メールリマインダーを追加できます} } vrrp_インスタンス VI_1 { 状態 BACKUP #状態が MASTER であり、バックアップ マシンが BACKUP であることを示します interface ens33 #インスタンスにバインドされたネットワーク カードを設定します (IP アドレスで表示) virtual_router_id 51 #同じインスタンスではvirtual_router_idは同じである必要があります mcast_src_ip 192.168.43.102 優先度 240 #MASTER は BACKUP よりも優先度が高くなります。たとえば、BACKUP は 240 です。 advert_int 1 #マスターとバックアップのロードバランサー間の同期チェックの間隔(秒単位) nopreempt #非プリエンプティブモード authentication { #認証を設定する auth_type PASS #マスタースレーブサーバー認証方法 auth_pass 123456 } トラックスクリプト { チェック_nginx } virtual_ipaddress { #VIPを設定する 192.168.43.150 # 複数の仮想 IP を設定できます。行を折り返すだけです} }
ヒント:設定情報に関する注意事項
5. クラスターの高可用性 (HA) 検証
ステップ1 マスターマシンでKeepalivedとNginxサービスを開始する
[root@localhost keepalived]# keepalived -D -f /etc/keepalived/keepalived.conf [root@localhost keepalived]# サービス nginx を開始
サービスの起動プロセスを表示する
[root@localhost keepalived]# ps -aux|grep nginx root 6390 0.0 0.0 20484 612 ? Ss 19:13 0:00 nginx: マスタープロセス /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 誰も 6392 0.0 0.0 23008 1628 ? S 19:13 0:00 nginx: ワーカープロセス ルート 6978 0.0 0.0 112672 968 ポイント/0 S+ 20:08 0:00 grep --color=auto nginx
Keepalived の起動プロセスを表示する
[root@localhost keepalived]# ps -aux|grep keepalived ルート 6402 0.0 0.0 45920 1016 ? Ss 19:13 0:00 keepalived -D -f /etc/keepalived/keepalived.conf ルート 6403 0.0 0.0 48044 1468 ? S 19:13 0:00 keepalived -D -f /etc/keepalived/keepalived.conf ルート 6404 0.0 0.0 50128 1780 ? S 19:13 0:00 keepalived -D -f /etc/keepalived/keepalived.conf ルート 7004 0.0 0.0 112672 976 ポイント/0 S+ 20:10 0:00 grep --color=auto keepalived
ip add を使用して仮想 IP のバインド状態を確認します。192.168.43.150 ノード情報が表示された場合、マスター ノードにバインドされています。
[root@localhost keepalived]# ip を追加 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 状態 UNKNOWN qlen 1 リンク/ループバック 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 スコープ ホスト lo valid_lft 永久 preferred_lft 永久 inet6 ::1/128 スコープホスト valid_lft 永久 preferred_lft 永久 2: ens33: <BROADCAST、MULTICAST、UP、LOWER_UP> mtu 1500 qdisc pfifo_fast 状態 UP qlen 1000 リンク/イーサ 00:0c:29:91:bf:59 brd ff:ff:ff:ff:ff:ff inet 192.168.43.101/24 brd 192.168.43.255 スコープ グローバル ens33 valid_lft 永久 preferred_lft 永久 inet 192.168.43.150/32 スコープ グローバル ens33 valid_lft 永久 preferred_lft 永久 inet6 fe80::9abb:4544:f6db:8255/64 スコープ リンク valid_lft 永久 preferred_lft 永久 inet6 fe80::b0b3:d0ca:7382:2779/64 スコープ リンク 暫定 dadfailed valid_lft 永久 preferred_lft 永久 inet6 fe80::314f:5fe7:4e4b:64ed/64 スコープ リンク暫定 dadfailed valid_lft 永久 preferred_lft 永久 3: virbr0: <NO-CARRIER、BROADCAST、MULTICAST、UP> mtu 1500 qdisc noqueue state DOWN qlen 1000 リンク/イーサ 52:54:00:2b:74:aa brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 スコープ グローバル virbr0 valid_lft 永久 preferred_lft 永久 4: virbr0-nic: <ブロードキャスト、マルチキャスト> mtu 1500 qdisc pfifo_fast マスター virbr0 状態 DOWN qlen 1000 リンク/イーサ 52:54:00:2b:74:aa brd ff:ff:ff:ff:ff:ff
ステップ 2 バックアップ ノードで Nginx サービスと Keepalived サービスを開始し、サービスの起動ステータスを確認します。バックアップ ノードに仮想 IP が表示される場合は、Keepalived 構成ファイルに問題があります。この状況はスプリット ブレインと呼ばれます。
[root@localhost keepalived]# クリア [root@localhost keepalived]# ip を追加 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 状態 UNKNOWN qlen 1 リンク/ループバック 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 スコープ ホスト lo valid_lft 永久 preferred_lft 永久 inet6 ::1/128 スコープホスト valid_lft 永久 preferred_lft 永久 2: ens33: <BROADCAST、MULTICAST、UP、LOWER_UP> mtu 1500 qdisc pfifo_fast 状態 UP qlen 1000 リンク/イーサ 00:0c:29:14:df:79 brd ff:ff:ff:ff:ff:ff inet 192.168.43.102/24 brd 192.168.43.255 スコープ グローバル ens33 valid_lft 永久 preferred_lft 永久 inet6 fe80::314f:5fe7:4e4b:64ed/64 スコープ リンク valid_lft 永久 preferred_lft 永久 3: virbr0: <NO-CARRIER、BROADCAST、MULTICAST、UP> mtu 1500 qdisc noqueue state DOWN qlen 1000 リンク/イーサ 52:54:00:2b:74:aa brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 スコープ グローバル virbr0 valid_lft 永久 preferred_lft 永久 4: virbr0-nic: <ブロードキャスト、マルチキャスト> mtu 1500 qdisc pfifo_fast マスター virbr0 状態 DOWN qlen 1000 リンク/イーサ 52:54:00:2b:74:aa brd ff:ff:ff:ff:ff:ff
ステップ3 サービスを確認する
アドレスを複数回参照して強制的に更新します: http://192.168.43.150。103 と 104 が交互に複数回表示され、Nginx-1 が表示され、マスター ノードが Web サービスを転送していることがわかります。
ステップ4 マスターkeepalivedサービスとNginxサービスを閉じ、Webサービスにアクセスしてサービス転送ステータスを確認します。
[root@localhost keepalived]# killall keepalived [root@localhost keepalived]# サービス nginx を停止します
この時、192.168.43.150 を強制的に更新すると、ページには 103 と 104 が交互に表示され、Nginx-2 が表示されることがわかります。VIP は 192.168.43.102 に転送されており、サービスが自動的にバックアップ ノードに切り替わっていることが証明されています。
ステップ5 マスターKeepalivedサービスとNginxサービスを開始する
この時、VIPがMasterに奪還され、ページには103と104が交互に表示されていることを再度確認しました。この時、Nginx-1が表示されています。
4. Keepalived プリエンプティブモードと非プリエンプティブモード
Keepalived の HA は、プリエンプティブ モードと非プリエンプティブ モードに分かれています。プリエンプティブ モードでは、MASTER が障害から回復した後、BACKUP ノードから VIP をプリエンプトします。非プリエンプティブ モードとは、MASTER が復元された後、BACKUP が MASTER にアップグレードされた後の VIP がプリエンプトされないことを意味します。
非プリエンプティブモード構成:
1> vrrp_instanceブロックの下の2つのノードそれぞれにnopreempt命令を追加し、VIP競合が不要であることを示します。
2> ノードの状態は BACKUP です。両方の keepalived ノードが起動すると、デフォルトで BACKUP 状態になります。マルチキャスト情報を送信した後、両者は優先度に基づいて MASTER を選出します。両方に nopreempt が設定されているため、マスターは障害から回復した後、VIP をプリエンプトしません。これにより、VIP の切り替えによって発生する可能性のあるサービスの遅延を回避できます。
以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。
<<: Vue が DingTalk の出勤カレンダーを実装
>>: MySQL Community Server 5.6.39 のインストール方法
簡単に言うと、今日は Gitlab-CI を使用してリモート サーバーに自動的にデプロイする方法につ...
1. /etc ディレクトリ内の、文字以外の文字で始まり、その後に文字と任意の長さのその他の文字が続...
ページ内にはjs、cssなどの外部ファイルが導入されており、外部ファイルのエンコードが現在のページフ...
目次MySQLがmy.cnfを読み込む順序1. mysql.server の起動方法2. mysql...
背景まず、背景を説明します。ある制約により、当社の現在のバックアップ戦略では、1 日おきにフル バッ...
効果 html <本文> <div class="content&quo...
URL: http://hostname.com/contextPath/servletPath/p...
次のコードを index.html などのデフォルトのホームページ ファイルとして保存し、ルート デ...
この記事では、Linux のユーザーとグループの管理によく使用されるコマンドをまとめます。ご参考まで...
1. コマンドの紹介read コマンドは、シェルの組み込みコマンドで、標準入力または -u オプショ...
エンジン導入InnodbエンジンInnodb エンジンは、データベース ACID トランザクションを...
フォームを入力不可にしたい場合は、フォームを次のように設定します。コードをコピーコードは次のとおりで...
Web ページのパフォーマンスを向上させるにはどうすればよいでしょうか?ほとんどの開発者は、Java...
リンクのターゲット属性は、リンクが開く場所を決定します。その値は通常、_blank、_self、_p...
前回の記事「MySQL テーブル構造の変更、メタデータ ロックを知っておく必要があります」では、MD...