1. 程式人生 > >Linux集群實現高可用--keepalived

Linux集群實現高可用--keepalived

Linux 高可用 keepalived

高可用:
lvs本身不支持高可用;

在lvs集群中,可能有兩種故障:
    1.Director故障不可用;
        keepalived:原生的lvs的Director高可用解決方案;
        heartbeat
        corosync/pacemaker:通用的高可用解決方案;

    2.後端RS故障不可用;
        lvs的Director不考慮後端RS的可用與否,只是按照調度算法進行客戶端請求調度;
        完整的實現:周期性的對各個RS進行健康狀態檢測;
            檢測失敗:應該從lvs集群服務中將對應的RS移除;
            檢測成功:將對應RS重新加入lvs集群服務中;重新創建lvs集群服務;
            所有的RS檢測均失敗:臨時刪除lvs集群服務,並使調度器本地的web服務能夠響應一個相對比較友好的錯誤頁面,sorry_server;

        檢測方式:
            網絡層檢測;ping
            傳輸層檢測:端口探測,nmap
            應用層檢測:文件資源的存在性檢測;文件訪問權限檢測;文件內容有效性檢測;

        keepalived:後端RS的健康狀態檢測;

可用性:
    A=MTBF/(MTBF+MTTR)
    A ∈ (0,1)
    50%, 90%, 95%
    99%, 99.9%, 99.99%, 99.999%

    提高可用性的有效的方案:降低MTTR;
        方法:冗余 + 自動故障倒換;

高可用的內容:
    服務高可用;
    資源高可用;

HA Cluster實現方案:
基於VRRP協議的實現:
keepalived,專用於高可用lvs的Director;

基於AIS的實現:完備的HA集群;
    heartbeat
    corosync + pacemaker

keepalived:
VRRP協議:Virtual Redundancy Router Protocol,虛擬路由器冗余協議;
VRRP技術術語:
虛擬路由器:虛擬的路由器的接口;
VRID:虛擬路由器標識符,描述路由器的分組;並且可以確定虛擬路由器的虛擬MAC地址,取值範圍為:0-255(00-ff);
MASTER:虛擬IP地址的擁有者,可以利用虛擬IP地址接收用戶請求,並且能夠完成數據轉發功能;

BACKUP:不參與數據轉發,僅檢測MASTER的健康狀態;
虛擬IP地址:VIP,虛擬路由器接口的IP地址;
虛擬MAC地址:VMAC,00-00-5e-00-01-{VRID}
優先級:選舉成為MASTER的主要的參考標準,取值範圍為:0-255;
0:放棄MASTER選舉;
255:虛擬IP地址和某個路由器接口的IP地址相同,則該路由器會自動獲得255的優先級,從而直接成為MASTER;
1-254:越大越有可能成為MASTER;
非搶占式:如果MASTER故障導致狀態發生變化,則所有的BACKUP會重新選舉產生新的MASTER;此時,如果原來的MASTER從故障中恢復,則直接成為BACKUP狀態,直到當前的MASTER故障之後,所有的BACKUP重新選舉MASTER時,其才能重新稱為新的MASTER;
搶占式:如果MASTER故障導致狀態發生變化,則所有的BACKUP會重新選舉產生新的MASTER;此時,如果原來的MASTER從故障中恢復,則立即通告自己的優先級並啟動新一輪選舉,之後重新成為MASTER;

VRRP的認證方式:
    無認證
    簡單字符串認證
    MD5

VRRP的工作模式:
    單個實例:MASTER/BACKUP
    多個實例:MASTER/BACKUP, MASTER/MASTER

keepalived:
VRRP協議在linux系統中的應用實現;最初的設計目的就是為了高可用ipvs調度器;某些場合,簡稱其為"ka";

keepalived通過調用內核中的系統調用接口完成ipvs的規則編寫,從而可以用於管理lvs集群服務;所有的規則,都定義在其配置文件中;

keepalived還可以對VIP地址進行浮動設置;

keepalived還可以為後端各RS提供健康狀態檢測,可以基於傳輸層及應用層實現;

keepalived還可以基於外部腳本調用接口完成腳本中定義的功能,甚至可以高可用其他的非lvs服務;

keepalived在RHEL 6.4+或CentOS 6.4+的發行版本的操作系統中,被收錄到官方系統光盤鏡像之中,直接基於本地Base源使用yum命令完成安裝即可;

keepalived的組件:
控制面板:配置文件分析器;
內存管理組件;
IO復用器組件;
核心組件:
VRRP Stack:實現VRRP協議功能的組件;
Checkers:後端RS做健康狀態檢測的組件;
SMTP:調用SMTP協議,將路由器狀態轉換的消息以郵件的形式發送到指定管理員郵箱;
Watch Dog:監控Checkers和VRRP Stack的工作狀態;如果異常,負責重新啟動keepalived進程;
ipvs wrapper:向內核中的ipvs框架傳輸ipvs規則,用於構建、管理、移除lvs集群服務及集群中的RS的組件;
netlink reflactor:管理虛擬路由器接口;

配置HA Cluster的前期準備:
1.各個節點主機之間時間必須同步,可以使用時間服務器,如ntp或chrony;
2.確保iptables和SELinux的規則不會阻礙各個節點之前的數據通信;
3.各個節點主機之間需要通過主機名互相通信(對ka並非必須);
4.出於安全考量,各個節點主機之間可以以root用戶的身份,基於密鑰認證的方式進行ssh通信(對於ka非必須);

keepalived安裝:
在CentOS 7.2中,直接使用光盤鏡像yum倉庫,使用yum install keepalived安裝即可;

程序環境:
    主配置文件:/etc/keepalived/keepalived.conf
    主程序文件:/usr/sbin/keepalived
    Unit File:/usr/lib/systemd/system/keepalived.service

主配置文件的結構:
    GLOBAL CONFIGURATION
        Global definitions
    global_defs {
        notification_email {
               root@localhost //配置接收郵件通知的郵箱地址;
        }
        notification_email_from keepalived@localhost
        smtp_server 127.0.0.1  //設定用於發送電子郵件的郵件服務器;
        smtp_connect_timeout 30      # integer, seconds
        router_id my_hostname //設置路由器ID,僅僅為了區分不同的設備而已;如果不修改,也不會影響keepalived服務本身;
        vrrp_mcast_group4 224.0.0.18 //設置發送VRRP協議通過的目標組播通信地址;必須保證所有參數選舉的路由器都必須有相同的組播通信地址;
    }

    VRRPD CONFIGURATION
        vrrp_instance inside_network { //定義VRRP的實例及實例名稱;
            state MASTER  //指定當前設備的初始狀態;
            interface eno16777736 
                //指定被VRRP協議綁定的網絡接口,即發送VRRP通過信息的網絡接口;
            virtual_router_id 51 //指定虛擬路由器標識,用於確定VRRP備份組;
            priority 100 //指定當前節點的優先級,指定的範圍為:1-254;
            advert_int 1 //發送VRRP通過的時間間隔,單位是秒;
            authentication {
                auth_type PASS //設置VRRP協議各節點之間的認證方式,PASS表示簡單密碼
                auth_pass MTUwPBjd //設置認證密碼,不超過8個字符;
            }
            virtual_ipaddress {
                <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
            } //設置虛擬IP地址的專用上下文
            nopreempt //設置當前節點為非搶占模式,默認為搶占模式;
            preempt_delay 300 //搶占模式開始前的延遲時間;
            notify_master <STRING>|<QUOTED-STRING>
            notify_backup <STRING>|<QUOTED-STRING>
            notify_fault <STRING>|<QUOTED-STRING>
                //設置當當前服務器狀態發生變化時,所觸發的腳本文件的路徑及相關參數;
            track_script {
                SCRIPT_NAME
            }
        }

    LVS CONFIGURATION

        virtual server vip vport | fwmark <INT> {
            delay_loop <INT>  //服務輪詢的時間間隔設定;
            lb_algo rr|wrr|lc|wlc|lblc|sh|dh //指定負載均衡調度算法;
            lb_kind NAT|DR|TUN //指定負載均衡集群的類型;
            persistence_timeout <INT> //啟用持久連接並設置超時時間;
            protocol TCP //負載均衡服務支持的協議;目前僅支持TCP;
            sorry_server <IPADDR> <PORT>  //如果後端RS全部不可用,則需要臨時刪除lvs集群服務,並設置本地的http服務為sorry-server,提供友好的錯誤頁面;
            real_server <IPADDR> <PORT> {
                weight <INT>  //指定當前RS的權重;
                notify_up <STRING>|<QUOTED-STRING>
                notify_down <STRING>|<QUOTED-STRING>
                    //當RS的狀態轉為UP或DOWN時,發送通知所使用的腳本路徑及參數設定;
                HTTP_GET|SSL_GET {
                    url {
                        path <STRING> //指定進行後端RS健康狀態檢測的URL地址;
                        digest <STRING> //比較被檢測資源的md5值是否發生變化;
                        status_code <INT> //根據響應報文的狀態碼進行後端RS的健康狀態檢測;
                    }
                    nb_get_retry <INT>  //指定對後端RS進行健康狀態檢測重試的次數上限;
                    delay_before_retry <INT> //每次重試之前的延遲時間;
                    connect_ip <IP ADDRESS>
                    connect_port <PORT>
                        //向後端RS的哪個IP地址和哪個端口發出健康狀態檢測請求;
                    bindto <IP ADDRESS>
                    bind_port <PORT>
                        //向後端RS發出健康狀態檢測請求的源IP地址和源端口號;
                    connect_timeout <INTEGER>  //連接超時時間;
                }
                TCP_CHECK {
                    connect_ip <IP ADDRESS>
                    connect_port <PORT>
                        //向後端RS的哪個IP地址和哪個端口發出健康狀態檢測請求;
                    bindto <IP ADDRESS>
                    bind_port <PORT>
                        //向後端RS發出健康狀態檢測請求的源IP地址和源端口號;
                    connect_timeout <INTEGER>  //連接超時時間;
                }
            }
        }

Linux集群實現高可用--keepalived