Keepalivedベースの高可用性クラスタ構成インスタンスの構築


クラスタとは
簡単に言えば、クラスタ(cluster)は、ネットワークリソースのセットを全体としてユーザーに提供するコンピュータのセットです.これらの単一のコンピュータシステムはクラスタのノード(node)である.理想的なクラスタは、ユーザがクラスタシステムの最下位のノードを意識したことがないことであり、彼/彼女たちから見れば、クラスタは複数のコンピュータシステムではなく、システムである.また、クラスタシステムの管理者は、クラスタシステムのノードを任意に追加および削除することができる.より詳細な高可用性クラスタについては後述するが,まずKeepalivedについて述べる
Keepalivedって何?
Keepalivedはクラスタ管理においてクラスタの高可用性を保証するサービスソフトウェアであり、heartbeatと同様の機能を有し、単一の障害を防止する.高可用性クラスタのために生まれたと言える...
keepalived動作原理
KeepalivedはVRRPプロトコルに基づいており、VRRPフルネームVirtual Router Redundancy Protocol、すなわち仮想ルーティング冗長プロトコルである.仮想ルーティング冗長プロトコルは、ルータの高可用性を実現するプロトコルと考えられ、N台が同じ機能を提供するルータから1つのルータグループを構成する.このグループには1つのmasterと複数のbackupがあり、masterの上には対外的にサービスを提供するVIP(このルータがあるローカルエリアネットワーク内の他の機器のデフォルトルーティングはこのVIP)があり、Masterはマルチキャストを送信し、BackupがVRRPパッケージを受け取れない場合、Masterがダウンしたと考えられる.この場合、VRRPの優先度に基づいてMasterとしてBackupを選択する必要があります.これでルータの高可用性が保証されます.Keepalivedには主にcore,check,vrrpの3つのモジュールがある.coreモジュールはkeepalivedの核心であり、メインプロセスの起動、メンテナンス、グローバルプロファイルのロードと解析を担当します.checkは健康診断を担当し、よく見られる様々な検査方法を含む.VRRPモジュールは、VRRPプロトコルを実装するために使用される.
keepalived拡張VRRPプロトコル原理
1、一つのVRRPルータには唯一の識別がある:VRID範囲が0-255はこのルータが対外的に唯一の仮想MACアドレスとして表現され、アドレスのフォーマットが00-00-5 E-00-01-[VRID]のマスタルータはARP要求に対してこのMACアドレスで応答することを担当する.2、VRRP制御メッセージは一つだけ:VRRP通知(advertisement)IPマルチキャストパケットを使用してカプセル化され、グループアドレスは224.0.0.0.18である.公開範囲は同じローカルエリアネットワーク内に限定され、VRIDが異なるネットワークで再利用できることを保証します.ネットワーク帯域幅の消費を減らすためにマスタルータのみが周期的に送信できるVRRP通知メッセージバックアップルータは、連続した3つの通知間隔でVRRPを受信できないか、または優先レベル0の通知を受信した後、新しいVRRP選挙を開始します.3、上述したVRRPルータグループの中で、優先度によってマスタールータを選出し、VRRPプロトコルの優先度範囲は0-255 VRRPルータのIPアドレスと仮想ルータのインタフェースIPアドレスが同じであれば、この仮想ルータをVRRPグループのIPアドレス所有者と呼ぶ.IPアドレス所有者は自動的に最高優先度を持つ:255優先度0一般的にIPアドレス所有者が自主的にマスターロールを放棄する際に使用可能な優先度範囲が1-254優先度の構成原則を使用すると、リンクの速度とコストルータの性能と信頼性、その他の管理戦略に基づいてマスタールータを設定する選挙で、高優先度の仮想ルータが勝つため、VRRPグループにIPアドレス所有者がいる場合、これは、常にマスタルーティングの役割として同じ優先度の候補ルータとして現れ、IPアドレスサイズ順にVRRPを選択することで優先度プリエンプトポリシーも提供され、このポリシーが構成されている場合、高優先度のバックアップルータは現在の低優先度のマスタルータを剥奪して新しいマスタルータとなる.4、VRRPプロトコルの安全性を保証するために、2種類の安全認証措置を提供した:明文認証とIPヘッダ認証.明文認証方式の要求:一つのVRRPルータグループに加入する時、同じVRIDと明文パスワードを同時に提供しなければならないのはローカルエリアネットワーク内の配置ミスを避けるのに適しているが、ネットワーク傍受方式でパスワードIPヘッダ認証を獲得する方式がより高い安全性を提供することを防止できない.我々はKeepalivedがVRRPプロトコルに基づいてどのように高可用性クラスタを実現するかを概念的に理解しているが,以下では簡単に一例を構成して印象を深める
keepalivedコアコンポーネント
vrrp stack ipvs wrapper checkers制御コンポーネント:プロファイルアナライザIOマルチプレクサメモリ管理コンポーネント
テスト環境
実験プラットフォーム:Windows 10_64仮想環境:Winシステムに基づいて構築されたVMware仮想ホストの実現に必要な仮想ホスト:2台、CentOS 7.2またはCentOS 6.8、オフセットCentOS 7.2仮想ホストのIPアドレスは:node 1アドレス、10.1.15.43、node 2アドレス、10.1.15.44
Keepalived HA Clusterベースの構成の前提条件
(1)各ノード時間は同期しなければならない.ntp、またはchrony同期ホスト時間(2)を使用して、iptablesおよびselinuxが障害にならないようにします.(3)各ノード間でホスト名による相互通信が可能(KAオプション)各ノード間のrootユーザが鍵認証のsshサービスに基づいて相互通信を完了できることを/etc/hostsファイルを用いて提案する(4)(オプション)
  ntp         ,     
ntpdate 10.1.0.1
           server    chrony  
vim /etc/chrony.conf
server 10.1.0.1 iburst 
chronyc sources//              
         date      
date XXXXXX//  date  
[root@localhost ~]# getenforce 
Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce 
Permissive
[root@localhost ~]# iptables -F
[root@localhost ~]# 
                      ip,        (   )
              :    ,         ,     
  node1        10.1.253.43
[root@localhost ~]# ssh-keygen -t rsa -P '' //         
            
ssh-copy-id -i .ssh/id_rsa.pub [email protected]
             
[root@localhost ~]# ssh [email protected]
Last login: Mon Oct 31 13:34:38 2016 from 10.1.15.85
[root@localhost ~]# 
  ......

Keepalivedの構成
KeepalivedはCentos 6以降base倉庫に収集されているので、yumに直接インストールすることができます.
yum install keepalived

Keepalivedプログラム環境:プロファイルは:/etc/keepalived/keepalived.confメインプログラムファイル:/usr/sbin/keepalived Unit Fileサービスファイル:keepalived.service
Keepalivedプロファイルコンポーネント
keepalivedプロファイルcp/etc/keepalived/keepalivedをバックアップする.conf{,.back}
GLOBAL CONFIGURATION //     
    Global definitions //    
    Static routes/addresses //      
VRRPD CONFIGURATION //VRRP  ,           
    VRRP synchronization group(s)// VRRP   
    VRRP instance(s) //VRRP  
LVS CONFIGURATION//      
    Virtual server group(s)// 
    Virtual server(s)//

シングルマスターモデルの構成(マスターノードIP:10.1.15.43)
        ,               ,   vip    
  etc   keepalived  keepalived.conf        
vim /etc/keepalived/keepalived.conf
          virtual_ipaddress         :.,$d,    
! Configuration File for keepalived //keepalived      
global_defs { 
   notification_email { //      ,     
    root@localhost //              
}
   notification_email_from keepalived@localhost //    ,   
   smtp_server 127.0.0.1//      ,       
   smtp_connect_timeout 30 //smtp        ,30 
   router_id node1 //          ,           
   vrrp_mcast_group4 224.15.15.15 //      
} //        MULTICAST    ,     
vrrp_instance VI_1 { //VI_1  VRRP  ,           
    state MASTER //                 ,       
    interface eno16777736 //              
    virtual_router_id 20 //            ,   0-255
    priority 100 //                ;  1-254
    advert_int 1 //vrrp       
    authentication { //    
        auth_type PASS //  
        auth_pass 6b8a916c //             
    } //       :openssl rand -hex 4
    virtual_ipaddress { //     ip  ,      ,                       ,            ,       
    10.1.15.50/16 
}
}
    scp        ,      priority   state  。
scp keepalived.conf [email protected]:/etc/keepalived/

シングルマスターモデルの構成(スタンバイノードIP:10.1.15.44)
  etc   keepalived  keepalived.conf        
vim /etc/keepalived/keepalived.conf
          virtual_ipaddress         :.,$d,    
! Configuration File for keepalived
global_defs {
   notification_email {
    root@localhost   
}
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
   vrrp_mcast_group4 224.15.15.15
}
vrrp_instance VI_1 {
    state BACKUP
    interface eno16777736
    virtual_router_id 20
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 6b8a916c 
    }
    virtual_ipaddress {
    10.1.15.50/16 
}
}
      :
         43,44    keepalived  ,       ,            ,                 master  ,    。
[root@node1 ~]# systemctl start|stop| keepalived.service
[root@node1 ~]# tail -f /var/log/messages

デュアルプライマリ・モデルの構成(プライマリ・スタンバイ、プライマリ・モデルの準備)
   ip:10.1.15.43    :10.1.15.44
  etc   keepalived  keepalived.conf        
vim keepalived.conf   vrrp_instance VI_2 {    
    scp             ,      priority   state  。
scp keepalived.conf [email protected]:/etc/keepalived/
              
! Configuration File for keepalived
global_defs {
   notification_email {
    root@localhost   
}
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
   vrrp_mcast_group4 224.15.15.15
}
vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 20
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 6b8a916c 
    }
    virtual_ipaddress {
    10.1.15.50/16 
}
}
vrrp_instance VI_2 {
    state BACKUP
    interface eno16777736
    virtual_router_id 30
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 6b9a916c 
    }
    virtual_ipaddress {
    10.1.15.60/16 
}
}
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
        ,                     
[root@node1 ~]# systemctl start|stop| keepalived.service
[root@node1 ~]# tail -f /var/log/messages
    ,         ,      

3つのステータス検出(master,backup,faultステータス)をトリガーするスクリプトを書きます.
      notify.sh   etc/keepalived/   ,          ,     :./notify.sh master/BACKUP/fault,     ip    
#!/bin/bash
#
#      ,        
contact='root@localhost'
#      notify,     
notify() 
{
#    local  ,    ,          ,  vip     
mailsubject="$(hostname) to be $1, vip floating"
#    ,    ,      ,     vrrp     ,        
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
#   ,mailbody        ,    ,      
echo "$mailbody" | mail -s "$mailsubject" $contact
}
#      
case $1 in
#       master
    master)
    notify master
#    notify  ,      
;;
    backup)
    notify backup
;;
    fault)
    notify fault
;;
#    ,     ,      
    *)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit 1
;;
esac
         bash   chmod +x notify.sh,       
  :
./notify.sh        master  BACKUP  fault
                   ,     mail         

以上のテストが完了しました.次にKeepalivedベースの高可用性クラスタを構成します.
httpサービスをテストターゲットとする
テストの環境とホスト私達はすべて上のLVSのDR模型を使ってKeepalivedと結合して高利用可能なクラスタを配置して、サービスのスケジューリングの配置のトポロジーの再細分化を実現します:2台のDirector serverはVIPになって、2台のReal serverは検出機になって、各ノードはスイッチに接続されたIPアドレス:10.1.15.43,10.1.15.44 Real server 1とReal server 2の2台のReal serverの80ポートとしてそれぞれサービスIPアドレスを提供する:10.1.15.45,10.1.15.46 Director serverとしてVIP VIP serverの回転アドレスが10.1.15.50ポートでwebサービスを提供する
vipのカーネルパラメータを構成してlo:0にポーリングのipアドレスを加える
         
!#/bin/bash
#
vip='10.1.15.50'
vport='80'
netmask='255.255.255.255'
iface='lo:0'
case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ifconfig $iface $vip netmask $netmask broadcast $vip up
    route add -host $vip dev $iface
esac
        

Real server 1および2ホストでkeepalivedを使用して10.1.15.50アドレスをポーリング
  keepalived.conf     ,      ,Real server1 2    ,       
    ! Configuration File for keepalived
    global_defs {
       notification_email {
        root@localhost   
    }
       notification_email_from keepalived@localhost
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node1
       vrrp_mcast_group4 224.15.15.15
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface eno16777736
        virtual_router_id 20
        priority 98
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 6b8a916c 
        }
        virtual_ipaddress {
        10.1.15.50/16 //           
    }
    } 
        notify_master "/etc/keepalived/notify.sh master"
        notify_backup "/etc/keepalived/notify.sh backup"
        notify_fault "/etc/keepalived/notify.sh fault"
####          50       Director server  web  
>        real server    ipvsadm  ,  10.1.15.50        Director server  web         ,      
>  real server      ,real server1 2    ,     ,           web        。
    [root@node1 keepalived]# ipvsadm -A -t 10.1.15.50:80 -s rr
    [root@node1 keepalived]# ipvsadm -a -t 10.1.15.50:80 -r 10.1.15.45 -g -w 1
    [root@node1 keepalived]# ipvsadm -a -t 10.1.15.50:80 -r 10.1.15.46 -g -w 1
>      curl     real server           Director server web           
>   :    real server  keepalived   50    ,      
        curl http://10.1.15.50
        [root@Centos6 ~]# curl 10.1.15.50
        

RS 1 

           [root@Centos6 ~]# curl 10.1.15.50         

 RS 2 

        [root@Centos6 ~]#           , Director server web      ####  Real server 1 keepalived.con      Real server 1  Real server 2      scp keepalived.conf [email protected]:/etc/keepalived/ ! Configuration File for keepalived global_defs {    notification_email {     root@localhost    }    notification_email_from keepalived@localhost    smtp_server 127.0.0.1    smtp_connect_timeout 30    router_id node1    vrrp_mcast_group4 224.15.15.15 } vrrp_script chk_down { //keepalived     script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"     interval 1      weight -5     }  vrrp_instance VI_1 {     state BACKUP     interface eno16777736     virtual_router_id 20     priority 98     advert_int 1     authentication {         auth_type PASS         auth_pass 6b8a916c      }     virtual_ipaddress {     10.1.15.50/16  dev eno16777736 }     track_script { // , down     chk_down  }     notify_master "/etc/keepalived/notify.sh master"     notify_backup "/etc/keepalived/notify.sh backup"     notify_fault "/etc/keepalived/notify.sh fault" }  virtual_server 10.1.15.50 80 {     delay_loop 3     lb_algo rr      lb_kind DR     protocol TCP     sorry_server 127.0.0.1 80     real_server 10.1.15.45 80 {         weight 1         HTTP_GET {             url {                path /         status_code 200             }            connect_timeout 1       nb_get_retry 3       delay_before_retry 1  }  }    real_server 10.1.15.46 80 {     weight 1     HTTP_GET {         url {         path /            status_code 200         }         connect_timeout 1         nb_get_retry 3         delay_before_retry 1     }        }  }

任意のクライアントで障害をシミュレートし、単一の障害があるかどうかをテストします.もう1つは正常に動作します.
      , Real server         LVS      
[root@node1 ~]# systemctl start|stop| keepalived.service
[root@node1 ~]# ipvsadm -L -n 
[root@node2 keepalived]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP  10.1.15.50:80 rr
  -> 10.1.15.45:80                Route   1      0          0         
  -> 10.1.15.46:80                Route   1      0          0         
       curl  
[root@Centos6 ~]# curl http://10.1.15.50

 Sorry Server 2 

[root@Centos6 ~]# curl http://10.1.15.50

 RS 2 

[root@Centos6 ~]# curl http://10.1.15.50

RS 1 

   [root@Centos6 ~]#  : keepalived web , 80 , Director server web 80 , , keepalived

keepalivedは外部の補助スクリプトを呼び出して資源監視を行い、監視の結果状態に基づいて優先的な動的調整を実現して健康検査を実行することができる.ステップ2:(1)スクリプトを定義します.(2)このスクリプトを呼び出す.keepalivedディレクトリにdownファイルアドレスを作成すると、Real Server 1を参照するプロファイルが自動的にポーリングされ、スクリプトが定義されます.
高可用性nginxクラスタ逆エージェントの構成
Real Server 1と2のホストにnginxをインストールする
[root@node1 ~]# rpm -ivh nginx-1.10.0-1.el7.ngx.x86_64.rpm

nginxの世代交代機能の構成
  nginx.conf  
vim /etc/nginx/nginx.conf       ,
    access_log  /var/log/nginx/access.log  main; //       
        upstream websrvs { //            
            server 10.1.15.45;
            server 10.1.15.46;
        }
  conf.d   default.conf  ,      
vim /etc/nginx/conf.d/default.conf
    location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    proxy_pass http://websrvs; //            web  
        }
     systemctl start nginx.service
                   
    systemctl start keepalived.service
      
curl 10.1.15.50,                   !!!    

足りないことがあれば教えてくださいずっと勉强しています.他の机能もゆっくり练习しています.上の3つの状态のスクリプトを通じてsystemdに参加します.
次に、このスクリプトで定義されたトリガメカニズムにより、nginxサービス障害の自動再起動を監視します.