1. 程式人生 > >MySQL集群(四)之keepalived實現mysql雙主高可用

MySQL集群(四)之keepalived實現mysql雙主高可用

健康檢查 重連 lose 搶占 pro 資源 交換機 state nec

前面大家介紹了主從、主主復制以及他們的中間件mysql-proxy的使用,這一篇給大家介紹的是keepalived的搭建與使用!

一、keepalived簡介

1.1、keepalived介紹

    Keepalived起初是為LVS設計的,專門用來監控集群系統中各個服務節點的狀態,它根據TCP/IP參考模型的第三、第四層、第五層交換機制檢測每個服務節點的狀態,如果某個服務器節點出現異常,

  或者工作出現故障,Keepalived將檢測到,並將出現的故障的服務器節點從集群系統中剔除,這些工作全部是自動完成的,不需要人工幹涉,需要人工完成的只是修復出現故障的服務節點。

    後來Keepalived又加入了VRRP的功能,VRRP(Vritrual Router Redundancy Protocol,虛擬路由冗余協議)出現的目的是解決靜態路由出現的單點故障問題,通過VRRP可以實現網絡不間斷穩定運行,

  因此Keepalvied 一方面具有服務器狀態檢測和故障隔離功能,另外一方面也有HA cluster功能,下面介紹一下VRRP協議實現的過程。

1.2、VRRP協議與工作原理

    在現實的網絡環境中。主機之間的通信都是通過配置靜態路由或者(默認網關)來完成的,而主機之間的路由器一旦發生故障,通信就會失效,因此這種通信模式當中,路由器就成了一個單點瓶頸,為了解決這個問題,就引入了VRRP協議。

    熟悉網絡的學員對VRRP協議應該不陌生,它是一種主備模式的協議,通過VRRP可以在網絡發生故障時透明的進行設備切換而不影響主機之間的數據通信,這其中涉及到兩個概念:物理路由器和虛擬路由器。

    VRRP可以將兩臺或者多臺物理路由器設備虛擬成一個虛擬路由,這個虛擬路由器通過虛擬IP(一個或者多個)對外提供服務,而在虛擬路由器內部十多個物理路由器協同工作,同一時間只有一臺物理路由器對外提供服務,

  這臺物理路由設備被成為:主路由器(Master角色),一般情況下Master是由選舉算法產生,它擁有對外服務的虛擬IP,提供各種網絡功能,如:ARP請求,ICMP 數據轉發等,而且其它的物理路由器不擁有對外的虛擬IP,

  也不提供對外網絡功能,僅僅接收MASTER的VRRP狀態通告信息,這些路由器被統稱為“BACKUP的角色”,當主路由器失敗時,處於BACKUP角色的備份路由器將重新進行選舉,

  產生一個新的主路由器進入MASTER角色,繼續提供對外服務,整個切換對用戶來說是完全透明的。

    每個虛擬路由器都有一個唯一的標識號,稱為VRID,一個VRID與一組IP地址構成一個虛擬路由器,在VRRP協議中,所有的報文都是通過IP多播方式發送的,而在一個虛擬路由器中,

  只有處於Master角色的路由器會一直發送VRRP數據包,處於BACKUP角色的路由器只會接受Master角色發送過來的報文信息,用來監控Master運行狀態,一一般不會發生BACKUP搶占的情況,除非它的優先級更高,

  而當MASTER不可用時,BACKUP也就無法收到Master發過來的信息,於是就認定Master出現故障,接著多臺BAKCUP就會進行選舉,優先級最高的BACKUP將稱為新的MASTER,這種選舉角色切換非常之快,因而保證了服務的持續可用性。

1.3、keepalived原理 

  在一個VRRP虛擬路由器中,有多態物理的VRRP路由器,但是這多臺物理的及其並不同時工作,而是有一臺成為Master的負責路由工作,其他都是Backup,master並非一成不變vrrp協議讓每個vrrp路由參與競選,最終獲稱的就是master。

  Master有一些特權,比如擁有虛擬路由器的ip地址,我們的主機就是通過這個ip地址作為靜態路由的,擁有特權的master要負責轉發發送給網關地址的包和響應app的請求

  簡單的說:Mysql 主主復制 ,主節點自動切換。利用 keepalived 軟件 監控主節點狀態,當主節點崩潰,立刻熱切換主節點備份節點從而得到高可用性。

       雙機熱備是指兩臺機器都在運行,但並不是兩臺機器都同時在提供服務。當提供服務的一臺出現故障的時候,另外一臺會馬上自動接管並且提供服務,而且切換的時間非常短。

1.4、Keepalived存在的問題

  1)在心跳失效的時候,就容易發生了腦裂(split-brain)。
  2)( 一種常見的腦裂情況可以描述如下)比如正常情況下,(集群中的)NodeA 和 NodeB 會通過心跳檢測以確認對方存在,在通過心跳檢測確認不到對方存在時,就接管對應的(共享) resource 。
    如果突然間,NodeA 和 NodeB 之間的心跳不存在了(如網絡斷開),而 NodeA 和 NodeB 事實上卻都處於 Active 狀態,此時 NodeA 要接管 NodeB 的 resource ,同時 NodeB 要接管 NodeA 的 resource ,這時就是腦裂(split-brain)。
  3)腦裂(split-brain)會 引起數據的不完整性 ,並且可能會 對服務造成嚴重影響 。
  4)引起數據的不完整性主要是指,集群中節點(在腦裂期間)同時訪問同一共享資源,而此時並沒有鎖機制來控制針對該數據訪問(都腦裂了,咋控制哩),那麽就存在數據的不完整性的可能。
    對服務造成嚴重影響,舉例來說,可能你早上上班的時候會發現 NodeA 和 NodeB 同時接管了一個虛擬 IP 。

二、keepalived安裝與配置mysql雙主高可用

環境:

ubuntu17.04的server版:hostname=server1、ip=1.0.0.3

ubuntu17.04的桌面版:hostname=udzyh1、ip1.0.0.5

2.1、在兩臺主機中配置MySQL集群主主復制

  這裏我就不描述了,因為在前面的博客已經介紹了

  技術分享 技術分享

2.2、在兩臺主機中安裝keepalived

  使用sudo apt install keepalived

2.3、配置keepalived

  首先我們進入到/etc/keepalived中,創建一個keepalived.conf(記住兩臺都要配置)

  1)在主機udzyh1的配置

global_defs {
   notification_email {
    [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id mysql_ha01
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33  #配置哪個網卡去進行心跳包的傳輸
    virtual_router_id 51
    priority 100   #成為主節點
    nopreempt #不搶占資源
    advert_int 1 #心跳包的頻率 1秒一次
    authentication { #兩臺主機通信心跳包的加密
        auth_type PASS
        auth_pass 1111
    }
    
    virtual_ipaddress {
        192.168.41.222/24  #虛擬ip(類似於--proxy-address)
    }
}

virtual_server 1.0.0.3 3306 {
     delay_loop 2 #每個2秒檢查一次real_server狀態  
     lb_algo wrr #LVS算法
     lb_kind DR  #LVS算法
     persistence_timeout 60  #會話保持時間  
     protocol TCP
     real_server 192.168.41.201 3306 {
         weight 3
         notify_down /home/shell/closekeepalived.sh #檢測到服務down後執行的腳本  
         TCP_CHECK {
             connect_timeout 10    #連接超時時間 
             nb_get_retry 3       #重連次數 
             delay_before_retry 3   #重連間隔時間 
             connect_port 3306   #健康檢查端口
         }
     }
} 

  我們還需要在創建/home/shell/closekeepalived.sh這個腳本

echo "zyh"|sudo -S killall keepalived

  給腳本添加執行權限:sudo chmod u+x closekeepalived.sh 

  配置完成之後開啟服務:

      技術分享

2)在主機server1配置

global_defs {
   notification_email {
    [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id mysql_ha02(和udzyh1不一樣)
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 50  #成為備份節點
    advert_int 1
    authentication { 
        auth_type PASS
        auth_pass 1111
}

    virtual_ipaddress {
     1.0.0.122       
    }
   
}
virtual_server 1.0.0.122 3306{
    delay_loop 3
    lb_algo wrr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 1.0.0.3 3306 {
        weight 3
        notify_down /home/shell/closekeepalived.sh 
        TCP_CHECK{
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
} 

 我們還需要在創建/home/shell/closekeepalived.sh這個腳本

echo "zyh"|sudo -S killall keepalived

  給腳本添加執行權限:sudo chmod u+x closekeepalived.sh 

  配置完成之後開啟服務:

    技術分享

2.4、查看是否配置成功

  在主機server1和主機udzyh1中分別執行:ip a查看

    技術分享

  而在server1中,並沒有監聽虛擬ip,這是因為我們在配置文件中設置了udzyh1主機的keepalived的優先級高。所以當者兩臺主機

  開啟的時候,他們兩個競爭這個虛擬ip,但是因為udzyh1的優先級高,所以歸它了。

    技術分享

2.5、測試使用keepalived獲取MySQL服務器的連接

  註意:我是在我的udzyh2中測試的

  在這裏我們使用虛擬ip登錄上了udzyh1中的MySQL服務器(因為它是主節點:競爭到了虛擬ip)

  技術分享

2.6、MySQL服務宕機

  我們通過說我們udzyh1中的MySQL服務宕機之後,keepalived檢測到了它宕機,會執行配置文件的腳本,使得keepalived停止,

  備份節點的keepalived接受不到數據包,所以備份節點就會立刻熱切換主節點備份節點從而得到高可用性,獲得虛擬ip。

  但是我在測試的時候,它不執行腳本,所以即使我強行使用sudo killall mysqld關閉MySQL服務,它不會執行腳本,導致不會關閉

  keepalived。

  所以這裏我直接關閉keepalived來模擬熱切換。

  技術分享

  我們在查看server1中的 :ip a,可以看到切換成功。

  技術分享

MySQL集群(四)之keepalived實現mysql雙主高可用