集羣介紹&keepalived介紹&用keepalived配置高可用集羣

18.1 集羣介紹

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

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

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

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

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

18.2 keepalived介紹

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

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

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

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

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

18.3/18.4/18.5 用keepalived配置高可用集羣

準備兩臺服務器,一臺做爲master,另外一臺做爲backup。

安裝keepalived軟件包

keepalived,實際是包含一個服務的,也能夠說這個服務用來實現高可用

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

安裝nginx

使用 nginx ,把它做爲一個高可用的對象——>使用nginx做爲演示對象的緣由,由於nginx在工做中,在生產環境中,不少企業把nginx作一個負載均衡器 ,假設nginx一旦掛掉,那麼後端全部的web,即便說是正常的,那也沒法訪問到

yum安裝nginx

yum install -y nginx

源碼包安裝Nginx

主服務器配置

修改主服務器上keepalived的配置文件

########################  清除原有配置  #######################
[root@linux-5 ~]# vim /etc/keepalived/keepalived.conf 
[root@linux-5 ~]#  > !$
 > /etc/keepalived/keepalived.conf
[root@linux-5 ~]# vim /etc/keepalived/keepalived.conf 
########################  全局配置  #######################
global_defs {                            //global_defs 全局配置標識
   notification_email {                  //notification_email用於設置報警郵件地址
   lem@qq.com                            //能夠設置多個,每行一個
   }
   notification_email_from root@lem.com    //設置郵件發送地址  
   smtp_server 127.0.0.1                   //設置郵件的smtp server地址
   smtp_connect_timeout 30                 //設置鏈接smtp sever超時時間
   router_id LVS_DEVEL
}

#######################  check模塊配置  ######################
vrrp_script chk_nginx {               
    script "/usr/local/sbin/check_ng.sh"   //檢查服務是否正常,經過寫腳本實現,腳本檢查服務健康狀態
    interval 3                             //檢查的時間間斷是3秒
}
#######################  vrrp模塊配置  ######################
vrrp_instance VI_1 {                      //VRRP配置標識 VI_1是實例名稱 
    state MASTER                          //定義master相關
    interface ens33                       //經過vrrp協議去通訊、去發廣播。配置時,需注意本身的網卡名稱
    virtual_router_id 51                  //定義路由器ID ,配置的時候和從機器一致
    priority 100                          //權重,主角色和從角色的權重是不一樣的
    advert_int 1                          //設定MASTER與BACKUP主機質檢同步檢查的時間間隔,單位爲秒
    authentication {                      //認證相關信息
        auth_type PASS                    //這裏認證的類型是PASS
        auth_pass 123456                  //密碼的形式是一個字符串
    }
    virtual_ipaddress {                   //設置虛擬IP地址 (VIP),又叫作漂移IP地址
        192.168.88.100                    //更改成192.168.88.100
    }
    track_script {                        //加載腳本 
        chk_nginx            
    }
}

漂移IP地址是一個共有地址,當主機宕機後,備機Nginx啓動,若是備機Nginx解析地址依然爲源主機IP,則依舊沒法正常訪問(源主機宕機,IP地址失效)。爲解決上述問題,主機和備機都解析到一個公共IP地址,在主機宕機後備機Nginx服務啓動便可解析到正常能夠訪問的IP地址。

配置監控腳本

主機器配置監控腳本
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

若是不中止keepalived服務,則容易使服務器發生腦裂,在高可用(HA)系統中,當聯繫2個節點的「心跳線」斷開時,原本爲一總體、動做協調的HA系統,就分裂成爲2個獨立的個體。因爲相互失去了聯繫,都覺得是對方出了故障。兩個節點上的HA軟件像「裂腦人」同樣,爭搶「共享資源」、爭起「應用服務」,就會發生嚴重後果——或者共享資源被瓜分、2邊「服務」都起不來了;或者2邊「服務」都起來了,但同時讀寫「共享存儲」,致使數據損壞。

如何判斷腦裂?

分別在兩臺機查看當前服務器是否擁有虛擬IP,若是兩臺服務器都擁有,則說明發生了腦裂,證實目前雙機通訊出現問題,產生此問題的原有在於 兩臺服務器都探測不到組內其餘服務器的狀態(心跳請求沒法正常響應),私自斷定另外一臺服務器掛起,則搶佔虛擬IP,腦裂的出現是不被容許的,解決此問題的方法爲檢查防火牆設置(關閉防火牆)或者使用串口通訊。

注:因爲主上的Nginx服務是經過yum安裝的,所以腳本啓動Nginx的命令要使用systemctl start Nginx,不然沒法正常啓動。若是是經過源碼包編譯安裝的,則使用/etc/init.d/nginx start

腳本權限變動

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

啓動keepalived服務

主機和備機啓動keepalived服務前都要先檢查selinux以及防火牆是否關閉

[root@linux-5 ~]# systemctl start keepalived.service
[root@linux-5 ~]# ps aux |grep keepalived
root       4572  0.0  0.0 118608  1384 ?        Ss   23:00   0:00 /usr/sbin/keepalived -D
root       4573  0.0  0.1 122804  2364 ?        S    23:00   0:00 /usr/sbin/keepalived -D
root       4574  0.0  0.1 122804  2408 ?        S    23:00   0:00 /usr/sbin/keepalived -D
root       4576  0.0  0.0 112676   984 pts/0    S+   23:00   0:00 grep --color=auto keepalived

注:啓動keepalived服務前須要先啓動Nginx服務,不然會被斷定爲Nginx服務宕機,沒法啓動keepalived服務。

測試監控腳本可用性

[root@linux-5 ~]# ps aux |grep nginx
root       1448  0.0  0.1 120752  2096 ?        Ss   16:41   0:00 nginx: master process /usr/sbin/nginx
nginx      1449  0.0  0.1 121136  3124 ?        S    16:41   0:00 nginx: worker process
root       1519  0.0  0.0 112676   980 pts/0    R+   16:42   0:00 grep --color=auto nginx
[root@linux-5 ~]# systemctl stop nginx
[root@linux-5 ~]# ps aux |grep nginx
root       1568  0.0  0.1 120752  2092 ?        Ss   16:42   0:00 nginx: master process /usr/sbin/nginx
nginx      1569  0.0  0.1 121136  3120 ?        S    16:42   0:00 nginx: worker process
root       1586  0.0  0.0 112676   984 pts/0    R+   16:42   0:00 grep --color=auto nginx

能夠發現,當keepalived服務檢測到Nginx服務中止後,會經過監控腳本從新拉起Nginx。

查看keepalived日誌

keepalived的日誌位於/var/log/messages下

[root@linux-5 ~]# less /var/log/messages

查看漂移IP地址(VIP)

[root@linux-5 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:58:d2:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.5/24 brd 192.168.88.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.88.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.88.50/24 brd 192.168.88.255 scope global secondary ens33:0
       valid_lft forever preferred_lft forever
    inet6 fe80::531b:14ea:3a75:f113/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:58:d2:b4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::97b3:ed:1e9b:98c8/64 scope link 
       valid_lft forever preferred_lft forever

能夠發如今配置文件中設定的VIP(192.168.88.100)已處於監聽狀態

注:漂移IP只能經過ip add命令查看

從服務器配置

配置以前確保系統防火牆以及selinux均已關閉

修改從服務器的keepalived配置文件

global_defs {
   notification_email {
     lem@lemlinux.com
   }
   notification_email_from root@lemlinux.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 {
    state BACKUP                      //從機的類型爲BACKUP 
    interface ens33
    virtual_router_id 51
    priority 90                       //從機的權重要低於主機
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.88.100                //漂移IP地址與主機保持一致
    }   
    
    track_script {
        chk_nginx
    }   
    
}

修改監控腳本

[root@linux-10 ~]# 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            //從機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

修改監控腳本文件權限

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

啓動keepalived服務

[root@linux-10 ~]# systemctl start keepalived
[root@linux-10 ~]# ps aux|grep keep
root       1790  0.0  0.0 118652  1396 ?        Ss   23:01   0:00 /usr/sbin/keepalived -D
root       1791  0.0  0.1 127516  3292 ?        S    23:01   0:00 /usr/sbin/keepalived -D
root       1792  0.0  0.1 127456  2836 ?        S    23:01   0:00 /usr/sbin/keepalived -D
root       1818  0.0  0.0 112720   972 pts/0    R+   23:01   0:00 grep --color=auto keep

查看主Nginx默認訪問頁

[root@linux-5 ~]# vim /usr/share/nginx/html/index.html 
master master

查看從Nginx默認訪問頁

[root@linux-10 ~]# cat /data/wwwroot/default/index.html 
This is a default site.

訪問VIP

訪問VIP會跳轉至主機的Nginx服務。

測試高可用性

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

在以前配置master服務器仍是backup服務器,均已成功啓動(經過keepalived服務從新拉起)。

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

iptables -I OUTPUT -p vrrp -j DROP   //封禁主服務器發出的vrrp協議包
[root@linux-5 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 44 packets, 3284 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 30 packets, 3224 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   12   480 DROP       112  --  *      *       0.0.0.0/0            0.0.0.0/0

訪問測試

測試發現封堵vrrp協議包並不能達到主從切換的目的。

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

systemctl stop keepalived

查看主機IP

[root@linux-5 ~]# systemctl stop keepalived.service 
[root@linux-5 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:58:d2:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.5/24 brd 192.168.88.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.88.50/24 brd 192.168.88.255 scope global secondary ens33:0
       valid_lft forever preferred_lft forever
    inet6 fe80::531b:14ea:3a75:f113/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:58:d2:b4 brd ff:ff:ff:ff:ff:ff

主機已再也不監聽192.168.88.100(VIP)。

查看從機IP

[root@linux-10 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:66:22:58 brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.10/24 brd 192.168.88.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.88.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b1af:cd92:adf1:4329/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:66:22:62 brd ff:ff:ff:ff:ff:ff

從機已開始監聽192.168.88.100(VIP)。

查看從機日誌

[root@linux-10 ~]# tail /var/log/messages
Jul  8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100

測試訪問

測試發現keepalived服務已生效,VIP成功在從機監聽。

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

systemctl start keepalived.service

查看主機IP

[root@linux-5 ~]# systemctl start keepalived.service 
[root@linux-5 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:58:d2:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.5/24 brd 192.168.88.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.88.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.88.50/24 brd 192.168.88.255 scope global secondary ens33:0
       valid_lft forever preferred_lft forever
    inet6 fe80::531b:14ea:3a75:f113/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:58:d2:b4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::97b3:ed:1e9b:98c8/64 scope link 
       valid_lft forever preferred_lft forever

查看從機IP

[root@linux-10 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:66:22:58 brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.10/24 brd 192.168.88.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b1af:cd92:adf1:4329/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:66:22:62 brd ff:ff:ff:ff:ff:ff

查看從機日誌

[root@linux-10 ~]# tail /var/log/messages
Jul  8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:28:39 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Received advert with higher priority 100, ours 90
Jul  8 00:28:39 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Entering BACKUP STATE
Jul  8 00:28:39 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) removing protocol VIPs.

從日誌能夠看出,VIP已在從機上被清除了

測試訪問

測試發現主機keepalived服務從新使主機Nginx服務運行。

注:在生產環境中,可能會用到2-3臺backup角色, vim /etc/keepalived/keepalived.conf 這裏面的權重調成不通級別,權重越高優先級越高!除了nginx服務的話,還能夠作MySQL的高可用集羣服務。(作mysql的高可用,必定要保證兩邊的數據一致)

相關文章
相關標籤/搜索