1. 程式人生 > >Linux集群

Linux集群

linux

概述:

根據功能劃分為兩大類:高可用和負載均衡

高可用集群(HA集群或者叫雙機熱備)通常為兩臺服務器,一臺工作,另外一臺作為冗余,當提供服務的機器宕機,冗余將接替繼續提供服務;實現高可用的開源軟件有:heartbeat、keepalived

負載均衡集群,需要有一臺服務器作為分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集群裏,除了分發器外,就是給用戶提供服務的服務器了,這些服務器數量至少為2;實現負載均衡的開源軟件有LVS、keepalived、haproxy、nginx,商業的有F5、Netscaler

下面來介紹Keepalived實現高可用集群:

keepalived通過VRRP(Virtual Router Redundancy Protocl)協議來實現高可用。

在這個協議裏會將多臺功能相同的路由器組成一個小組,這個小組裏會有1個master角色和N(N>=1)個backup角色。

master會通過組播的形式向各個backup發送VRRP協議的數據包,當backup收不到master發來的VRRP數據包時,就會認為master宕機了。此時就需要根據各個backup的優先級來決定誰成為新的mater。

Keepalived要有三個模塊,分別是core、check和vrrp。其中core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析,check模塊負責健康檢查,vrrp模塊是來實現VRRP協議的。

使用keepalived+nginx實現web高可用

準備工作:master:192.168.139.129 需要安裝keepalived + nginx; backup:192.168.139.128 需要安裝keepalived + nginx; 還要設置VIP:192.168.139.100(這個是虛擬IP,服務器是靠這個VIP對外提供服務的。)

keepalived安裝可以yum install -y keepalived; nginx安裝同樣是yum安裝的

下面是具體的實現:

1. master(129)操作:

編輯vim /etc/keepalived/keepalived.conf文件,清空文件內容,加入一下的配置:

global_defs {
    notification_email {
        [email protected]
    }
    notification_email_from [email protected]
        smtp_server 127.0.0.1
        smtp_connect_timeout 30
        router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/usr/local/sbin/check_ngx.sh"
        interval 3
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.139.100
    }

    track_script {
        chk_nginx
    }
}

由於上面的代碼定義了一個監控的腳本check_ngx.sh,編輯完記得授於執行的權限755

#!/bin/bash
#時間變量,用於記錄日誌
d=`date --date today +%Y%m%d_%H%M%S`
#計算nginx進程數量
n=`ps -C nginx --no-heading|wc -l`
#如果進程為0,則啟動nginx,並且再次檢測nginx進程數量,
#如果還為0,說明nginx無法啟動,此時需要關閉keepalived
if [ $n -eq "0" ];then
    /etc/init.d/nginx start
    n2=`ps -C nginx --no-heading|wc -l`
    if [ $n2 -eq "0" ];then
        echo "$d nginx down,keepalived will stop" >> /var/log/check_ngx.log
        systemctl stop keepalived
    fi
fi

完成以上的步驟,就可以啟動master的keepalived服務了。systemctl start keepalived.service;如下圖:

技術分享圖片

使用ip add命令可以看到master上的VIP:192.168.139.100(註意ifconfig命令是看不到這個虛擬VIP的) 到這裏master的工作就完成了!!!

2. backup(128)上操作:

編輯vim /etc/keepalived/keepalived.conf文件,清空文件內容,加入一下的配置:

global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script chk_nginx {
    script "/usr/local/sbin/check_ngx.sh"
    interval 3
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.139.100
    }
    track_script {
        chk_nginx
    }
}

代碼定義了一個監控的腳本check_ngx.sh,編輯完記得授於執行的權限755

#!/bin/bash
#時間變量,用於記錄日誌
d=`date --date today +%Y%m%d_%H:%M:%S`
#計算nginx進程數量
n=`ps -C nginx --no-heading|wc -l`
#如果進程為0,則啟動nginx,並且再次檢測nginx進程數量,
#如果還為0,說明nginx無法啟動,此時需要關閉keepalived
if [ $n -eq "0" ]; then
        systemctl start nginx
        n2=`ps -C nginx --no-heading|wc -l`
        if [ $n2 -eq "0"  ]; then
                echo "$d nginx down,keepalived will stop" >> /var/log/check_ngx.log
                systemctl stop keepalived
        fi
fi

完成以上的步驟,就可以啟動master的keepalived服務了。systemctl start keepalived.service

3. 接下來就是驗證是否實現了keepalived高可用了。

我們去master(129)的機器把keepalived 停掉,看看backup的機器會不會自動切換到VIP

master操作:systemctl stop keepalived.service

技術分享圖片

master機器上已經沒有了VIP了

backup操作:

技術分享圖片

VIP自動切換到backup機器上面來了!

4. 當我們重新啟動master的服務時,master機器上會重新接管VIP的資源了

systemctl start keepalived.service

技術分享圖片

到這裏keepalived+nginx實現高可用 就完成了。當然你也可以把nginx服務換成其他的服務,如MySQL等,大致的思路都是一樣的!


下面接著搭建負載均衡集群

介紹:主流開源軟件LVS、keepalived、haproxy、nginx等;其中LVS屬於4層(網絡OSI 7層模型),nginx屬於7層,haproxy既可以認為是4層,也可以當做7層使用。

keepalived的負載均衡功能其實就是lvs;lvs這種4層的負載均衡是可以分發除80外的其他端口通信的,比如MySQL的,而nginx僅僅支持http,https,mail,haproxy也支持MySQL這種

相比較來說,LVS這種4層的更穩定,能承受更多的請求,而nginx這種7層的更加靈活,能實現更多的個性化需求

這裏我們使用LVS+keepalived實現負載均衡

關於LVS是什麽,請自行查詢資料!

LVS常見有三種模式:NAT模式、IP Tunnel模式(也稱IP隧道)、DR模式

LVS的調度算法:(常用前面四種)

輪詢 Round-Robin rr

加權輪詢 Weight Round-Robin wrr

最小連接 Least-Connection lc

加權最小連接 Weight Least-Connection wlc

基於局部性的最小連接 Locality-Based Least Connections lblc

帶復制的基於局部性最小連接 Locality-Based Least Connections with Replication lblcr

目標地址散列調度 Destination Hashing dh

源地址散列調度 Source Hashing sh


準備工作:主keepalived(調度器)192.1468.139.129 ; 服務器rs1 192.168.139.128(nginx); 服務器rs2 192.168.139.130(nginx) ; VIP 192.168.139.110

主keepalived(129)上操作:

編輯文件:vim /etc/keepalived/keepalived.conf,清空原來的內容,加入一下配置:

vrrp_instance VI_1 {
    #備用服務器上為 BACKUP
    state MASTER
    #綁定vip的網卡為ens33,你的網卡和阿銘的可能不一樣,這裏需要你改一下
    interface ens33
    virtual_router_id 51
    #備用服務器上為90
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.139.110
    }
}
virtual_server 192.168.139.110 80 {
    #(每隔10秒查詢realserver狀態)
    delay_loop 10
    #(lvs 算法)
    lb_algo wlc
    #(DR模式)
    lb_kind DR
    #(同一IP的連接60秒內被分配到同一臺realserver)
    persistence_timeout 60
    #(用TCP協議檢查realserver狀態)
    protocol TCP

    real_server 192.168.139.128 80 {
        #(權重)
        weight 100
        TCP_CHECK {
        #(10秒無響應超時)
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.139.130 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

安裝ipvsadm:yum install -y ipvsadm

在rs服務器(128+130)操作:

編輯腳本:vim /usr/local/sbin/lvs_rs.sh

#/bin/bash
vip=192.168.139.110
#把vip綁定在lo上,是為了實現rs直接把結果返回給客戶端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作為更改arp內核參數,目的是為了讓rs順利發送mac地址給客戶端
#參考文檔www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
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

然後執行!


配置完成了,我們去主keepalived開啟服務!

驗證:

技術分享圖片

Linux集群