KeepAlived

1、高可用集群介紹

集群Cluster 
            集群類型:
                      LB lvs/nginx(http/upstream, stream/upstream)
                      HA 高可用性
                               SPoF: Single Point of Failure  單點失效
                       HPC 
            系統(tǒng)可用性的公式:A=MTBF/(MTBF+MTTR)
                      (0,1), 95% 
                      幾個9(指標): 99%, ..., 99.999%,99.9999%; 
            系統(tǒng)故障: 
                      硬件故障:設計缺陷、wear out(損耗)、自然災害……
                      軟件故障:設計缺陷 4 集群Cluster 
提升系統(tǒng)高用性的解決方案之降低MTTR: 
                   手段:冗余redundant 
                   active/passive 主備 
                    active/active 雙主 
                    active --> HEARTBEAT --> passive 
                    active <--> HEARTBEAT <--> active 
高可用的是“服務”:
                    HA nginx service: 
                                      vip/nginx process[/shared storage] 
         資源:組成一個高可用服務的“組件”
                     (1) passive node的數(shù)量 
                       (2) 資源切換 5 集群Cluste
shared storage: 
                    NAS:文件共享服務器; 
                     SAN:存儲區(qū)域網(wǎng)絡,塊級別的共享
Network partition:網(wǎng)絡分區(qū)
                     quorum:法定人數(shù) 
                                  with quorum: > total/2 
                                   without quorum: <= total/2 
                      隔離設備: fence 
                                    node:STONITH = Shooting The Other 
         Node In The Head,斷電重啟
                                   資源:斷開存儲的連接
TWO nodes Cluster 
                         輔助設備:ping node, quorum disk
Failover:故障切換,即某資源的主節(jié)點故障時,將資源轉(zhuǎn)移 至其它節(jié)點的操作
Failback:故障移回,即某資源的主節(jié)點故障后重新修改上線 后,將之前已轉(zhuǎn)移至其它節(jié)點的資源重新切回的過程
HA Cluster實現(xiàn)方案: 
            vrrp協(xié)議的實現(xiàn)
                     keepalived 
                     ais:應用接口規(guī)范 完備HA集群 
                              RHCS:Red Hat Cluster Suite紅帽集群套件 
                              heartbeat 
                              corosync 

2、KeepAlived

keepalived: 
                  vrrp協(xié)議:Virtual Router Redundancy Protocol
術(shù)語: 
              虛擬路由器:Virtual Router 
              虛擬路由器標識:VRID(0-255),唯一標識虛擬路由器 
              物理路由器:
                       master:主設備 
                       backup:備用設備 
                       priority:優(yōu)先級 
               VIP:Virtual IP 
               VMAC:Virutal MAC (00-00-5e-00-01-VRID) 
通告:心跳,優(yōu)先級等;周期性 
工作方式:搶占式,非搶占式 
安全工作: 
            認證: 
                     無認證
                      簡單字符認證:預共享密鑰 
                      MD5 
工作模式: 
        主/備:單虛擬路徑器 
         主/主:主/備(虛擬路徑器1),備/主(虛擬路徑器2)
keepalived:
            vrrp協(xié)議的軟件實現(xiàn),原生設計目的為了高可用ipvs服務 
功能: 
       ? vrrp協(xié)議完成地址流動 
       ? 為vip地址所在的節(jié)點生成ipvs規(guī)則(在配置文件中預先定義) 
       ? 為ipvs集群的各RS做健康狀態(tài)檢測 
       ? 基于腳本調(diào)用接口通過執(zhí)行腳本完成腳本中定義的功能, 進而影響集群事務,以此支持nginx、haproxy等服務 10 KeepAlived 
組件: 
? 核心組件: vrrp stack 
                       ipvs wrapper
                       checkers
? 控制組件:配置文件分析器 
?IO復用器 
?內(nèi)存管理組件

KeepAlived組成:

clipboard.png

IPVS:
IPVS基本上是一種高效的Layer-4交換機,它提供負載平衡的功能。當一個TCP連接的初始SYN報文到達時,IPVS就選擇一臺服務器,將報文轉(zhuǎn)發(fā)給它。此后通過查發(fā)報文的IP和TCP報文頭地址,保證此連接的后繼報文被轉(zhuǎn)發(fā)到相同的服務器。這樣,IPVS無法檢查到請求的內(nèi)容再選擇服務器,這就要求后端的服務器組是提供相同的服務,不管請求被送到哪一臺服務器,返回結(jié)果都應該是一樣的。

3、KeepAlived實現(xiàn)

? HA Cluster 配置準備:
(1) 各節(jié)點時間必須同步
             ntp, chrony 
eg:
   CentOS6:
          #vim /etc/ntp.conf
          添加 server  172.18.0.1  iburst
          #ntpdate 172.18.0.1
          #chkconfig --list ntp
          #chkconfig --list ntp on
          #service ntpd start
或者#crontab -e 做計劃任務
CentOS7:
          #vim /etc/chrony.conf
           添加 server 192.168.25.106(對方的服務器地址) iburst
          #systemctl is-enabled chronyd
          #systemctl enable chronyd 設為開機啟動
          #systemctl  start chronyd
(2) 確保iptables及selinux不會成為阻礙
         注意:CentOS7上面清除firewalld
(3) 各節(jié)點之間可通過主機名互相通信(對KA并非必須) 
              建議使用/etc/hosts文件實現(xiàn) 
      eg: 
           #hostnamectl set-hostname node1
           #vim /etc/hosts
           192.168.25.108  node2(對方的ip和主機名)
(4) 各節(jié)點之間的root用戶可以基于密鑰認證的ssh服務完 
            成互相通信(對KA并非必須)
eg: 
          node1:
                #ssh-keygen
                #ssh-copy-id -i id_rsa.pub root@node2 (把公鑰文件拷貝到對方的服務器上去)
           node2:
                #cd .ssh
                #ls (如果有authorized_keys即成功)
                #ssh-keygen
                #ssh-copy-id -i id_rsa.pub root@node1 (把公鑰文件拷貝到對方的服務器上去)
 
(5) keepalived安裝配置: 
           #yum -y install keepalived
           CentOS 6.4+ Base源
程序環(huán)境:
                主配置文件:/etc/keepalived/keepalived.conf  
                主程序文件:/usr/sbin/keepalived
                Unit File:/usr/lib/systemd/system/keepalived.service 
                Unit File的環(huán)境配置文件:/etc/sysconfig/keepalived

4.KeepAlived配置

? 配置文件組件部分:

 TOP HIERACHY 
            GLOBAL CONFIGURATION 
                                  Global definitions 
                                  Static routes/addresses 
            VRRPD CONFIGURATION 
                  VRRP synchronization group(s):vrrp同步組 
                  VRRP instance(s):即一個vrrp虛擬 路由器 
           LVS CONFIGURATION 
                            Virtual server group(s) 
                            Virtual server(s):ipvs集群的vs和rs 

5.配置語法:

(1)配置虛擬路由器:
  vrrp_instance { 
                               ... 
                           } 
         專用參數(shù): 
               state MASTER|BACKUP:當前節(jié)點在此虛擬路由器上的初始狀態(tài); 只能有一個是MASTER,余下的都應該為BACKUP 
               interface IFACE_NAME:綁定為當前虛擬路由器使用的物理接口     
               virtual_router_id VRID:當前虛擬路由器惟一標識,范圍是0-255 
               priority 100:當前物理節(jié)點在此虛擬路由器中的優(yōu)先級;范圍1-254 
               advert_int 1:vrrp通告的時間間隔,默認1s
(2)authentication { #認證機制 
              auth_type AH|PASS 
             auth_pass 僅前8位有效 
 } 
(3)virtual_ipaddress { #虛擬IP
            <IPADDR> / <MASK> brd <IPADDR> dev <STRING> scope <SCPOPE> label <LABEL>
           192.168.200.17/24 dev eth1 
           192.168.200.18/24 dev eth2 label eth2:1
 } 
track_interface { #配置監(jiān)控網(wǎng)絡接口,一旦出現(xiàn)故障,則轉(zhuǎn)為FAULT狀態(tài) 實現(xiàn)地址轉(zhuǎn)移 
                            eth0 
                            eth1 
                              …
  } 
? nopreempt:定義工作模式為非搶占模式 
? preempt_delay 300:搶占式模式,節(jié)點上線后觸發(fā)新選舉操作的延遲時長,默認模式 
? 定義通知腳本: 
           notify_master |: 
                   當前節(jié)點成為主節(jié)點時觸發(fā)的腳本 
           notify_backup |: 
                   當前節(jié)點轉(zhuǎn)為備節(jié)點時觸發(fā)的腳本 
           notify_fault |: 
                   當前節(jié)點轉(zhuǎn)為“失敗”狀態(tài)時觸發(fā)的腳本 
           notify <STRING>|<QUOTED-STRING>:
                  通用格式的通知觸發(fā)機制,一個腳本可完成以上三 種狀態(tài)的轉(zhuǎn)換時的通知

6.單主配置示例:

clipboard1.png
! Configuration File for keepalived 
global_defs { 
              notification_email {
                             root@localhost 收郵件建的郵箱
                } 
                    notification_email_from keepalived@localhost 發(fā)郵件的郵箱
                    smtp_server 127.0.0.1 
                    smtp_connect_timeout 30 
                    router_id node1 #主機名,在另一結(jié)點為node2 
                    vrrp_mcast_group4 224.100.100.100  多播地址
              }
vrrp_instance VI_1 { 
                   state MASTER #在另一個結(jié)點上為BACKUP
                   interface eth0 
                   virtual_router_id 6 #多個節(jié)點必須相同 
                   priority 100 #優(yōu)先級,在另一個結(jié)點上為90
                   advert_int 1 #通告間隔1s 
                   authentication { 
                                auth_type PASS #預共享密鑰認證 
                                auth_pass 571f97b2 秘鑰,自己定義,兩邊一直即可,最多八位
                      } 
                    virtual_ipaddress {
                                172.18.100.66/16 dev eth0 label eth0:0 
                        } 
                    track_interface { 
                                       eth0
                        } 
                     }
#systemctl start keepalived.service 啟動服務
測試:
       # tcpdump -i eth0 -m host 224.100.100.100
       #systemctl status keepalived.service 查看keepalived狀態(tài)
clipboard5.png
clipboard.png
日志記錄在指定文件中
clipboard1.png

clipboard2.png
更換時觸發(fā)腳本,并且發(fā)郵件
clipboard3.png
clipboard4.png
clipboard.png
clipboard1.png

7.KeepAlived雙主配置

clipboard2.png
雙主模型示例: 
! Configuration File for keepalived
         global_defs { 
                   notification_email {
                               root@localhost 
                    } 
                   notification_email_from keepalived@localhost 
                   smtp_server 127.0.0.1 
                   smtp_connect_timeout 30 
                   router_id node1 
                   vrrp_mcast_group4 224.0.100.100 
}
vrrp_instance VI_1 { 
                     state MASTER 
                      interface eth0 
                      virtual_router_id 6 
                      priority 100 
                      advert_int 1 
                      authentication { 
                              auth_type PASS 
                              auth_pass 571f97b2 
                       } 
                      virtual_ipaddress { 
                                   172.16.0.10/16 dev eth0
                       }
           } 
vrrp_instance VI_2 {
                    state BACKUP 
                       interface eth0 
                        virtual_router_id 8 
                        priority 98 
                        advert_int 1 
                        authentication { 
                                 auth_type PASS 
                                 auth_pass 578f07b2 
                           } 
                        virtual_ipaddress { 
                                         172.16.0.11/16 dev eth0 
                                         }
    }

再主從基礎上再添加


clipboard3.png

clipboard4.png

8.示例通知腳本

#vim /etc/keepalived/notify.sh
#!/bin/bash 
# 
contact='root@localhost' 
notify() { 
         mailsubject="$(hostname) to be $1, vip floating" 
         mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
          echo "$mailbody" | mail -s "$mailsubject" $contact 
} 
case $1 in
                master) 
                              notify master
                               ;; 
                backup) 
                               notify backup 
                                ;; 
                  fault) 
                                notify fault 
                                  ;; 
                   *) 
                                echo "Usage: $(basename $0) {master|backup|fault}" 
                                 exit 1 
                                  ;; 
                    esac 
腳本的調(diào)用方法:
               notify_master "/etc/keepalived/notify.sh master" 
             notify_backup "/etc/keepalived/notify.sh backup" 
             notify_fault "/etc/keepalived/notify.sh fault"
clipboard5.png

9.KeepAlived支持IPVS

? 虛擬服務器: 
? 配置參數(shù): 
               virtual_server IP port | 
               virtual_server fwmark int 
                {
                                 ...
                                 real_server { 
                                  ... 
                   } 
                                   ... 
                   } 

常用參數(shù)
? delay_loop :檢查后端服務器的時間間隔
? lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定義調(diào)度方法

1..靜態(tài)調(diào)度算法:
       RR:Round-robin:輪循
      WRR:Weighted round-robin:加權(quán)輪循-----按照性能分配,為其計算出權(quán)重
       DH:Destination hashing:目標地址hashing-----將某個固定IP的請求轉(zhuǎn)發(fā)給一個相同的real server,用于具有緩存服務器的
       SH:Source hashing:源地址hashing
2.動態(tài)調(diào)度算法:根據(jù)分發(fā)算法和real server的負載狀態(tài)設置出調(diào)度決策,Director對每一個連接進行追蹤監(jiān)控是否處于活動狀態(tài)(ESTABLESHED)
                 LC:Least connection:最少連接-----監(jiān)控每一個real server當前處于活動狀態(tài)連接和非活動狀態(tài)連接數(shù),然后計算出其當前負載:active*256+inactive=overhead
                 WLC:Weighted least connection:加權(quán)最少連接------overhead/weight,考慮到real serverd的性能,默認集群算法
                 SED:Shortest Expected Delay:最短的期望的延遲----不考慮非活動狀態(tài)的連接,算法:(active+1)*256/weight=overhead
                  NQ:Never Queue:永不排隊-----沒有連接時,直接轉(zhuǎn)發(fā)
                  LBLC:Locality-Based Least-Connection:基于本地的最少連接,動態(tài)DH算法
                  LBLCR:Locality-Based Least-Connection with replication Scheduling:帶復制的基于本地最少連接,緩存是共享的      

? lb_kind NAT|DR|TUN:集群的類型
? persistence_timeout :持久連接時長
? protocol TCP:服務協(xié)議,僅支持TCP
? sorry_server :所有RS故障時,備用服務器地址
? real_server <IPADDR> <PORT>
{
weight <INT> RS權(quán)重
notify_up <STRING> | <QUOTED-STRING> RS上線通知腳本
notify_down <STRING> | <QUOTED-STRING> RS下線通知腳本
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHEC K { ... }:定義當前主機的健康狀態(tài)檢測方法
}

KeepAlived配置檢測
            HTTP_GET|SSL_GET:應用層檢測 
            HTTP_GET|SSL_GET {
                            url { 
                                     path :定義要監(jiān)控的URL 
                                     status_code :判斷上述檢測機制為健康狀態(tài)的響應碼 
                                     digest :判斷為健康狀態(tài)的響應的內(nèi)容的校驗碼
                                   } 
             connect_timeout :連接請求的超時時長 
             nb_get_retry :重試次數(shù) 
             delay_before_retry :重試之前的延遲時長 
             connect_ip :向當前RS哪個IP地址發(fā)起健康狀態(tài)檢測請求 
             connect_port :向當前RS的哪個PORT發(fā)起健康狀態(tài)檢測請求
             bindto :發(fā)出健康狀態(tài)檢測請求時使用的源地址 
             bind_port :發(fā)出健康狀態(tài)檢測請求時使用的源端口 
             }
TCP_CHECK { 
               connect_ip :向當前RS的哪個IP地址 發(fā)起健康狀態(tài)檢測請求 
               connect_port :向當前RS的哪個PORT發(fā)起健 康狀態(tài)檢測請求 
               bindto :發(fā)出健康狀態(tài)檢測請求時使用的源地址 
               bind_port :發(fā)出健康狀態(tài)檢測請求時使用的源端口 
               connect_timeout :連接請求的超時時長 
         }

10.單主模型IPVS示例

! Configuration File for keepalived 
global_defs { 
           notification_email {
                     root@localhost }
            notification_email_from keepalived@localhost 
            smtp_server 127.0.0.1 
            smtp_connect_timeout 30 
            router_id node1 
            vrrp_mcast_group4 224.0.100.10 
        } 
 vrrp_instance VI_1 { 
          state MASTER 
          interface eth0 
          virtual_router_id 6 
          priority 100 
          advert_int 1
          authentication {
                          auth_type PASS 
                          auth_pass 571f97b2 
            } 
            virtual_ipaddress { 
                    172.16.0.10/16 dev eth0 
             } 
           notify_master "/etc/keepalived/notify.sh master" 
           notify_backup "/etc/keepalived/notify.sh backup" 
           notify_fault "/etc/keepalived/notify.sh fault" 
} 
virtual_server 172.16.0.10 80 { 
                   delay_loop 3 
                   lb_algo rr 
                   lb_kind DR  (Designated Router指定路由器)
                   protocol TCP 
                   sorry_server 127.0.0.1 80 
                   real_server 172.16.0.11 80 {
                                 weight 1 
                                 HTTP_GET {
                                                url { 
                                                                path / 
                                                                 tatus_code 200
                                                     } 
                                  connect_timeout 1 
                                  nb_get_retry 3 
                                  delay_before_retry 1 
                                   } 
} 
real_server 172.16.0.12 80 { 
                         weight 1 
                         HTTP_GET { 
                                   url {
                                               path /
                                               satus_code 200
                                      } 
                            connect_timeout 1 
                             nb_get_retry 3
                             delay_before_retry 1 
                              } 
 }

VIP:192.168.25.100


clipboard6.png

安裝http


clipboard7.png
clipboard8.png

#bash lvs_dr_rs.sh


clipboard.png

#yum install ipsadm


clipboard.png
clipboard1.png
clipboard2.png

測試:
#curl 192.168.25.100


clipboard4.png

11.雙主模式的lvs集群,拓撲、實現(xiàn)過程

clipboard1.png
配置示例(一個節(jié)點):
! Configuration File for keepalived 
global_defs { 
             notification_email {
                           root@localhost 
                            } 
              notification_email_from kaadmin@localhost 
              smtp_server 127.0.0.1 
              smtp_connect_timeout 30
              router_id node1 
              vrrp_mcast_group4 224.0.100.100 
            }
vrrp_instance VI_1 {  
                   state MASTER 
                   interface eth0 
                   virtual_router_id 6 
                   priority 100 
                   advert_int 1
                   authentication { 
                              auth_type PASS 
                              auth_pass f1bf7fde 
                      }
 virtual_ipaddress { 
                       172.16.0.80/16 dev eth0 label eth0:0                        
          } 
track_interface { 
                  eth0
                         } 
notify_master "/etc/keepalived/notify.sh master"     
notify_backup "/etc/keepalived/notify.sh backup" 
notify_fault "/etc/keepalived/notify.sh fault" 
} 
 vrrp_instance VI_2 { 
                  state BACKUP 
                   interface eth0                  
                   virtual_router_id 8 
                   priority 98
                   advert_int 1 
                    authentication { 
                                    auth_type PASS 
                                    auth_pass f2bf7ade 
} 
virtual_ipaddress {
                         172.16.0.90/16 dev eth0 label eth0:1 
} 
track_interface {
                  eth0 
} 
notify_master "/etc/keepalived/notify.sh master" 
notify_backup "/etc/keepalived/notify.sh backup" 
notify_fault "/etc/keepalived/notify.sh fault" 
} 
virtual_server fwmark 3 { 
delay_loop 2 
lb_algo rr 
lb_kind DR 
nat_mask 255.255.0.0 
protocol TCP 
sorry_server 127.0.0.1 80
real_server 172.16.0.11 80 { 
                        weight 1 
                         HTTP_GET {
                         url { 
                                  path / 
                                   status_code 200 
                             }
                            connect_timeout 2 
                            nb_get_retry 3 
                            delay_before_retry 3 
                             } 
} 
real_server 172.16.0.12 80 { 
                             weight 1
                              HTTP_GET {
                              url { 
                                        path / 
                                         status_code 200 
                                 } 
                                connect_timeout 2
                                nb_get_retry 3 
                                delay_before_retry 3
                                  } 
                               } 
   }                  
clipboard1.png

建立基于IP地址虛擬主機(Apache)


clipboard2.png
clipboard3.png
clipboard4.png
clipboard5.png
clipboard7.png
clipboard8.png
clipboard9.png

clipboard1.png

測試:


clipboard2.png
clipboard3.png
clipboard.png

12.keepalived調(diào)用腳本進行資源監(jiān)控

? keepalived調(diào)用外部的輔助腳本進行資源監(jiān)控,并根據(jù)監(jiān)控的結(jié)果狀態(tài)能實現(xiàn)優(yōu)先動態(tài)調(diào)整
? vrrp_script:自定義資源監(jiān)控腳本,vrrp實例根據(jù)腳本返回值,公共定義 ,可被多個實例調(diào)用,定義在vrrp實例之外
? track_script:調(diào)用vrrp_script定義的腳本去監(jiān)控資源,定義在實例之內(nèi) ,調(diào)用事先定義的vrrp_script

? 分兩步:(1) 先定義一個腳本;(2) 調(diào)用此腳本
                vrrp_script <SCRIPT_NAME> {
                          script "" 
                          interval  INT 
                          weight  -INT  
                   }
                  track_script { 
                           SCRIPT_NAME_1 
                           SCRIPT_NAME_2
                    }  
13.KeepAlived實現(xiàn)Nginx高可用集群
! Configuration File for keepalived 
global_defs { 
               notification_email {
                           root@localhost 
                 } 
                notification_email_from keepalived@localhost 
                smtp_server 127.0.0.1 
                smtp_connect_timeout 30 
                router_id node1
                vrrp_mcast_group4 224.0.100.100
}
示例:高可用nginx服務 
vrrp_script chk_down { 
                     script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" 
                           interval 1 
                           weight -20 
} 
vrrp_script chk_nginx { 
                            script "killall -0 nginx && exit 0 || exit 1" 
                            interval 1 
                            weight -20 
                            fall 2 #2次檢測失敗為失敗 
                            rise 1 #1次檢測成功為成功
} 
示例:高可用nginx服務
vrrp_instance VI_1 { 
               state MASTER 
               interface eth0 
               virtual_router_id 14
               priority 100 
               advert_int 1 
               authentication {
                              auth_type PASS 
                              auth_pass 571f97b2 
                } 
                virtual_ipaddress { 
                       172.18.0.93/16 dev eth0 
                 } 
                track_script { 
                                     chk_down
                                      chk_nginx 
                 } 
                notify_master "/etc/keepalived/notify.sh master" 
                notify_backup "/etc/keepalived/notify.sh backup"
                notify_fault "/etc/keepalived/notify.sh fault" 
}

11:RS1 22:RS2 123:測試 107,108 前端調(diào)度器


clipboard.png
clipboard1.png
clipboard2.png
clipboard3.png

啟用反向代理功能


clipboard4.png
clipboard5.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容