keepalivedベースの高可用性ipvsクラスタ


前言:
前にlvsでクラスタサービスを構築することは,確かにサービスの負荷能力を向上させることができるが,スケジューラの単点,バックエンドサーバの健康状態をリアルタイムで検出できないなど,依然として多くの問題が存在している.そのため、スケジューラにプライマリ・スペアがあり、1台のサーバが別のサーバを切ってすぐに自動的に交換し、バックエンド・サーバの健康状態に応じてRSの削除を増やすことができることを望んでいます.ここでは今回お話ししたkeepalivedについて説明します.もちろんkeepalivedはipvsクラスタの高可用性を実現するだけでなく,今回はipvsに高可用性を追加する.
本文:
keepalivedには主にvrrp stack,ipvs wrapper,checkersの3つの構成があり,それぞれプライマリ・スペアの実現,ipvs規則の管理,健康状態検出に用いられる.
vrrp仮想ルーティング冗長プロトコルは、ローカルエリアネットワークにおける静的ゲートウェイの構成において単一の失効が生じるルーティングプロトコルを解決するためである.ここでは主にVS単一の失効を解決するために、2台のデバイスをスケジューラとして、2つのデバイスを1台のデバイスに仮想化し、仮想ルーティングidという東東でこの仮想デバイスを識別し、この仮想デバイスにipアドレスを与えることができます.2台のデバイスの中で優先度の高いデバイスはプライマリデバイスで、他のデバイスはデバイスから、プライマリデバイスはこの仮想デバイスのipを得ることができます.プライマリ・デバイスが何らかの理由でオフになった場合、デバイスからまたはこの仮想デバイスのipまでサービスを提供するので、簡単なプライマリ・スタンバイ・モードでは、1台のデバイスが動作し、もう1台がスタンバイとして動作します.では、スタンバイデバイスはどのようにしてプライマリデバイスがオンラインかどうかを知っていますか?2人が別々の部屋にいることに相当し、1つが存在するかどうかを確かめるために、ずっと声を出して他の人に存在することを確かめればいいのです~だから、メインスタンバイもそうですが、わずかな範囲で伝播するだけなので、ここでは放送ではなくマルチキャストを使っています.
keepalivedは、プロファイルを使用してlvsを設定し、健康状態検出とともにipvsを動的に管理できます.もし私たちが2台のRSを配置したら、keepalivedはRSの健康状態に基づいてipvsルールを配置します.もしある設備がdownしたら、要求はこの設備に転送されません.もし2台とも切ったらどうしますか.スケジューラにsorry serverを提示して、サービスが利用できないなどのヒントを与えることができます.
私たちは前編のブログの実装にkeepalived機能を追加し続けました.高可用性を実現するために、VSの代替デバイスとして1台のデバイスを追加しました.そのipは172.16.53.104で、2台のRSの配置は変わらないので、以前のipvsの配置を直接クリアすればいいです.keepalivedの構成は、グローバル構成、vrrp関連構成、lvsの構成の3つの部分に分かれています.スケジューラの構成は次のとおりです.
#172.16.53.100
ipvsadm -C  #       
ifconfig eno16777736:0 172.16.53.50 netmask 255.255.255.255 broadcast 172.16.53.50 down 
           VIP down 
              
yum install keepalived -y
cd /etc/keepalived
mv keepalived.conf{,.bak}  #         
vim keepalived.conf
    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.0.100.99                #           
    }
    vrrp_instance VI_1 {                             #vrrp  
        state BACKUP          #           ,104        MASTER
        interface eno16777736            #  ip        
        virtual_router_id 99            #        ,        vrrp    
        priority 98                     #   ,         
        advert_int 1                    #vrrp       ;
        authentication {                #    ,        
                auth_type PASS
                auth_pass 571f97b2      #   8   
        }
        virtual_ipaddress {             #      IP 
                172.16.53.50/16 dev eno16777736         #ip      
        }
    }
    virtual_server 172.16.53.50 80 {            #lvs      ~
        delay_loop 3                     #         ;       
        lb_algo rr                       #         
        lb_kind DR                       #      ,             
        protocol TCP                     #    ,   TCP
        sorry_server 127.0.0.1 80        #sorry server   ,     
        real_server 172.16.53.101 80 {   #  RS 
                weight 1                 #  ,         
                HTTP_GET {               #    ,  http get
                        url {            
                                path /   #     url
                                status_code 200   #    200    
                        }
                        connect_timeout 1         #      
                        nb_get_retry 3            #    
                        delay_before_retry 1       #         
                }
        }
        real_server 172.16.53.102 80 {   #   RS
                weight 1
                HTTP_GET {
                        url {
                                path /
                                status_code 200
                        }
                        connect_timeout 1
                        nb_get_retry 3
                        delay_before_retry 1
                }
        }
    }
systemctl start keepalived    #    
ipvsadm -Ln                   #        ipvs  
yum install httpd -y          #  sorry server
vim /var/www/html/index.html
    sorry,our system is being maintained
systemctl start httpd         #  sorry server

2つのVSの構成はほぼ一致しており、state設定が異なる以外は.httpの負荷分散,健康状態検出および高可用性を実証したが,いずれのサービスもサポートされている~lvsは4層の東東~他のサービスはTCP_CHECKフィールドの設定ができました.ここでは詳しく説明しません.簡単な構成説明を直接出して~
 TCP_CHECK {
    connect_ip :   RS   IP            
    connect_port :   RS   PORT          
    bindto :                 ;
    bind_port :                 ;
    connect_timeout :         ;
}

2つのRS同時スケジューリング要求を実現するにはどうすればいいのでしょうか.私たちは2台のデバイスで2つの仮想デバイスを作ることができるので、2つの仮想ipがあります.1つの仮想デバイスの中で、VS 1が主で、VS 2が従で、もう1つの仮想デバイスの中でVS 1が従で、VS 2が主で、それからdnsで1つのドメイン名を2つのipに解析します.dns自体が2つのipをポーリングするので、2つのスケジューラの負荷均衡を実現しました.ここではプレゼンテーションをしないで、上の配置と大同小異です.ここではただ一つの考えを与えるだけだ.
注意:drモードでダブルマスターを設定する場合は、RSは2つのVIPを設定することを忘れないでください.この坑博主は踏んだことがあります...
~keepalivedが出てきてlvsの高可用性を作ることができて、nginxの負荷の均衡の高可用性をすることができて、しかしこの話題は後で話します~