VIPの転送を実現keepalivedのもとに、LVS、nginxの高可用性
A、keepalivedの高可用性クラスタソリューション
二、VRRP有限状態マシン
第三に、使用はVIPからの切り替えを実現keepalivedの
第四には、カスタム通知を状態遷移実装します
第五に、負荷分散を達成するために
6:高可用性を実現するnginxの
A、keepalivedの高可用性クラスタソリューション
オリジナルの出生IPVSは自動的に、自分のipvsadmのコマンド生成規則をすることができます呼び出すだけでなく、ルールIPVSマスターノードのVIPを「引き継ぐ」ことができkeepalivedの、RealServerのバックエンドでは、マスタノード以外の情報を受け取った後、高い可用性を提供しますノードからのアプリケーションは、顧客サービスに進みます。また、テストのないRealServerのバックエンドの健康状態を有効にします。
一つのノード上のkeepalivedの開始後、マスター主プロセスが生成され、メイン処理は、VRRPスタック(VRRPプロトコルを達成する)チェッカー(ヘルスチェックは、RealServerのバックエンド検出をIPVS)が二つのサブプロセスを生成します
二、VRRP有限状態マシン
初期状態は、次に優先度の高い、MASTERに変換され、他のノードと同様に、その優先度情報、に通知を送信、BACKUPのとき両側後VRRPノードは、まだ始まったばかり、状態遷移を実装し始めていますそうでない場合、またはBACKUP、状態のこの時間はユーザーのためのサービスを提供し、マスターノードでサービスを開始するには、ノードがハングアップした場合、そのバックアップに変換、優先度が低減され、優先順位を上昇、別のノードMASTERに変換、サービスは、このノードから始まり、VIP、VMACは、ユーザーにサービスを提供し、ノードに転送されます
実験環境:
バージョンのWebホスティング:
CentOS6.4-i686の
二つのノード:
node1.limian.com 172.16.6.1
node2.limian.com 172.16.6.10
レディ
1、ノード:
時刻同期:
[ルート@ノード1〜]#ntpdateを172.16.0.1
インストールkeepalivedの
[ルート@ノード1〜]#yumを-y keepalivedのインストール
2、2つのノードが同じ仕事をします
第三に、使用はVIPからの切り替えを実現keepalivedの
3.1今後の修正keepalivedの設定ファイルを:
[ルート@ノード1〜]#のCDの/ etc / keepalivedの/ [ルート@ node1のkeepalivedの]#cpはkeepalived.conf keepalived.conf.back //設定ファイルのバックアップを与える何 [ルート@ node1のkeepalivedの]#vimの keepalived.conf
3.2グローバルステージ
{global_defs メールサービスの{//定義notification_email ローカルホスト@ルート//本明細書機に、受信者を定義するが、テスト用途 } notification_email_from kaadmin @ // localhostの定義された差出人、 SMTP_SERVER定義//メールサーバ127.0.0.1 、あなたは外部アドレスを使用することはできません タイムアウト30 // smtp_connect_timeout LVS_DEVELのROUTER_ID }
VRRP段階の定義3.3
VI_1 {仮想ルーティング、VI_1仮想経路識別子、独自の定義の名前の//定義vrrp_instance オープン状態MASTER //、ノードの優先順位が他のノードよりも高い優先度で、マスタ状態に インターフェースeth0 //すべての通知およびその他の情報このインターフェースeth0から出 仮想ルーティングのvirtual_router_id 7 // ID、およびこの仮想MAC IDはまた、最後の段落の源であり、このID番号は、一般的に255以下であり、かつIDがない競合しなければならない 優先順位100 //初期優先順位 番号advert_int 1 //アドバタイズ 認証{//認証機構 AUTH_TYPEのPASS //認証タイプ 1111 //パスワード、ランダムな文字列auth_passべき } virtual_ipaddress {//仮想アドレス、すなわち、VIP 172.16.6.100 } }
私たちは、適切な変更を使用する準備ができない、あなたはノードからコピーする必要があり、ノードの構成ファイルがよく変更されたマスター
[ルート@ node1のkeepalivedの]#scpのkeepalived.conf 172.16.6.1:/etc/keepalived/
ノードへの3.4ログイン。
[ルートノード2 @〜]#CDの/ etc / keepalivedの/ [ルート@ node2のkeepalivedの]#Vimのkeepalived.conf vrrp_instance VI_1 { 国家//ノードからバックアップのステータスを変更し、マスターにマスターノードが、それはバックアップからノード インターフェースeth0を virtual_router_id 7 優先99 //優先順位を変更し、優先度の注意が少ないマスターノードがノードよりもなければならない advert_int。1つの 認証{ AUTH_TYPE PASS AUTH_PASS 1111 } virtual_ipaddress { 172.16.6.100 } }
3.5マスターノードは、サービスを開始します
[ルート@ node1のkeepalivedの]#サービスはkeepalivedのスタート [ルート@ノード1〜]#IP addrはショー//チェックアウト私たちの定義のVIP
3.6は、サービスノードを開始します
[ルート@ node2のkeepalivedの]#サービスが開始keepalivedの
プライマリノードが停止した上でのサービスは、VIPはノードに見ていないだろう
[ルート@ノード2〜]のaddrには、show ip#
3.7プライマリノード上のサービスを開始
[ルート@ノード1〜]#[スタート] -サービスがkeepalivedの [ルート@ノード1〜] //#ショーIP addrの検出結果がVIPはマスターノードに転送しました
注意:
あまりにもあなたの優先順位か、「ノンプリエンプティブモード」の下であれば、「プリエンプティブモード」でのデフォルトARRPの作業によって、あなたは、ノードが停止したサービスを見つけた場合、別のノードすぐにVIPとVMACは、「それを引き継ぎます」このノードがハングアップしない限り高は、サービスノードを停止し、別のノードが「グラブ」VIPとVMACませんが、2つのノードは意志「グラブ」。
第四には、カスタム通知を状態遷移実装します
4.1完全にスクリプトに頼るこの必要性
マスターノード
[ルート@ノード1〜]#のCDの/ etc / keepalivedの/ [ルート@ node1のkeepalivedの]#vimのnotify.sh //编写脚本 #!/ binに/ bashの VIP = 172.16.6.100 接触= 'ルート@ localhost'の thisip = `ifconfigコマンドeth0の| awkの/のinet addrの:/ {$ 2印刷} '| awkの-F: ` '{$ 2印刷}' {)(通知 mailsubject = "BI $のVIPのマスターにあるthisip $" mailbody = "$ VIPがthisipは$浮かべVRRPトランザクション、" |エコー$ mailbodyを メール-s "$ mailsubject" $接触 } 場合には"$ 1"の マスター)は 、マスタ通知 出口0 ;; バックアップ) バックアップ通知 終了0を ;; *) エコー'使用法: `ベース名$ 0' {マスター|バックアップ|障害}' 1番出口 ;; ESAC [ルート@ node1のkeepalivedの]#chmodの+ X notify.sh [ルート@ node1のkeepalivedの]#./notify.shマスター [ルート@ node1のkeepalivedの]#メール//查看有没有收到通知 家宝Mailバージョン12.4 7/29 / 08。タイプ?助けを求めます。 "は/ var /スプール/メール/ルート":1つのメッセージ1新 > N 1ルート水曜日9月25日午前14時54 668分の18 "172.16.6.10は双方向172.16.6.100 MASにあります" &
遷移状態を通知するかどうかを確認してください
[ルート@ node1のkeepalivedの]#./notify.shバックアップ [ルート@ node1のkeepalivedの]#./notify.sh障害 [ルート@ node1のkeepalivedの]#メール 家宝Mailバージョン12.4 7/29/08。タイプ?助けを求めます。 "は/ var /スプール/メール/ルート":3つのメッセージ2新 1つのルート水曜日9月25日午後2時54分679分の19 "172.16.6.10は双方向172.16.6.100 MASにある" > N 2ルート水曜日9月25日14時57 18 / 668「172.16.6.10は双方向172.16.6.100 MASにある」 N 3ルート水曜日9月25日午後02時57分668分の18「172.16.6.10は双方向172.16.6.100 MASにあります」 &
仕事への説明スクリプトは、構成ファイルを編集するために行きます
[ルート@ node1のkeepalivedの]#vimのkeepalived.conf
世界の舞台に追加
vrrp_script chk_mantaince_down {//手動制御スクリプト定義することができる スクリプトを"[[-fの/ etc / keepalivedの/下] &&終了終了。1 || 0" の時間間隔間隔1つの//チェック 重量-2 //テストが失敗した場合、 -2の優先 }
VRRPの段階で、次の行を追加します。
track_script {//引用定义的脚本 chk_mantaince_down } "/etc/keepalived/notify.shマスター" notify_master "/etc/keepalived/notify.shバックアップ" notify_backup "/etc/keepalived/notify.sh障害" notify_fault
4.2は、別のノードにスクリプトをコピーし、
[ルート@ node1のkeepalivedの]#scpのnotify.sh 172.16.6.1:/etc/keepalived/
そして、同じ内容に対応する位置には、設定ファイルに追加されます
どちらも、サービスを再起動するノード
4.3マスターノードがスレーブノードになりましょう
ルート@ノード1 keepalivedの]#タッチダウン
監視することにより、直ちにノードからマスターノードになり、電子メールを受け取ることがわかっ
[ルート@ node1のkeepalivedの]#テール-fの/ var / log / messagesに あなたがの/ var /スプール/メール/ルートに新しいメールを持っています
第五に、負荷分散を達成するために
5.1編集設定ファイル
[ルート@ノード1 keepalivedの]#VIM keepalived.conf #####負荷が#################ステージをバランス 172.16.6.100 80 {// VIPとポート指定VIRTUAL_SERVER delay_loop 6 //サービスを再起動遅延、サービス実行検出何サイクル lb_algo RRロードバランス負荷バランスアルゴリズムは DRタイプはlb_kind 255.255.0.0マスクをnat_mask 0持続的な接続時間persistence_timeout //プロトコルプロトコルTCP 後端172.16.6.11 80 {//定義real_server RealServerの属性 重量1 HTTP_GET {//方法定義する URLのURL {//検出された パス/ STATUS_CODE結果200が取得されるステータスコード// } 接続時間CONNECT_TIMEOUT。3つの// nb_get_retry 3つの//試み 各接続を試みる前に//待機delay_before_retry 3 } } 172.16.6.12 80 {//後端のRealServerで定義された属性real_server 重量1 検出方法のHTTP_GET {//定義 URLを{// URLの検出 パス/ // 200 STATUS_CODEを取得結果のステータスコード } 接続時間CONNECT_TIMEOUT。3つの// nb_get_retry 3つの//試みが 各接続を試みる前に3 //待機をdelay_before_retry } } }
5.2、同じ修正を行ってから、ノード上の
5.3サービスは、コマンドipvsadmの持つルールかどうかを生成し、検出し、再起動します
[ルート@ node1のkeepalivedの]#サービスkeepalivedの再起動 [ルート@ node1のkeepalivedの]#ipvsadmの-L -n IP仮想サーバーのバージョン1.2.1(サイズ= 4096) ProtのをlocalAddress:ポートスケジューラ旗 - > [リモート:ポートフォワード重ActiveConn InActConn TCP 172.16.6.100:80 RR [ルート@ node1のkeepalivedの]#
しかし、なぜ我々はそれを定義するのRealServerなし2?つまり、仮想マシンを起動しなかったため、ヘルスチェックをパスしなかった、それは表示されません、我々は仮想マシンを起動するために行ってきましたし、サービスを開始しています。
そして、次のコマンドを実行DRモデルをロードバランシングLVS行います
LO #ifconfig:最大0 172.16.6.11 172.16.6.11放送ネットマスク255.255.255.255 #route追加172.16.6.11のdevのLO -host:0 #echo 1>は、/ proc / sys / net / IPv4の/ confに/ LO / arp_ignore #echo 1 >は、/ proc / sys / net / IPv4の/ confに/すべて/ arp_ignore #echo 2>は、/ proc / sys / net / IPv4の/ confに/すべて/ arp_announce #echo 2>は、/ proc / sys / net / IPv4の/ confに/ LO / arp_announce
注意:
1、数倍RealServerの後端部を添加してもよいが、マスタノード内の構成において適切な構成ファイルを必要とRealServerを追加するために、関連するコマンドを実行します
2は、keepalivedのIPVSは、負荷分散を独自のルールを追加することができますが、静的および動的な分離を達成することはできませんが、本番環境では、我々は、シーンに応じて最適なソリューションを選択する必要があります。
6:高可用性を実現するnginxの
6.1前提条件
両方のノードでnginxのサービスをインストールし、そして確かにhttpdを有効にしていないことを確認します
#Netstatの-tunlp //ポート80が占有されていないことを確認してください
#サービスnginxの開始
6.2 nginxの編集ノードの各ページ、より直感的に行うために、
[ルート@ノード1〜]#vimの /usr/share/nginx/html/index.html // ノード。1 172.16.6.10 [ルートノード2 @〜] //ノード#Vimの/usr/share/nginx/html/index.html 2 172.16.6.1
6.3通常のアクセスを確保nginxの
6.4は、サービスを停止し、
[ルート@ node1のkeepalivedの]#vimの notify.sh // スクリプトを変更するには、nginxのサービスを監視したり、サービスの有効化または無効化することができ ################## ケース「$ 1 「中 )マスター マスター通知 /etc/rc.d/init.d/nginxスタート 出口0 ;; )バックアップを バックアップ通知 /etc/rc.d/init.d/nginx STOP 出口0 ;; )障害を 障害通知 など/ STOPの/rc.d/init.d/nginxの 出口0 ;; ################################### ###
ノード6.5同期スクリプト2
[ルート@ node1のkeepalivedの]#scpのnotify.sh 172.16.6.1:/etc/keepalived/
6.6プライマリノード
[ルート@ node1のkeepalivedの]#タッチダウン #SS -tunl [ノード1 keepalivedの@ルート]は、80 //ポートがリッスンされていない見つけ 、[ルート@ node1のkeepalivedの]#RM -fダウン [ルート@ node1のkeepalivedの] #SS -tunl //を80ポートは、リスニングを発見されました