Linux集羣、Keepalived—Nginx高可用集羣架構搭建

第十八章 Linux集羣

18.1 集羣介紹

Linux集羣根據功能劃分爲兩大類:高可用和負載均衡。linux

高可用集羣

高可用集羣一般爲2臺服務器,一臺工做,另外一臺做爲冗餘,當提供服務的機器宕機時,冗餘將接替繼續提供服務。
實現高可用的開源軟件有:heartbeat、Keepalived,其中heartbeat已無人維護,因此從此使用Keepalived來搭建高可用集羣。nginx

負載均衡集羣

負載均衡集羣,須要有1臺服務器做爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外就是給用戶提供服務的服務器了,這些服務器數量至少爲2臺,因此負載均衡集羣至少要3臺服務器。
實現負載均衡的開源軟件有:LVS、Keepalived、haproxy、nginx;商業軟件有:F五、Netscaler。vim

18.2 Keepalived介紹

Keepalived經過VRRP(virtual router redundancy protocol)虛擬路由冗餘協議來實現高可用。
在這個協議裏會將多臺功能相同的路由器組成一個小組,這個小組會有1個master角色和N(N≥1)個backup角色。
Keepalived有三個模塊:core、check、vrrp。其中core模塊爲Keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析;check模塊負責健康檢查,vrrp負責實現vrrp協議。後端

18.3-18.5 用Keepalived配置高可用集羣

操做環境:

兩臺虛擬機:
系統:centos 7.3_64位
master:192.168.8.131;編譯安裝nginx;yum install -y keepalived
backup:192.168.8.130;yum install -y nginx;yum install -y keepalived
VIP:192.168.8.100
注: VIP(virtual IP)虛擬IP,由Keepalived設置,用於服務器對外提供服務。centos

準備工做

master:瀏覽器

安裝Keepalived:
[root@adailinux ~]# yum install -y keepalived

查看nginx版本:
[root@adailinux ~]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.12.1

backup:bash

安裝Keepalived:
[root@localhost ~]# yum install -y keepalived

安裝nginx:
[root@localhost ~]# yum install -y nginx

查看nginx版本:
[root@localhost ~]# nginx -v
nginx version: nginx/1.10.2

開始配置

配置master機器:

配置Keepalived:
在此使用自定義的Keepalived配置文件腳本(先清空或刪除自帶配置文件腳本)。服務器

[root@adailinux ~]# 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                             ##運行keepalived的機器的一個標識,多個節點標識能夠相同,也能夠不一樣
}
vrrp_script chk_nginx {                            #定義監控腳本
    script "/usr/local/sbin/check_ng.sh"           #指定服務健康檢測(check)腳本
    interval 3                                     #檢測時間間隔
}
vrrp_instance VI_1 {                               
    state MASTER                                   #定義該服務的角色 
    interface ens33                                #定義在本機中監聽VIP的網卡
    virtual_router_id 51                           #虛擬路由id(同組中的服務器保持該id一致)
    priority 100                                   #指定本機權重(決定優先級)
    advert_int 1                                   #vrrp Multicast廣播週期秒數
    authentication {                               #定義認證相關信息  
        auth_type PASS                             #認證類型爲密碼形式
        auth_pass 123456                           #定義認證密碼
    }
    virtual_ipaddress {                            #定義VIP
        192.168.188.100
    }
    track_script {                                 #加載監控服務(腳本)
        chk_nginx                                  #注意此處服務名稱要與上面監控腳本名稱一致
    }
}

建立監控腳本:負載均衡

[root@adailinux ~]# 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      #在此中止Keepalived服務是爲了不發生腦裂
        fi
fi

更改腳本權限:
[root@adailinux ~]# chmod 755 /usr/local/sbin/check_ng.sh

啓動Keepalived服務:
[root@adailinux ~]# systemctl start keepalived

檢測服務狀態:
[root@adailinux ~]# ps aux |grep keep
root      4586  0.0  0.1 111708  1308 ?        Ss   15:44   0:00 /usr/sbin/keepalived -D
root      4587  0.1  0.2 111708  2556 ?        S    15:44   0:00 /usr/sbin/keepalived -D
root      4588  0.6  0.1 111708  1620 ?        S    15:44   0:00 /usr/sbin/keepalived -D
root      4682  0.0  0.0 112664   972 pts/1    S+   15:45   0:00 grep --color=auto keep
[root@adailinux ~]# ps aux |grep nginx
root      3380  0.0  0.1  45352  1164 ?        Ss   14:15   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody    3381  0.0  0.4  47840  4064 ?        S    14:15   0:00 nginx: worker process
nobody    3382  0.0  0.3  47840  3804 ?        S    14:15   0:00 nginx: worker process
root      4696  0.0  0.0 112664   976 pts/1    R+   15:45   0:00 grep --color=auto nginx
[root@adailinux ~]# /etc/init.d/nginx stop
Stopping nginx (via systemctl):                            [  肯定  ]
[root@adailinux ~]# ps aux |grep nginx
root      4814  0.0  0.1  45352  1184 ?        Ss   15:46   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody    4816  0.0  0.3  47840  3820 ?        S    15:46   0:00 nginx: worker process
nobody    4817  5.0  0.3  47840  3820 ?        S    15:46   0:00 nginx: worker process
root      4827  0.0  0.0 112664   976 pts/1    S+   15:46   0:00 grep --color=auto nginx
注:由以上檢測狀態可知關閉nginx服務以後Keepalived會再次自動啓動nginx服務

說明: 「腦裂」,即當master宕機後仍然未釋放VIP,同時backup接替master提供服務要使用同一VIP,於是致使兩臺機器爭佔同一VIP致使服務紊亂,因此當master宕機後須要關閉其Keepalived服務來避免腦裂現象發生。Keepalived服務的日誌位置:/var/log/messages。
查看網卡信息:測試

[root@adailinux ~]# ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:8a:1b:5c brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.131/24 brd 192.168.8.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.8.100/32 scope global ens33
       valid_lft forever preferred_lft forever

說明: 在此不能使用ifconfig查看,ens33中增長了一個IP:192.168.8.100/32。

配置backup機器:

配置Keepalived:
一樣使用自定義腳本。

[root@localhost ~]# 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 BACKUP           #角色
    interface ens33        
    virtual_router_id 51   
    priority 90            #權重
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.8.100
    }   
    track_script {
        chk_nginx
    }   
}

說明: 若是是多臺服務器,權重決定了master宕機後,backup接管master角色的順序。

建立監控腳本:

[root@localhost ~]# 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 ~]# chmod 755 /usr/local/sbin/check_ng.sh

啓動Keepalived服務:
[root@localhost ~]# systemctl start keepalived.service

說明: 該檢測腳本中與master檢測腳本的區別在於:systemctl start nginx,即nginx的啓動方式,由於在backup服務器中是使用yum安裝的nginx,默認添加到系統服務中。

測試

master宕機前:

master:

mark

backup:

mark

使用VIP訪問:

mark
此時默認訪問到master服務器。

master宕機後:

master宕機後該機器上的Keepalived服務必將關閉,此處模擬master服務器上的Keepalived關閉後的情景:

關閉Keepalived服務:
[root@adailinux ~]# systemctl stop keepalived.service

查看master上IP狀態:

[root@adailinux ~]# ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:8a:1b:5c brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.131/24 brd 192.168.8.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::65d2:adc:20d3:8c74/64 scope link 
       valid_lft forever preferred_lft forever

說明: ens33上已經沒有了VIP。

查看back上IP狀態:

[root@localhost ~]# ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:40:9f:e7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.130/24 brd 192.168.8.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.8.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b61a:f99d:bfc0:e0b5/64 scope link 
       valid_lft forever preferred_lft forever

說明: VIP轉移到backup的ens33網卡上。而後使用瀏覽器訪問VIP。

mark
即,master宕機後由backup繼續提供服務。

注: 恢復master上的Keepalived服務後,會由master服務器爲該集羣提供服務。以下:

在master上操做:
[root@adailinux ~]# systemctl start keepalived.service 
[root@adailinux ~]# ip add
2: ens33:
    inet 192.168.8.131/24 brd 192.168.8.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.8.100/32 scope global ens33
       valid_lft forever preferred_lft forever


在backup上:  
[root@localhost ~]# ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:40:9f:e7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.130/24 brd 192.168.8.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b61a:f99d:bfc0:e0b5/64 scope link 
       valid_lft forever preferred_lft forever

再次使用瀏覽器訪問VIP:

mark

即,Keepalived——Nginx高可用集羣搭建完成!!!

相關文章
相關標籤/搜索