LVS負荷分散の高可用性DR DR + keepalivedの原則と実験

LVS-DR

負荷分散クラスターの動作モード-直接ルーティングは
DRモードと呼ばれます。TUNモードの構造と同様のセミオープンネットワーク構造を採用していますが、ノードはどこにでも散在しているわけではなく、スケジューラーと同じ物理ネットワークに配置されています
ロードスケジューラは、ローカルネットワークを介して各ノードサーバーに接続され、専用のIPトンネルを確立する必要はありません。

LVS-DRデータフロー図
が盗まれる...私は認めます
ここに画像の説明を挿入

1.クライアントがリクエストをターゲットVIPに送信し、ディレクター(ロードバランサー)がそれを受信します。このとき、IPヘッダーとデータフレームヘッダー情報は次のとおりです
ここに画像の説明を挿入。2。ロードバランシングアルゴリズムに従ってRealserver_1を選択し、IPメッセージを変更またはカプセル化せずに、データフレームのMACアドレスをRealServer_1のMACアドレスに変更して、LANに送信します。 。IPヘッダーとデータフレームヘッダー情報は次のとおりです
ここに画像の説明を挿入。3. RealServer_1はこのフレームを受信し、カプセル化解除後にターゲットIPがマシンと一致することを検出するため(RealServerは事前にVIPにバインドされています)、このメッセージを処理します。次に、メッセージを再カプセル化して、LANに送信します。現時点では、IPヘッダーとデータフレームヘッダー情報は次のとおりです。

ここに画像の説明を挿入4.クライアントは返信メッセージを受け取ります。クライアントは通常のサービスを受けていると思っていますが、どのサーバーがそれを処理するのかわかりません

注:ネットワークセグメントを通過する場合、メッセージはルーター経由でユーザーに返されます。

考えられる問題

LVS-DR負荷分散クラスターでは、ロードバランサーとノードサーバーを同じVIPアドレスで構成する必要があります
。ローカルエリアネットワークで同じIPアドレスを使用すると、各サーバーのARP通信に障害が発生します
。ARPブロードキャストがLVS-DRクラスターに送信されると、ロードバランサとノードサーバーは同じネットワークに接続されているため、どちらもARPブロードキャストを受信します。
現時点では、フロントエンドロードバランサのみが応答し、他のノードサーバーはARPブロードキャスト
応答してノードサーバーを処理することはできません。 VIPのARPリクエストには応答しません
。VIPアドレスを伝送するには、仮想インターフェイスlo:0を使用します。
カーネルパラメータarp_ignore = 1を設定しますシステムは、宛先IPがローカルIPであるARPリクエストにのみ応答します。RealServe
はパケットを返し(ソースIPはVIP)、ルーターによって転送されます。メッセージを再カプセル化するときに、ルーターのMACアドレスを最初に取得する必要があります

上記のARP問題の解決策

/etc/sysctl.confファイル
変更してノードサーバーを処理し、VIPのARP要求に応答しないようにします
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
システムはIPパケットを使用しませんARP要求のソースアドレスを設定するには、送信インターフェイスのIPアドレスを選択します
。net.ipv4.conf.all.arp_ignore= 1
net.ipv4.conf.all.arp_announce = 2

キープアライブ

keepalivedツールの概要

LVSおよびHAの
サポートのために特別に設計されたヘルスチェックツールサポート自動フェイルオーバー(フェイルオーバー)
サポートノードヘルスチェック(ヘルスチェック)
公式ウェブサイトhttp://www.keepalived.org

原理分析

Keepalivedは、VRRPホットバックアッププロトコルを採用して、Linuxサーバーのマルチマシンホットバックアップ機能を実現しています
。VRRP(仮想ルーティング冗長プロトコル)は、ルーターのバックアップソリューションです。
ここに画像の説明を挿入複数のルーターがホットバックアップグループを形成し、共有仮想IPアドレスを通じて提供されます。サービス
各ホットスタンバイグループの1つのメインルーターのみが同時にサービスを提供し、他のルーターは冗長状態にあります。
現在オンラインのルーターに障害が発生した場合、他のルーターは設定された優先順位に従って仮想IPアドレスを自動的に引き継ぎ、サービスを提供し続けます

Keepalievdデプロイメントの説明

Keepalivedはマルチマシンホットバックアップを実現できます。各ホットスタンバイグループは複数のサーバーを持つことができます。最も一般的に使用されるのはデュアル
マシンホットスタンバイです。デュアルマシンホットスタンバイのフェイルオーバーは、さまざまなアプリケーションサーバーに適した仮想IPアドレスのドリフトによって実現されます。

Keepalievdインストールの説明

LVSクラスター環境で適用する場合は、lipvsadm管理ツール
YUMを使用してKeepalived をインストールし、Keepalived
サービス有効にする必要もあります。

一般的な構成

Keepalievd構成ディレクトリは/ etc / keepalievd /にあります
。keepalievd.confはメイン構成ファイルです
。global_defs{...}セクションはグローバルパラメータ
vrrp_instanceインスタンス名を指定します{...}セクションはVRRPホットスタンバイパラメータを指定します。
コメントテキストは「!」記号で始まります。
ディレクトリサンプル/、参照用に多くの構成例が提供されています

一般的な構成オプション

router_id HA_TEST_R1:ルーター(サーバー)の
名前vrrp_instance VI_1:VRRPホットスタンバイインスタンス
状態を定義しますMASTER:ホットスタンバイ状態、MASTERはマスターサーバー
インターフェイスを表しますens33:VIPアドレスを持つ物理インターフェイス
virtual_router_id 1:仮想ルーターのID番号、各ホットバックアップグループを同じ
優先度100に保ちます:優先度、値が大きいほど、優先度が高くなります
。advert_int 1:通知間の秒数(ハートビート頻度)
auth_type PASS:認証タイプ
auth_pass 123456:パスワード文字列
virtual_ipaddress {vip}:ドリフトアドレス(VIP)を指定します、複数ある場合があります。複数のドリフトアドレスはカンマで区切られます

スレーブサーバー構成


Keepalived バックアップサーバーの構成は、3つのオプションでマスター構成とは異なりますrouter_id:フリー名の
状態に設定:バックアップの
優先順位に設定:マスターサーバーの値よりも低い値
他のオプションはマスターと同じです

LCS-DR!さあ!!ショー!!!

実験の説明

または、Apacheを使用して習慣的に表示します。
ここに画像の説明を挿入LVS01:192.168.10.20
LVS02:192.168.10.21
WebServer01:192.168.10.30
WebServer02:192.168.10.31
仮想IP(Vip):192.168.10.10

目的

クライアントは、LVSスケジューラーのドリフトIPアドレスにアクセスすることにより、Webページに正常にアクセスできます

上映開始!

LVSを設定する

両方のLVSをipvsadmでインストールする必要があります(デュアルシステムホットバックアップを行うためにここにkeepalivedをインストールしました)

[root@lvs01 ~]# yum -y install ipvsadm keepalived
[root@lvs02 ~]# yum -y install ipvsadm keepalived

2つのLVS変更構成ファイル、ルーティングの転送とリダイレクトをオフにする

[root@lvs01 ~]# vim /etc/sysctl.conf
##末行插入如下配置
##开启ipv4地址转发
net.ipv4.ip_forward = 1
##关闭ipv4全部重定向
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
##重载配置,使配置生效
[root@lvs01 ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

両方のLVSがサービススクリプトを作成し、サービスの使用を容易にするためにそれをinit.dに配置します

[root@lvs01 /]# vim /etc/init.d/DR.sh
#!/bin/bash
GW=192.168.10.1
VIP=192.168.10.10   ##虚拟ip
RIP1=192.168.10.30 ##真实web服务器ip
RIP2=192.168.10.31
case "$1" in
start)
                /sbin/ipvsadm --save > /etc/sysconfig/ipvsadm  ##保存配置
                systemctl start ipvsadm  ##启动服务
                /sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up  
##设置ens33:0地址,广播地址,子网掩码,并开启
                /sbin/route add -host $VIP dev ens33:0  ##添加路由网段信息
                /sbin/ipvsadm -A -t $VIP:80 -s rr ##指定虚拟服务访问入口,指定轮询算法
                /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g ##指定真实服务器,dr模式
                /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
                echo "ipvsadm starting --------------------[ok]"
                ;;
stop)
                /sbin/ipvsadm -C   ##清空缓存
                systemctl stop ipvsadm  ##关闭服务
                ifconfig ens33:0 down  ##关闭接口
                route del $VIP   ##删除路由信息
                echo "ipvsamd stoped----------------------[ok]"
                 ;;
status)
                if [ ! -e /var/lock/subsys/ipvsadm ];then  ##判断文件存在与否决定状态
                echo "ipvsadm stoped---------------"
                exit 1
                                else
                                echo "ipvsamd Runing ---------[ok]"
                fi
                ;;
*)
                echo "Usage: $0 {start|stop|status}"
                exit 1
esac
exit 0
[root@lvs01 /]# chmod +x /etc/init.d/DR.sh 

仮想マシンの設定。両方のLVSをLANセグメント1
ここに画像の説明を挿入に配置します。シェルのコマンドは一時IPアドレスを構成するため、構成ファイルで再度変更します

[root@lvs01 /]# cd /etc/sysconfig/network-scripts/
[root@lvs01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0
[root@lvs01 network-scripts]# vim ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.10
NETMASK=255.255.255.0
[root@lvs01 network-scripts]# vim ifcfg-ens33
BOOTPROTO=static
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.10.20  ##LVS02改成192.168.10.21
PREFIX=24
GATEWAY=192.168.10.1

サービスを再起動し、仮想ネットワークカードとシェルスクリプトを開始します。

[root@lvs01 network-scripts]# systemctl restart network
[root@lvs01 network-scripts]# ifup ens33:0
[root@lvs01 network-scripts]# service DR.sh start
ipvsadm starting --------------------[ok]
[root@lvs01 network-scripts]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.20  netmask 255.255.255.0  broadcast 192.168.10.255
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.10  netmask 255.255.255.255  broadcast 192.168.100.10
        ether 00:0c:29:43:a9:53  txqueuelen 1000  (Ethernet)
[root@lvs01 network-scripts]# systemctl stop firewalld
[root@lvs01 network-scripts]# setenforce 0

WEBサーバーの構成

2つにHTTPDをインストールする

[root@web01 /]# yum -y install httpd

web01と02のネットワークモードをLANセクション1に
ここに画像の説明を挿入
変更します。IPを変更してlo:0を構成します。


[root@web01 network-scripts]# cp -p ifcfg-lo ifcfg-lo:0
[root@web01 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.10.10
NETMASK=255.255.255.0
ONBOOT=yes

[root@web01 network-scripts]# vim ifcfg-ens33 
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.10.30  ##web02配置成 192.168.10.31
PREFIX=24
GATEWAY=192.168.10.1
[root@web01 network-scripts]# systemctl restart network
[root@web01 network-scripts]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.30  netmask 255.255.255.0  broadcast 192.168.10.255
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.10.10  netmask 255.255.255.0
        loop  txqueuelen 1000  (Local Loopback)

ARP抑制スクリプトを構成する

[root@web01 network-scripts]# vim /etc/init.d/apa.sh
VIP=192.168.10.10
                case "$1" in
                start)
                                ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
                                /sbin/route add -host $VIP dev lo:0
                                echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore   '//arp忽略'
                                echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
                                echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
                                echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
                                sysctl -p >/dev/null 2>&1
                                echo "RealServer Start OK "
                                ;;
                stop)
                                ifconfig lo:0 down
                                route del $VIP /dev/null 2>&1
                                echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore '//arp开启'
                                echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
                                echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
                                echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
                                echo "RealServer Stopd"
                                ;;
                *)
                                echo "Usage: $0 {start|stop}"
                                exit 1
                esac
                exit 0
[root@web01 network-scripts]# chmod +x /etc/init.d/apa.sh 

2つのWebサービスのメインページを構成する

[root@web01 html]# echo "<h1>This is Web01 Server.</h1>" > index.html
[root@web01 html]# ls
index.html
[root@web02 html]# echo "<h1>This is Web02 Server.</h1>" > index.html
[root@web02 html]# ls
index.html

各サービスを開いて再起動します

[root@web01 html]# ifup lo:0
[root@web01 html]# service apa.sh start
RealServer Start OK 
[root@web01 html]# systemctl stop firewalld
[root@web01 html]# setenforce 0

検証実験

フローティングIPにアクセスし、ウェブページにアクセスして、ポーリングモードがオンになっていることを確認します
ここに画像の説明を挿入

Keepalievd!さあ!!もう一度見せて!!!

実験環境は、上記のDR展開に基づいています

上映開始!

2つのLVSを構成する

[root@lvs01 network-scripts]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
    
    
   notification_email {
    
    
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1  ##指向自身环回口IP
   smtp_connect_timeout 30
   router_id LVS01  ##两台LVS的id 不能相同,另一台配 LVS02
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}  

vrrp_instance VI_1 {
    
    
    state MASTER
    interface ens33  ##根据自己的网卡设置
    virtual_router_id 10  ##两个虚拟号需要相同
    priority 100  ##优先级,越大越优先,所以 02 的优先级可以配90
    advert_int 1
    authentication {
    
    
        auth_type PASS
        auth_pass 1111   ##上面一行和这一行最好不要改,如果改了也要相同
    }
    virtual_ipaddress {
    
    
        192.168.10.10
    }   
    }       
        
virtual_server 192.168.10.10 80 {
    
      ##改成浮动VIP  端口80 指向http服务
    delay_loop 6
    lb_algo rr  ##轮询
    lb_kind DR  ##DR模式
    persistence_timeout 50
    protocol TCP
        real_server 192.168.10.30 80 {
    
      ##指向 web01 端口80
        weight 1  ##向下删除原来大概9行
            TCP_CHECK{
    
      添加如下
            connect_port 80  ##添加连接端口
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }   
    }
##删了下面的全部,然后复制上面的 real_server 段
real_server 192.168.10.31 80 {
    
    
        weight 1
            TCP_CHECK{
    
    
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }   
    }  
}

コピーの便宜上、web02の設定ファイルを下に置いておきます

! Configuration File for keepalived

global_defs {
    
    
   notification_email {
    
    
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS02
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}  

vrrp_instance VI_1 {
    
    
    state BACKUP
    interface ens33
    virtual_router_id 10
    priority 90
    advert_int 1
    authentication {
    
    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    
    
        192.168.10.10
    }   
    }       
        
virtual_server 192.168.10.10 80 {
    
    
    delay_loop 6
    lb_algo rr 
    lb_kind DR 
    persistence_timeout 50
    protocol TCP
        real_server 192.168.10.30 80 {
    
    
        weight 1 
            TCP_CHECK{
    
      添加如下
            connect_port 80 
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }   
    }
real_server 192.168.10.31 80 {
    
    
        weight 1
            TCP_CHECK{
    
    
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }   
    }  
}

オープンサービス

[root@lvs01 network-scripts]# systemctl start keepalived
[root@lvs01 network-scripts]# systemctl restart keepalived
[root@lvs01 network-scripts]# systemctl restart network

検証実験


ここに画像の説明を挿入LVS01 閉じるにはWebページにアクセスしてください

[root@lvs01 network-scripts]# systemctl stop network

再度アクセスしてください。
ここに画像の説明を挿入
サーバーのスケジュールが成功し、実験が完了しました

おすすめ

転載: blog.csdn.net/Ora_G/article/details/108348053