LVS+Keepalivedデュアルプライマリモデルの実装


トポロジー:
Client
LVS1
LVS2
RS1
RS2
192.168.2.1
DIP 192.168.2.128 VIP 192.168.2.198
DIP 192.168.2.129 VIP 192.168.2.199
192.168.2.130
192.168.2.131
デュアルプライマリモデルを実装するには、2つの仮想ルータグループを構成する必要があります.つまり、ホストごとに2つのvrrp_を構成する必要があります.Instance,各仮想インタフェースは仮想IPを構成し,LVS 1とLVS 2の同じグループvirtual_router_id内は互いに主備であり、ここでVRRPの実現原理を見ることができるか、あるいは後で構成情報を見ることができるかが分からない場合、RS 1とRS 2はデュアルプライマリモードで2組のルーティングを構成する必要があり、VIP 1からの要求を受け取ってlo:0のNIC処理に渡し、VIP 2からの要求を受け取ってlo:1のNIC処理に渡す
上の設定:
###########################           LVS1            ######################### 

yum install nginx -y
echo "   ,       ..' > /usr/share/nginx/html/index.html
systemctl start nginx

! Configuration File for keepalived

global_defs {           ##      ,           ,              ,      keepalive                zabbix       
   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.0.112     ##    
}

###      IP     

vrrp_instance VI_1 {
    state MASTER                    #    MASTER | BACKUP
    interface eno16777736           ##  ip          
    virtual_router_id 31            ##     id,         
    priority 100                    ##   
    advert_int 1                    ##      ,  1s
#    nopreempt                       ##     
    authentication {
        auth_type PASS
        auth_pass f1GDsVH6      ##VRRP  ,      vip    
    }
    virtual_ipaddress {
        192.168.2.198/24 dev eno16777736 label eno16777736:1    ##  vip  
    }

    notify_master "/etc/keepalived/scripts/notify.sh master"      ##     master     
    notify_backup "/etc/keepalived/scripts/notify.sh backup"     ##     backup     
    notify_fault "/etc/keepalived/scripts/notify.sh fault"     ##           
}

vrrp_instance VI_2 {
    state BACKUP
    interface eno16777736
    virtual_router_id 32
    priority 98
    advert_int 1
#    nopreempt
    authentication {
        auth_type PASS
        auth_pass f1GDsV78
    }
    virtual_ipaddress {
        192.168.2.199/24 dev eno16777736 label eno16777736:2
    }

    notify_master "/etc/keepalived/scripts/notify.sh master"      ##     master     
    notify_backup "/etc/keepalived/scripts/notify.sh backup"     ##     backup     
    notify_fault "/etc/keepalived/scripts/notify.sh fault"     ##           

}

###  LVS      
##       ,        VIP   , LVS2   ,LVS2  IP     ,    LVS1  192.168.2.199     ,  LVS2    192.168.2.198     

virtual_server 192.168.2.198 80 {
    delay_loop 1
    lb_algo wlc
    lb_kind DR
#   persistence_timeout 300
    protocol TCP
    sorry_server 127.0.0.1 80
  real_server 192.168.2.130 80{
    weight 1
    TCP_CHECK {
            connect_port 80
        connect_timeout 1
            nb_get_retry 2
        delay_before_retry 1
    }
  }

  real_server 192.168.2.131 80{
    weight 1
    TCP_CHECK {
            connect_port 80
        connect_timeout 1
            nb_get_retry 2
        delay_before_retry 1
    }
  }

}

virtual_server 192.168.2.199 80 {
    delay_loop 1
    lb_algo wlc
    lb_kind DR
#   persistence_timeout 300
    protocol TCP
    sorry_server 127.0.0.1 80
  real_server 192.168.2.130 80{
    weight 1
    TCP_CHECK {
            connect_port 80
        connect_timeout 1
            nb_get_retry 2
        delay_before_retry 1
    }
  }

  real_server 192.168.2.131 80{
    weight 1
    TCP_CHECK {
            connect_port 80
        connect_timeout 1
            nb_get_retry 2
        delay_before_retry 1
    }
  }
}

###########################           LVS2            #########################
yum install nginx -y
echo "   ,       ..' > /usr/share/nginx/html/index.html
systemctl start nginx

! Configuration File for keepalived

global_defs {           ##      ,           ,              ,      keepalive                zabbix       
   notification_email {
        root@localhost       
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node2                   ##      ,  
   vrrp_mcast_group4 224.0.0.112     ##    
}

vrrp_instance VI_1 {
    state BACKUP                    #    MASTER | BACKUP
    interface eno16777736           ##  ip          
    virtual_router_id 31            ##     id,         
    priority 98                     ##   
    advert_int 1                    ##      ,  1s
#    nopreempt                       ##     
    authentication {
        auth_type PASS
        auth_pass f1GDsVH6      ##VRRP  ,      vip    
    }
    virtual_ipaddress {
        192.168.2.198/24 dev eno16777736 label eno16777736:1    ##  vip  
    }

    notify_master "/etc/keepalived/scripts/notify.sh master"      ##     master     
    notify_backup "/etc/keepalived/scripts/notify.sh backup"     ##     backup     
    notify_fault "/etc/keepalived/scripts/notify.sh fault"     ##           
}

vrrp_instance VI_2 {
    state MASTER
    interface eno16777736
    virtual_router_id 32
    priority 100
    advert_int 1
#    nopreempt
    authentication {
        auth_type PASS
        auth_pass f1GDsV78
    }
    virtual_ipaddress {
        192.168.2.199/24 dev eno16777736 label eno16777736:2
    }

    notify_master "/etc/keepalived/scripts/notify.sh master"      ##     master     
    notify_backup "/etc/keepalived/scripts/notify.sh backup"     ##     backup     
    notify_fault "/etc/keepalived/scripts/notify.sh fault"     ##           
}

virtual_server 192.168.2.198 80 {
    delay_loop 1
    lb_algo wlc
    lb_kind DR
#   persistence_timeout 300
    protocol TCP
    sorry_server 127.0.0.1 80
  real_server 192.168.2.130 80{
    weight 1
    TCP_CHECK {
            connect_port 80
        connect_timeout 1
            nb_get_retry 2
        delay_before_retry 1
    }
  }

  real_server 192.168.2.131 80{
    weight 1
    TCP_CHECK {
            connect_port 80
        connect_timeout 1
            nb_get_retry 2
        delay_before_retry 1
    }
  }

}

virtual_server 192.168.2.199 80 {
    delay_loop 1
    lb_algo wlc
    lb_kind DR
#   persistence_timeout 300
    protocol TCP
    sorry_server 127.0.0.1 80
  real_server 192.168.2.130 80{
    weight 1
    TCP_CHECK {
            connect_port 80
        connect_timeout 1
            nb_get_retry 2
        delay_before_retry 1
    }
  }

  real_server 192.168.2.131 80{
    weight 1
    TCP_CHECK {
            connect_port 80
        connect_timeout 1
            nb_get_retry 2
        delay_before_retry 1
    }
  }
}

########################   RS1     ########################
yum install nginx -y
echo "192.168.2.130' > /usr/share/nginx/html/index.html
systemctl start nginx
##      set_lvs_rs.sh
bash set_lvs_rs.sh start

########################   RS2     ########################
yum install nginx -y
echo "192.168.2.131' > /usr/share/nginx/html/index.html
systemctl start nginx
##      set_lvs_rs.sh
bash set_lvs_rs.sh start

ここでLVS+keepalivedの二重主モデルは完成し,試験により,LVS 1とLVS 2に異常がない場合に同時に正常に動作するDNSホイールループを得ることができる.2、LVS 1或いはいずれかのダウンタイムの時、フローティングIPは別のホストに漂って、2つのVIPはすべて依然として正常に動作する3、NGINXのいずれかのTCP 80ポートの4層が正常でないことを検出する時、keepalivedは自動的にそれを規則から削除して、逆に自動的に4を追加して、NGINXが同時にすべてダウンタイムする時、keepalivedは一時的にsorry server 5を提供して、vipが変更されるとkeepalivedは管理者に自動的にメールを送信します
set_lvs_rs.shスクリプトの内容:
#!/bin/bash
#
vip1='192.168.2.198'
vip2='192.168.2.199'
mask='255.255.255.255'

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 lo:0 $vip1 netmask $mask broadcast $vip1 up
    ifconfig lo:1 $vip2 netmask $mask broadcast $vip2 up
    route add -host $vip1 dev lo:0
    route add -host $vip2 dev lo:1
    ;;
stop)
    ifconfig lo:0 down
    ifconfig lo:1 down

    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

    ;;
*)
    echo "Usage $(basename $0) start|stop"
    exit 1
    ;;
esac

notify.shスクリプトの内容:
[root@node2 scripts]# cat notify.sh 
#!/bin/bash
#
contact='root@localhost'

notify() {
        local mailsubject="$(hostname) to be $1, vip floating"
        local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
        echo "$mailbody" | mail -s "$mailsubject" $contact
}

case $1 in
master)
        notify master
        ;;
backup)
        notify backup
        ;;
fault)
        notify fault
        ;;
*)
        echo "Usage: $(basename $0) {master|backup|fault}"
        exit 1
        ;;
esac