Linux集羣架構

Linux集羣概述

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

• 高可用集羣一般爲兩臺服務器,一臺工做,另一臺做爲冗餘,當提供服務的機器宕機,冗餘將接替繼續提供服務html

• 實現高可用的開源軟件有:heartbeat、keepalivedlinux

• 負載均衡集羣,須要有一臺服務器做爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外,就是給用戶提供服務的服務器了,這些服務器數量至少爲2nginx

• 實現負載均衡的開源軟件有LVS、keepalived、haproxy、nginx,商業的有F五、Netscaler git

keepalived介紹

• 在這裏咱們使用keepalived來實現高可用集羣,由於heartbeat在centos6上有一些問題,影響實驗效果vim

•  keepalived經過VRRP(Virtual Router Redundancy Protocl)來實現高可用。後端

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

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

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

用keepalived配置高可用

• 準備兩臺機器130和132,130做爲master,132做爲backup

• 兩臺機器都執行yum install -y keepalived

• 兩臺機器都安裝nginx,其中130上已經編譯安裝過nginx,132上須要yum安裝nginx: yum install -y nginx

• 設定vip爲100

• 編輯130上keepalived配置文件,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_keepalived.conf獲取

• 130編輯監控腳本,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_check_ng.sh獲取

• 給腳本755權限

• systemctl start  keepalived 130啓動服務

 

• 132上編輯配置文件,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_keepalived.conf獲取

• 132上編輯監控腳本,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_check_ng.sh獲取

 

• 給腳本755權限

• 132上也啓動服務 systemctl start keepalived

實例:

130(01)做爲master,132(02)做爲backup

[root@localhost 01]# yum install -y keepalived

[root@localhost 02]# yum install -y keepalived

 

兩臺機器都安裝nginx,其中130上已經編譯安裝過nginx,132上須要yum安裝nginx: yum install -y nginx

[root@localhost 01]# ps aux | grep nginx                     #查看nginx進程

[root@localhost 02]# rpm -qa | grep nginx              #查看nginx服務有沒有安裝 

[root@localhost 02]# yum install -y nginx

 

[root@localhost 01]# ls /etc/keepalived/keepalived.conf           #查看配置文件

/etc/keepalived/keepalived.conf

[root@localhost 01]# cat !$

[root@localhost 01]#  > !$                                 #清空配置文件內容,而後複製進去

拷貝keepalived配置文件,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_keepalived.conf獲取

[root@localhost 01]# vim /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     aming@aminglinux.com
   }
   notification_email_from root@aminglinux.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {                                      #檢測服務是否正常
    script "/usr/local/sbin/check_ng.sh"
    interval 3
}

vrrp_instance VI_1 {                                              #定義master一些
    state MASTER
    interface ens33                               #發廣播的ID
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {                               #認證相關信息
        auth_type PASS
        auth_pass aminglinux>com
    }
    virtual_ipaddress {                    #定義vip
        192.168.188.100
    }

    track_script {
        chk_nginx
    }

}

檢測nginx是否正常的腳本

[root@localhost 01]# vim /usr/local/sbin/check_ng.sh

#!/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_ng.log
                systemctl stop keepalived
        fi
fi

[root@localhost 01]# cat /usr/local/sbin/check_ng.sh

[root@localhost 01]# chmod 755 /usr/local/sbin/check_ng.sh

[root@localhost 01]# systemctl start keepalived               #啓動keepalived  服務

[root@localhost 01]# ps aux | grep keep             #查看進程有沒有啓動

[root@localhost 01]# ps aux | grep nginx

停掉nginx服務

[root@localhost 01]# /etc/init.d/nginx stop

[root@localhost 01]# !ps

[root@localhost 01]# less /var/log/messages           #查看日誌

[root@localhost 01]# ip addr                    #查看配置文件中的IP地址

[root@localhost 01]# iptables -nvL                     #查看規則

[root@localhost 01]#  getenforce

Disabled

在132上面操做

[root@localhost 02]# iptables -nvL                     #查看規則

[root@localhost 02]# systemctl stop firewalld                     #關閉防火牆

[root@localhost 02]# setenforce 0                                      #關閉防火牆         

[root@localhost 02]# > /etc/keepalived/keepalived.conf

[root@localhost 02]# vi !$                         #編輯keepalived.conf

 

global_defs {
   notification_email {
     aming@aminglinux.com
   }
   notification_email_from root@aminglinux.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {                                      #檢測服務是否正常
    script "/usr/local/sbin/check_ng.sh"
    interval 3
}

vrrp_instance VI_1 {                                              #定義master一些
    state MASTER
    interface ens33                               #發廣播的ID
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {                               #認證相關信息
        auth_type PASS
        auth_pass aminglinux>com
    }
    virtual_ipaddress {                    #定義vip
        192.168.133.100                   #修改爲跟主同樣
    }

    track_script {
        chk_nginx
    }

}

檢測nginx是否正常的腳本

[root@localhost 02]# vim /usr/local/sbin/check_ng.sh

#!/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_ng.log
                systemctl stop keepalived
        fi
fi

[root@localhost 02]# chmod 755 !$

chmod 755 /usr/local/sbin/check_ng.sh

[root@localhost 02]# systemctl start keepalived               #啓動keepalived  服務

[root@localhost 02]# ps aux | grep keep             #查看進程有沒有啓動

[root@localhost 02]# systemctl restart keepalived

[root@localhost 01]# ifconfig                     #查看IP,在瀏覽器輸入顯示出來的IP

在瀏覽器輸入IP

在01上面

[root@localhost 01]# cat /usr/local/nginx/conf/vhost                       #查看配置文件

aaa.com.conf     ld.conf      proxy.conf    ssl.conf    test.com.conf

[root@localhost 01]# cat /usr/local/nginx/vhost/aaa.com.conf

server

{

  listen 80 default_server;

  server_name aaa.com;

  index index.html index.html index.php;

  root /data/wwwroot/default;

location ~\.php$

   {

             include fastcgi_params;

             fastcgi_pass unix:/tmp/aming.sock;

            fastcgi_index index.php;

            fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name

    }

}

[root@localhost 01]# cat /data/wwwroot/default/index.html

master master .This is the default site.

 

由於02虛擬機是yum安裝nginx的,因此master所在的位置不一樣

[root@localhost 02]# cat /usr/share/nginx/html/index.html

backup  backup.

[root@localhost 02]#ifconfig           #查看IP,在瀏覽器輸入顯示出來的IP

在瀏覽器輸入IP

[root@localhost 02]# ps aux | grep nginx                         #開啓keepalived,就在自動開啓nginx服務

[root@localhost 02]# systemctl stop nginx

 

問題nginx關不掉,緣由:keepalived服務自帶的nginx,須要關閉keepalived服務。

測試高可用

• 先肯定好兩臺機器上nginx差別,好比能夠經過curl -I 來查看nginx版本

• 測試1:關閉master上的nginx服務

• 測試2:在master上增長iptabls規則

• iptables -I OUTPUT -p vrrp -j DROP

• 測試3:關閉master上的keepalived服務

• 測試4:啓動master上的keepalived服務

實例:

把協議中的APP包分掉

[root@localhost 01]# iptables -I OUTPUT -p vrrp -j DROP

[root@localhost 01]# iptables -nvL                    #查看規則

[root@localhost 01]# tail /var/log/messages                     #查看日誌

[root@localhost 01]# lesss !$

[root@localhost 01]#  ip add

 

在02從機器上

[root@localhost 02]# ip addr

[root@localhost 02]# less /var/log/messages             #查看日誌

[root@localhost 02]# iptables -nvL              #查看規則  

在主虛擬機上

[root@localhost 01]# iptables -F

[root@localhost 01]#  systemctl stop keepalived                #中止keepalived 服務

[root@localhost 01]# ip add

 

在從虛擬機上

[root@localhost 02]# ip addr

[root@localhost 02]#  tail /var/log/messages             #查看日誌

說明VIP已經到從機器上了

 

在主虛擬機上

[root@localhost 01]# systemctl starp keepalived                #啓動keepalived 服務

[root@localhost 01]# ip add

在從虛擬機上

[root@localhost 02]# tail /var/log/messages       

 

 

 

 

注意:keeplived 配置文件裏面vip指定的網卡須要用ip add查看後,把配置文件裏面的interface 改爲本機上的網卡名字,我就是照搬複製沒改網卡名字,因此就報錯了

Keepalived_vrrp[17516]: VRRP_Instance(VI_1) Unknown interface !

改完以後就ok了

 

常見問題:

備用keepalived起來的前提就是主的keepalived停掉了(宕機、或者nginx起不來等 致使主keepalived服務停掉 vrrp協議不可達),又怎麼會出現主和備的keepalived同時存在 並爭搶vip資源呢?

能不能舉例說明一下 主備的keepalived哪些狀況會同時存在呀?

答:這個就是腦裂。 主認爲從宕機,從認爲主宕機就會出現腦裂。 若是兩臺機器直接網絡異常,好比網卡通訊有問題,或者配置了iptables策略,就會出現腦裂。

 

二、keepalived核心服務沒啓動,是哪一個模塊喚起的nginx

監測的那個

三、在生產環境中是否是要保證NGINX服務要一致,這樣高可用性纔有意義吧。

怎麼保證NGINX服務是一致的啊。。

答:固然要一致。   你兩臺機器配置文件保持同步就是了。每次改完一個,另外的也要同步過去。

四、master和backup的keepalived的配置文件中的網卡名字是同一個,這個沒有影響嗎?backup主機上要是沒有那個網卡,keepalived是怎麼處理的。

答本身配置本身的,若是master上叫eth0,backup上叫eth1,在配置文件中指定便可。 

相關文章
相關標籤/搜索