天天看點

叢集介紹、keepalived介紹、用keepalived配置高可用叢集

叢集介紹

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

1、高可用叢集通常為2台伺服器,一台工作,另一台作為備援,當提供服務的機器當機時,備援将接替繼續提供服務。

實作高可用的開源軟體有:heartbeat、Keepalived,其中heartbeat很多bug已無人維護(不推薦使用),是以今後使用Keepalived來搭建高可用叢集。

2、負載均衡叢集,需要有1台伺服器作為分發器,它負責把使用者的請求分發給後端的伺服器處理,在這個叢集裡,除了分發器外就是給使用者提供服務的伺服器了,這些伺服器數量至少為2台,是以負載均衡叢集至少要3台伺服器。

實作負載均衡的開源軟體有:LVS、Keepalived、haproxy、nginx;商業軟體有:F5、Netscaler。

keepalived介紹

Keepalived通過VRRP(virtual router redundancy protocol)虛拟路由備援協定來實作高可用。

在這個協定裡會将多台功能相同的路由器組成一個小組,這個小組會有1個master角色和N(N≥1)個backup角色。

Keepalived有三個子產品:core、check、vrrp。其中core子產品為Keepalived的核心,負責主程序的啟動、維護以及全局配置檔案的加載和解析;check子產品負責健康檢查,vrrp負責實作vrrp協定。

用keepalived配置高可用叢集

準備環境

master:192.168.3.74 安裝編譯nginx

backup:192.168.3.83 安裝編譯nginx

VIP:192.168.3.100 # 注: VIP(virtual IP)虛拟IP,由Keepalived設定,用于伺服器對外提供服務。

準備工作:

master

[root@centos7 ~]# yum install -y keepalived

[root@centos7 ~]# /usr/local/nginx/sbin/nginx -v

nginx version: nginx/1.12.1

backup

[root@test ~]# yum install -y keepalived

[root@test ~]# /usr/local/nginx/sbin/nginx -v

nginx version: nginx/1.12.2

配置主伺服器上:

1、[root@centos7 ~]# vi  /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 {                            #定義nginx監控腳本

    script "/usr/local/sbin/check_ng.sh"           #指定服務健康檢測(check)腳本

    interval 3                                     #檢測時間間隔

vrrp_instance VI_1 {

    state MASTER                                   #定義該服務的角色

    interface eno16777736                                 #定義在本機中監聽VIP的網卡

    virtual_router_id 51                           #虛拟路由id(同組中的伺服器保持該id一緻)

    priority 100                                   #指定本機權重(決定優先級)

    advert_int 1

    authentication {                               #定義認證相關資訊

        auth_type PASS                             #認證類型為密碼形式

        auth_pass 123456                           #定義認證密碼

    }

    virtual_ipaddress {                            #定義VIP

        192.168.3.100

    track_script {                                 #加載監控服務(腳本)

        chk_nginx                                  #注意此處服務名稱要與上面監控腳本名稱一緻

2、[root@centos7 ~]# cat  /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 keepalive      #在此停止Keepalived服務是為了避免發生腦裂

        fi

fi

3、[root@centos7 ~]# chmod 755  /usr/local/sbin/check_ng.sh

4、啟動

[root@centos7 ~]# systemctl start keepalived

[root@centos7 ~]# ps -aux | grep keep

root      21327  0.0  0.0 120712  1400 ?        Ss   10:33   0:00 /usr/sbin/keepalived -D

root      21328  0.0  0.1 120712  2748 ?        S    10:33   0:00 /usr/sbin/keepalived -D

root      21329  0.4  0.1 120712  2440 ?        S    10:33   0:00 /usr/sbin/keepalived -D

root      21360  0.0  0.0 112664   968 pts/0    R+   10:33   0:00 grep --color=auto keep

驗證nginx的監控腳本:

1、将nginx伺服器停止

[root@centos7 ~]# /etc/init.d/nginx stop

2、再看還是會有nginx服務的程序

[root@centos7 ~]# netstat -nutlp| grep 80

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      23022/nginx: master 

3、隻有當keepalived服務停止,才會停止nginx

4、檢視vip

[root@centos7 ~]# ip addr

inet 192.168.3.100/32 scope global eno16777736

“腦裂”,即當master當機後仍然未釋放VIP,同時backup接替master提供服務要使用同一VIP,因而導緻兩台機器争占同一VIP導緻服務紊亂,是以當master當機後需要關閉其Keepalived服務來避免腦裂現象發生。Keepalived服務的日志位置:/var/log/messages。

配置從伺服器上的:

1、

[root@test ~]# cat  /etc/keepalived/keepalived.conf

global_defs {

     [email protected]

   }

vrrp_script chk_nginx {

    script "/usr/local/sbin/check_ng.sh"

    interval 3

vrrp_instance VI_1 {       #隻有該部分與master有差別

    state BACKUP           #角色

    interface eth0  

    virtual_router_id 51   

    priority 90            #權重

    authentication {

        auth_type PASS

        auth_pass 123456

    virtual_ipaddress {

    }   

    track_script {

        chk_nginx

2、[root@test ~]# vim /usr/local/sbin/check_ng.sh

                /etc/init.d/keepalived stop     #在此停止Keepalived服務是為了避免發生腦裂

3、[root@test ~]# chmod 755 /usr/local/sbin/check_ng.sh

4、[root@test ~]# /etc/init.d/keepalived start

5、[root@test ~]# ps -ef | grep keep

root      7473     1  0 10:47 ?        00:00:00 /usr/sbin/keepalived -D

root      7474  7473  0 10:47 ?        00:00:00 /usr/sbin/keepalived -D

root      7475  7473  0 10:47 ?        00:00:00 /usr/sbin/keepalived -D

root      7479  3017  0 10:47 pts/0    00:00:00 grep keep

驗證:

當機前的驗證

1、通路master:

<a href="https://s4.51cto.com/oss/201711/22/59d14df0453b8bb90f0cbfc58ba205b1.png-wh_500x0-wm_3-wmp_4-s_2627363339.png" target="_blank"></a>

2、通路從伺服器

<a href="https://s2.51cto.com/oss/201711/22/b901647cf12de98ec37e4ac0df10732e.png-wh_500x0-wm_3-wmp_4-s_2162970524.png" target="_blank"></a>

3、通路vip

<a href="https://s4.51cto.com/oss/201711/22/01a0ea84e8231a484e64eb81d44217e8.png-wh_500x0-wm_3-wmp_4-s_4253163443.png" target="_blank"></a>

master當機後:

關閉Keepalived服務:

[root@centos7 ~]# systemctl stop keepalived

[root@centos7 ~]# ps -ef | grep keep

root      25316  16637  0 10:58 pts/0    00:00:00 grep --color=auto keep

此時主機上已經沒有vip了,vip已經轉移到了從伺服器上

[root@test ~]# ip addr

 inet 192.168.3.83/24 brd 192.168.3.255 scope global eth0

 inet 192.168.3.100/32

通路vip時已轉移到備份上:

<a href="https://s3.51cto.com/oss/201711/22/2ee3e1aca9cb271cdb5e9cfab6696fe9.png-wh_500x0-wm_3-wmp_4-s_1027594348.png" target="_blank"></a>

現将主伺服器keepalived啟動:

vip又轉移到了主伺服器上,從伺服器上已經沒有vip了

再次通路vip,又回到主伺服器上了。

<a href="https://s4.51cto.com/oss/201711/22/417cc3ead4d875b604f0f3033de7a894.png-wh_500x0-wm_3-wmp_4-s_1635067972.png" target="_blank"></a>

本文轉自 jiekegz  51CTO部落格,原文連結:http://blog.51cto.com/jacksoner/1984020

繼續閱讀