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

7月3日任務

18.1 集羣介紹
18.2 keepalived介紹
18.3/18.4/18.5 用keepalived配置高可用集羣
擴展
heartbeat和keepalived比較http://blog.csdn.net/yunhua_lee/article/details/9788433 
DRBD工做原理和配置 http://502245466.blog.51cto.com/7559397/1298945
mysql+keepalived http://lizhenliang.blog.51cto.com/7876557/1362313html

Linux集羣概述

  • 根據功能劃分爲兩大類:高可用和負載均衡
    • 高可用集羣一般爲兩臺服務器,一臺工做,另一臺做爲冗餘,當提供服務的機器宕機,冗餘將接替繼續提供服務 - 高可用衡量標準,4個九,就是99.99%,表示一個比例,在一年時間內99.99%的時間都是在線的,不容許宕機,不容許服務不可用。另外還有的是5個9,6個9
      • 實現高可用的開源軟件有:heartbeat、keepalived
        • heartbeat軟件,在centos6中有不少bug,並且好久沒有更新版本了,不建議繼續使用
        • keepalived軟件,不只有高可用的功能,還有負載均衡的功效,配置也很是簡單
    • 負載均衡集羣,須要有一臺服務器做爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外,就是給用戶提供服務的服務器了,這些服務器數量至少爲2
      • 實現負載均衡的開源軟件有LVS、keepalived、haproxy、nginx,商業的有F五、Netscaler
        • 商業的負載均衡器,至關因而一臺設備,成本高昂
          • 商業的負載均衡器,優點 在於有更高的併發量,也有很好的穩定性

keepalived介紹

  • 在這裏使用keepalived來實現高可用集羣,由於heartbeat在centos6上有一些問題,影響實驗效果
    • heartbeat 切換的時候,會不是很及時——>好比:主 已經宕機了,但 從 卻一直啓動不了,通訊會不暢,因此不使用 heartbeat
  • keepalived經過VRRP(Virtual Router Redundancy Protocl 中文爲:虛擬路由冗餘協議)來實現高可用。
    • 虛擬路由冗餘協議(Virtual Router Redundancy Protocol,簡稱VRRP)是由IETF提出的解決局域網中配置靜態網關出現單點失效現象的路由協議,1998年已推出正式的RFC2338協議標準。VRRP普遍應用在邊緣網絡中,它的設計目標是支持特定狀況下IP數據流量失敗轉移不會引發混亂,容許主機使用單路由器,以及及時在實際第一跳路由器使用失敗的情形下仍可以維護路由器間的連通性。
  • 在這個協議裏,會將多臺功能相同的路由器組成一個小組,這個小組裏會有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配置高可用集羣

  • 準備兩臺機器134和135,134做爲master,135做爲backup
  • 兩臺機器都執行yum install -y keepalived
  • 兩臺機器都安裝nginx,其中134上已經編譯安裝過nginx,135上須要yum安裝nginx: yum install -y nginx
  • 設定vip爲100
  • 編輯134上keepalived配置文件,內容獲取地址
  • 134編輯監控腳本,內容獲取地址
  • 給腳本755權限
  • systemctl start keepalived 130啓動服務
  • 135上編輯配置文件,內容獲取地址
  • 135上編輯監控腳本,內容獲取地址
  • 給腳本755權限
  • 135上也啓動服務 systemctl start keepalived

keepalived配置高可用集羣

  1. 首先準備兩臺機器,都安裝keepalived yum install -y keepalived   keepalived,實際是包含一個服務的,也就是說這個服務用來實現高可用
  2. 這裏使用 nginx ,把它做爲一個高可用的對象——>使用nginx做爲演示對象的緣由,由於nginx在工做中,在生產環境中,不少企業把nginx作一個負載均衡器 ,假設nginx一旦掛掉,那麼後端全部的web,即便說是正常的,那也沒法訪問到
  3. 如果A、B機器沒有裝nginx服務,能夠直接 yum安裝
B機器yum安裝nginx
[root@yong-02 ~]# yum install -y nginx
  • 更改keepalived配置文件了,內容地址
  • 默認的配置文件路徑在/etc/keepalived/keepalived.conf
  • 清空文件的快捷鍵方法 > !$
A機器更改配置文件
[root@yong-01 ~]# ls /etc/keepalived/keepalived.conf 
/etc/keepalived/keepalived.conf
[root@yong-01 ~]# > !$
> /etc/keepalived/keepalived.conf
[root@yong-01 ~]# vim !$
vim /etc/keepalived/keepalived.conf   //去文件地址去下載內容
將拷貝的內容複製進去
只須要改網卡名字和IP192.168.180.100
####################### #  全局配置 #######################
global_defs {                            //global_defs 全局配置標識
   notification_email {               //notification_email用於設置報警郵件地址
   yyli2008@163.com           //能夠設置多個,每行一個
   }
   notification_email_from root@aminglinux.com    //設置郵件發送地址  
   smtp_server 127.0.0.1                //設置郵件的smtp server地址
   smtp_connect_timeout 30            //設置鏈接smtp sever超時時間
   router_id LVS_DEVEL
}

###################### #  VRRP配置 ######################
vrrp_script chk_nginx {               
    script "/usr/local/sbin/check_ng.sh"   //檢查服務是否正常,經過寫腳本實現,腳本檢查服務健康狀態
    interval 3                      //檢查的時間間斷是3秒
}
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 aminglinux>com   //密碼的形式是一個字符串
    }
    virtual_ipaddress {                  //設置虛擬IP地址 (VIP),又叫作漂移IP地址
        192.168.180.100   //更改成192.168.180.100
    }
    track_script {               //加載腳本 
        chk_nginx            
    }
}
  • virtual_ipaddress:簡稱VIP,這個vip,兩臺機器,一個主,一個從,正常的狀況是主在服務,主宕掉了,從起來了,從啓動服務,從啓動nginx之後,,啓動之後,訪問那個IP呢?把域名解析到那個IP上呢?假如解析到主上,主宕掉了,因此這個,須要定義一個公有IP(主上用的IP,從上也用的IP);這個IP是隨時能夠夏掉,去配置的
  • 定義監控腳本,腳本內容獲取地址
  • 腳本路徑在keepalived配置文件中有定義,路徑爲/usr/local/sbin/check_ng.sh
A機器定義監控腳本
[root@yong-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
  • 「腦裂」,在高可用(HA)系統中,當聯繫2個節點的「心跳線」斷開時,原本爲一總體、動做協調的HA系統,就分裂成爲2個獨立的個體。因爲相互失去了聯繫,都覺得是對方出了故障。兩個節點上的HA軟件像「裂腦人」同樣,爭搶「共享資源」、爭起「應用服務」,就會發生嚴重後果——或者共享資源被瓜分、2邊「服務」都起不來了;或者2邊「服務」都起來了,但同時讀寫「共享存儲」,致使數據損壞
  • 如何判斷腦裂?
    • 分別在兩臺機查看當前服務器是否擁有虛擬IP,若是兩臺服務器都擁有,則說明發生了腦裂,證實目前雙機通訊出現問題,產生此問題的原有在於 兩臺服務器都探測不到組內其餘服務器的狀態(心跳請求沒法正常響應),私自斷定另外一臺服務器掛起,則搶佔虛擬IP,腦裂的出現是不被容許的,解決此問題的方法爲檢查防火牆設置(關閉防火牆)或者使用串口通訊。
  • 腳本建立完以後,還須要改變腳本的權限(不更改權限,就沒法自動加載腳本,那就沒法啓動keepalived服務)
[root@yong-01 ~]# chmod 755 /usr/local/sbin/check_ng.sh
  • 啓動keepalived服務,並查看是否啓動成功(PS:啓動不成功,有多是防火牆未關閉或者規則限制致使的)
  • systemctl stop firewalld 關閉firewalld
  • iptables -nvL
  • setenforce 0 臨時關閉selinux
  • getenforce命令查看是否爲Permissive
  • 這時再來啓動keepalived,就會看到keepalived進程服務了
[root@yong-01 ~]# systemctl start keepalived
[root@yong-01 ~]# ps aux |grep keep
root      4979  0.0  0.0 118608  1384 ?        Ss   23:14   0:00 /usr/sbin/keepalived -D
root      4980  0.0  0.1 127468  3288 ?        S    23:14   0:00 /usr/sbin/keepalived -D
root      4982  0.0  0.1 127340  2820 ?        S    23:14   0:00 /usr/sbin/keepalived -D
root      6125  0.0  0.0 112676   984 pts/0    R+   23:23   0:00 grep --color=auto keep
  • 查看nginx服務進程
[root@yong-01 ~]# ps aux |grep nginx
root      4648  0.0  0.0  24792   760 ?        Ss   22:55   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody    4649  0.0  0.0  25188  1720 ?        S    22:55   0:00 nginx: worker process
root      6187  0.0  0.0 112676   984 pts/0    R+   23:24   0:00 grep --color=auto nginx
  • 這時中止nginx服務 
  • /etc/init.d/nginx stop  再來查看nginx服務進程,會看到自動加載了
[root@yong-01 ~]# /etc/init.d/nginx stop
Stopping nginx (via systemctl):                            [  肯定  ]
[root@yong-01 ~]# ps aux |grep nginx
root      6270  0.0  0.0  24792   756 ?        Ss   23:24   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody    6274  0.0  0.0  25188  1212 ?        S    23:24   0:00 nginx: worker process
root      6282  0.0  0.0 112676   984 pts/0    R+   23:24   0:00 grep --color=auto nginx
  • keepalived日誌文件路徑  /var/log/messages
  • 查看ip地址,使用 ip add 命令,而不能使用ifconfig命令,由於 ifconfig命令 是沒法查看到vip192.168.180.100這個IP的
[root@yong-01 ~]# 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:29:2b:60 brd ff:ff:ff:ff:ff:ff
    inet 192.168.180.134/24 brd 192.168.180.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.180.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::8004:45b5:96c5:3ca5/64 scope link 
       valid_lft forever preferred_lft forever
  • 檢查A、B 機器下防火牆和selinux是否關閉了,若沒有關閉,可能會致使實驗失敗
  • systemctl stop firewalld 關閉firewalld
  • iptables -nvL
  • setenforce 0 臨時關閉selinux
  • getenforce命令查看是否爲Permissive

以上就是主機器A的配置

backup 機器配置

  1. 在B機器yum安裝nginx和keepalived
  2. 關閉B機器的防火牆和selinux
  • iptables -F 清空規則
  • setenforce 0 臨時關閉selinux
  • 自定義B機器keepalived配置文件,內容獲取地址,更改虛擬IP和主同樣的
首先清空B機器keepalived裏面自帶的配置文件
[root@yong-02 ~]# >/etc/keepalived/keepalived.conf 
[root@yong-02 ~]# vim /etc/keepalived/keepalived.conf 

而後複製配置文件並粘貼進去,更改虛擬IP和主同樣的
global_defs {
   notification_email {
     yyli2008@163.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 {
    state BACKUP        //這裏 和master不同的名字
    interface ens33       //網卡和當前機器一致,不然沒法啓動keepalived服務
    virtual_router_id 51        //和主機器 保持一致
    priority 90            //權重,要比主機器小的數值
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass aminglinux>com
    }
    virtual_ipaddress {
        192.168.180.100        //這裏更改成192.168.180.100
    }
    track_script {
        chk_nginx
    }
}
  • 定義監控腳本,路徑再keepalived裏面已定義過,腳本內容地址
  • 這個腳本和主上的腳本有一點區別,啓動nginx的命令不一樣,由於一個是yum安裝,一個是源碼包安裝
[root@yong-02 ~]# vim /usr/local/sbin/check_ng.sh

#時間變量,用於記錄日誌
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
  • 改動腳本的權限,設置爲755權限
[root@yong-02 ~]# chmod 755 /usr/local/sbin/check_ng.sh
  • B機器啓動keepalived服務  systemctl start keepalived
[root@yong-02 ~]# systemctl start keepalived
[root@yong-02 ~]# ps aux |grep keepalived
root      2507  0.0  0.0 118608  1384 ?        Ss   23:34   0:00 /usr/sbin/keepalived -D
root      2508  0.0  0.1 122804  2376 ?        S    23:34   0:00 /usr/sbin/keepalived -D
root      2509  0.0  0.1 122804  2420 ?        S    23:34   0:00 /usr/sbin/keepalived -D
root      2515  0.0  0.0 112676   984 pts/0    R+   23:34   0:00 grep --color=auto keepalived

如何區分主和從上的nginx?

  • A機器,是源碼包安裝的nginx
[root@yong-01 ~]# mv /usr/local/nginx/html/index.html /usr/local/nginx/html/index.html.bak
[root@yong-01 ~]# vim /usr/local/nginx/html/index.html
master This is the default sete.

輸入圖片說明

  • B機器是yum安裝的nginx
    • 默認的索引頁在 /usr/share/nginx/html/index.html
[root@yong-02 ~]# mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak
[root@yong-02 ~]# vim /usr/share/nginx/html/index.html
backup backup.
  • 訪問192.168.180.100這個VIP會看到和主機器(即A機器相同的內容),說明如今訪問到的是機器master,VIP在master上

輸入圖片說明

問題-B機器沒法調用nginx服務?

  • B機器關閉nginx服務,keepalived沒法拉動nginx服務起來
  • 解決方法:
    • 再次設置755權限,就能夠拉動nginx服務了

測試高可用

  1. 模擬線上生產環境,主機器宕機環境,最簡單直接的方法,就是直接關閉keepalived服務
  2. 關閉master機器(即A機器)上的keepalived服務關閉
[root@yong-01 ~]# systemctl stop keepalived
  • 查看A機器上的VIP被已經釋放掉了
[root@yong-01 ~]# 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:29:2b:60 brd ff:ff:ff:ff:ff:ff
    inet 192.168.180.134/24 brd 192.168.180.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::8004:45b5:96c5:3ca5/64 scope link 
       valid_lft forever preferred_lft forever
  • 查看backup機器(即B機器)在監聽VIP
[root@yong-02 ~]# 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:36:a2:be brd ff:ff:ff:ff:ff:ff
    inet 192.168.180.135/24 brd 192.168.180.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.180.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.180.136/24 brd 192.168.180.255 scope global secondary ens33:0
       valid_lft forever preferred_lft forever
    inet6 fe80::c44:f02d:4192:8d42/64 scope link 
       valid_lft forever preferred_lft forever
  • 查看B機器日誌
[root@yong-02 ~]# tail /var/log/messages
Jul  4 15:40:44 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:44 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:44 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:44 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:49 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:49 yong-02 Keepalived_vrrp[2047]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.180.100
Jul  4 15:40:49 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:49 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:49 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:49 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
  1. 瀏覽器訪問vip,會看到已經變成backup機器上的了mysql

  2. 在master機器(即A機器)啓動keepalived服務,會看到vip這個IP馬上回來了linux

[root@yong-01 ~]# systemctl start keepalived
[root@yong-01 ~]# 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:29:2b:60 brd ff:ff:ff:ff:ff:ff
    inet 192.168.180.134/24 brd 192.168.180.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.180.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::8004:45b5:96c5:3ca5/64 scope link 
       valid_lft forever preferred_lft forever
  • 查看B機器日誌變化
[root@yong-02 ~]# tail /var/log/messages
Jul  4 15:40:44 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:44 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:44 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:44 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:49 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:49 yong-02 Keepalived_vrrp[2047]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.180.100
Jul  4 15:40:49 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:49 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:49 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100
Jul  4 15:40:49 yong-02 Keepalived_vrrp[2047]: Sending gratuitous ARP on ens33 for 192.168.180.100

##總結nginx

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