keepalived應用:漂移IP的實現

1.集羣的介紹

  每個服務器都叫做一個節點,集羣節點之間是可以相互通信的,通信方式有兩種:一種是基於RS232心跳線實現心跳監控,另一種用一塊單獨的網卡來跑心跳。心跳就是用來判斷集羣每個服務器之間網絡、服務是否正常,判斷方法就是用連接線,這個連接線可以是網卡,也可以是RS232,一般用網卡網線。
  集羣必須擁有這幾個特性:1.服務實體的擴展功能,可以靈活的增加和剔除某個服務實體。2.當一個節點出現故障時,集羣的另一個節點可以自動接管故障節點資源。3.一個集羣系統必須擁有共享的數據存儲。
  所以要構建一個集羣系統,至少需要兩臺服務器,串口線、集羣軟件、共享存儲設備(磁盤陣列)。

1.1 集羣有的特點與功能

① 高可用性與可擴展性(爲滿足需求動態加入節點)
  高可用指的是24小時不間斷使用,可擴展性指的是能滿足需求動態加入節點。

② 負載均衡與錯誤恢復
負載均衡主要用於分流。而錯誤恢復指的是當一個任務在一個節點沒有完成時因爲某種原因執行失敗,此時  另一個服務節點就會接着完成此任務,等出錯的節點恢復好後重新回到這個集羣。

③ 心跳檢測與漂移IP地址
  心跳檢測是通過心跳線來實現的,可以做心跳線的可以有RS232串口線、獨立網卡、共享磁盤陣列,心跳線的數量應該是集羣節點數量減1,集羣系統就是通過心跳技術保持着節點之間的內部有效通信。
  而漂移IP地址又叫做VIP,也就是虛擬IP,這個IP不是服務器固定的IP,可能一會在這個節點,也可能出現在另一個節點。例如正常情況下VIP位於主節點上,當主節點出現故障後,漂移IP地址自動切換到備用節點,因此爲了保證服務的不間斷,在集羣系統中對外提供的服務IP一定要是這個VIP,否則如果是節點本身對外提供服務的話,當該節點失效後服務切換到另一個節點,但是服務IP仍是故障IP地址。

1.2 集羣的分類

① 高可用集羣HA
  常說的高可用集羣有雙機熱備、雙機互備、多機互備等,這類集羣一般都有兩個或者兩個以上節點組成。我們使用的高可用集羣配置軟件:keepalived
在這裏插入圖片描述
  雙機熱備:是一臺作爲主服務器運行應用程序對外提供服務,另一臺作爲備機,但不啓動服務處於待機狀態。主機備機通過心跳技術相互監控,監控的資源可以是網絡、操作系統、也可以是服務。當備機監控到主機某個資源出現故障,就可以根據預先設定好的策略將IP、服務切換過來。
  雙機互備:兩個相互獨立的應用在兩個機器上同時運行,互爲主備。缺點是某個節點出現問題時,另一個節點就同時運行兩個應用的服務,有可能出現負載過大的情況。
  多機互備:一主多備,當主機出現問題會根據選舉機制把某個備機選出來使用。

② 負載均衡集羣
  負載均衡集羣是爲了應對業務量大的情況,實現負載分流。他負載均衡集羣也是有兩臺或者兩臺以上的服務器組成,分爲前端負載調度和後端節點服務兩個部分,負載調度部分負責把客戶端的請求按照不同的策略分配給後端服務節點,而後端節點是真正提供應用程序服務的部分。
  與高可用集羣相比,負載均衡集羣中所有的後端節點都處於活動狀態,都對外提供服務,分攤工作負載,從而把一個高負荷的應用分散到多個節點共同完成,適用於業務繁忙、大負荷的應用系統,但是又不足:當一個節點出現故障時,前端調度系統並不知道此節點已經不能提供服務,仍然會把客戶端的請求調度到故障節點上來,所以爲了解決這個問題,負載調度系統都會引入節點監控系統,前端調度系統就會把這個節點剔除,當然這裏面可能會涉及一致性hash。
  負載均衡集羣可以通過軟件方式實現,也可以由硬件設備來完成。Linux下典型的負載均衡軟件又:開源LVS集羣。硬件負載均衡器F5(賊貴)

2. HA集羣軟件Keepalived

  在集羣中又四個相關術語:節點、資源、事件和動作。節點就是服務器,資源就是一個節點可以控制的實體,當節點發生故障時,這些資源可以被其他節點接管。事件指的是集羣中可能發生的事,例如網卡故障、應用程序故障等,而應用程序故障需要我們寫腳本來判斷應用程序是否出現故障。動作指的是事件發生時HA的響應方式,動作由shell腳本控制的,例如當一個節點發生故障後,備份節點將通過事先設定好的執行腳本進行服務的關閉或啓動,進而接管故障節點的資源。
  Keepalived主要通過虛擬路由冗餘來實現高可用功能。他一方面具有服務器狀態檢測和故障隔離功能,另一方面也具有高可用集羣的功能(主要因爲VRRP虛擬路由器冗餘協議)。

① VRRP協議與工作原理
  在現實網絡環境中,主機之間的通信都是通過配置靜態路由來完成的,但是一旦主機之間的路由器出現故障通信就會失敗。因此引入了VRRP協議。
  VRRP就是一種主備模式的協議,通過VRRP可以在網絡發生故障時透明地進行設備切換而不影響主機之間的數據通信,這裏引入兩個概念:物理路由器和虛擬路由器。
  VRRP可以將兩臺或者多臺物理路由器設備虛擬成一個虛擬路由器,這個虛擬路由器通過虛擬IP(一個或者多個)對外提供服務。在虛擬路由器內部,同一時間只有一臺物理路由器在對外提供服務,這臺物理路由器被稱爲主路由器(MASTER),一般而言MASTER通過選舉算法產生,它擁有對外服務的虛擬IP,提供各種網絡功能。而其他物理路由器不擁有對外的虛擬IP,僅僅接收MASTER的VRRP狀態通告信息,這部分路由器叫做備份路由器。當主路由器失效的時候,備份路由器重新進行選舉,產生一個新的路由器成爲MASTER。

② Keepalived的配置
  Keepalived的配置分爲三類,分別是全局配置、VRRPD配置和LVS配置。
全局配置HA配置:
在這裏插入圖片描述
  全局配置以“global_defs”作爲標識,在global_defs區域內的都是全局配置選項。
  裏面可以設置報警郵件地址、郵件的發送地址等信息,主要是報警的。

VRRPD配置:
  a. vrrp_sync_group
  VRRPD配置是Keepalived所有配置的核心,主要來實現高可用的。VRRPD配置又分爲VRRP同步組配置和VRRP實例配置。同步組是相對於多個VRRP實例而言的,把所有的VRRPD實例都加入到同步組中,這樣任何一個實例出現問題都會導致keepalived進行主備切換。下面是同步組:
在這裏插入圖片描述
  其中G1同步組包含了三個實例,G2包含了2個實例,這五個實例都會在vrrp_instance段中進行定義。除此之外,還有三個nofify的通知機制。
  notify_master:指定當Keepalived進入Master狀態時要執行的腳本,這個腳本可以是一個狀態報警腳本。
  notify_bacup:當keepalived進入備機backup狀態時要執行的腳本
  notify_fault:進入fault狀態時要執行的腳本。
  notify_stop:進入終止狀態時執行的腳本。

  下面是實例組的配置。

  b. vrrp_instance
在這裏插入圖片描述
  VRRP實例段主要用來配置節點角色(主或從)、實例綁定的網絡接口、節點間驗證機制、集羣服務IP等。這裏只給了一部分的配置。
  vrrp_instance:是vrrp實例開始的標誌,後面跟vrrp實例名稱。
  State:指定keepalived的角色,分爲MASTER和BACKUP。
  Virtual_router_id:是虛擬路由標識,是一個數字,主機和備機的Virtual_router_id一定是一樣的,一樣的就可以統一認爲在一個集羣裏(例如上面的3臺機器)。
  Virtual_ipaddress:其中還有一個比較重要的設置虛擬IP地址(VIP),又叫做漂移ip地址。可以設置多個虛擬IP地址,當keepalived切換到master狀態時,vip就會自動添加到系統中,切換到BACKUP狀態時,vip又會自動從系統中刪除。
  nopreempt:配置在主節點上配置,設置高可用集羣中的不搶佔功能。也就是當主節點出現問題後備機接上,我們希望的是當之前的主機修好之後服務不會切回來。
  advent_int:設定MASTER與BACKUP主機之間同步檢查時間間隔。

  c. vrrp_script模塊(監控模塊)
  第一種:用killall -0的方式來進行監控
  這個模塊專門用於對集羣中服務資源進行監控。與此模塊一起使用的還有track_script模塊,track_script模塊用於調用vrrp_script模塊來實現對集羣資源的檢測。這裏需要注意的是,vrrp_script是單獨的一個模塊,而track_script屬於某一個實例vrrp_instance當中的。一般而言,我們通過killall -0來實現檢測,當我們killall的時候,是用來關閉進程的,我們這裏要用到的是kill -0,這是標識對程序進程的運行狀態進行監控,如果發現進程關閉或者其他異常,將返回狀態碼1,反之如果發現進程運行正常,將返回狀態嗎0.即可以通過監控腳本的返回狀態來識別服務器是否正常。代碼如下:
在這裏插入圖片描述
  這裏例子就是定義了一個服務監控模塊check_mysqld,採用的監控方式就是killall -0 mysqld方式,時間間隔是2秒。當主的mysql關閉時,返回狀態碼1,然後就會根據vrrp_script模塊中設定的weight值重新設置keepalived主備優先級發生主備切換。

  第二種:還可以通過檢查端口運行狀態也是最常見的服務監控方式
在這裏插入圖片描述
  檢測本機的80端口,當檢測到失敗最大次數爲2時標識發生故障進行切換操作。Rise標識請求成功一次就認爲此節點資源恢復正常。

  第三種:通過shell語句進行狀態監控
在這裏插入圖片描述
  通過一個shell判斷語句,檢測httpd.pid文件是否存在,存在就爲正常否則異常。

  第四種:通過腳本進行服務狀態監控
在這裏插入圖片描述
  一個簡單的實現mysql服務狀態檢測的shell腳本,它通過登陸mysql數據庫後執行查詢操作來檢測mysql運行是否正常,正常返回狀態碼0,否則爲1。

3. keepalived實現mysql故障轉移高可用

  我們設置的master1: 172.26.0.8 master2: 172.26.0.7 漂移ip:172.26.0.13

① master1機器上的keepalived.conf配置

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1  #發送email的smtp地址
   smtp_connect_timeout 30   #超時時間
   router_id lb01   #運行Keepalived的機器標識號,主從機必須不同
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0     #指定虛擬ip的網卡接口
    virtual_router_id 100    #路由器標識,MASTER和BACKUP必須是一致的
    priority 150    #定義優先級,數字越大,優先級越高。
    unicast_src_ip  172.26.0.8    #本地IP地址
    unicast_peer {
                  172.26.0.7   #對端IP地址,此地址一定不能忘記
                }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.26.0.13   #虛擬ip
    }
}

  如果需要編寫監聽腳本,這個腳本的作用是當mysql服務掛掉後關閉keepalived服務。可以添加參數實現這個功能:

vrrp_script chk_mysql_port { #檢測mysql服務是否在運行。有很多方式,比如進程,用腳本檢測等
    script "/opt/chk_mysql.sh"   #這裏通過腳本監測
    interval 2      #腳本執行間隔,每2s檢測一次
    weight -5      #腳本結果導致的優先級變更,檢測失敗(腳本返回非0)則優先級 -5
    fall 2    #檢測連續2次失敗纔算確定是真失敗。會用weight減少優先級(1-255之間)
    rise 1      #檢測1次成功就算成功。但不修改優先級
}
             
track_script {  #再vrrp_instance VI_1中             
   chk_mysql_port             
}

② 在master2機器上的keepalived.conf配置 ip爲172.26.0.7

! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 100
    unicast_src_ip  172.26.0.7
    unicast_peer {
                  172.26.0.8
                 }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
         172.26.0.13
    }
}

  然後啓動兩個master的keepalived。service keepalived start,之後也是編寫腳本。這裏需要注意的是master2的權值priority一定要小於master1。在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級。這樣MASTER故障恢復後,就可以將VIP資源再次搶回來。
  配置好後,我們在172.26.0.16主機端通過ip add|grep 172可以看到兩個ip,一個是本機的,一個是掛在的漂移ip。
  只有當主機宕機了,漂移Ip就會掛在到從機上,直到恢復。
  這裏特別注意,在配置的時候unicast_src_ip和unicast_peer一定要手動配置,否則會出現漂移ip掛載兩臺服務器上的情況,這是因爲在服務器網絡環境中,路由交換層禁用了ARP的廣播限制,造成KEEPALIVE主備協議無法通過廣播的方式進行通信,造成主備兩臺服務器都強佔HAVIP地址,出現同時兩臺服務器都有VIP地址的情況出現,必須通過配置來指定IP的兩臺服務器間進行通訊。
  state BACKUP:在keepalived中2種模式,分別是master->backup模式和backup->backup模式。這兩種模式有很大區別。在master->backup模式下,一旦主庫宕機,虛擬ip會自動漂移到從庫,當主庫修復後,keepalived啓動後,還會把虛擬ip搶佔過來,即使設置了非搶佔模式(nopreempt)搶佔ip的動作也會發生。在backup->backup模式下,當主庫宕機後虛擬ip會自動漂移到從庫上,當原主庫恢復和keepalived服務啓動後,並不會搶佔新主的虛擬ip,即使是優先級高於從庫的優先級別,也不會發生搶佔。

③ 在兩臺master的Mysql中允許root用戶遠程訪問權限。
  進入到mysql,然後grant all privileges on . to root@’%’ identified by “password”,則之後再第三臺測試機登陸時就用root登陸,密碼是password。
  但這裏需要注意的是,這裏的grant方法是mysql5.7的,在mysql8.0後,不能用原來的命令(同時創建用戶和賦權),必須先創建用戶,再授權:

mysql>create user lianjie@'%' identified  by 'password';
mysql>grant all privileges on *.* to lianjie@'%' with grant option;
最後刷新一下:mysql>flush privileges;

  select user,host from mysql.user; 可以查看所有用戶和權限
④ 防火牆關閉
⑤ 測試高可用
  這樣就可以用第三臺測試機通過漂移ip用root用戶訪問進數據庫,此時訪問的就是權值最大的master1,當我們的master1掛掉後就會發現漂移ip變到matser2上了。
  mysql -h172.26.0.13 -ulianjie -pz5482681b
  查看飄移ip的掛在情況的命令:ip addr。
在這裏插入圖片描述
  想要讓用戶可以被遠程訪問,則host必須是%或者在創建用戶的時候@‘10.10.10.10’這樣設置好被遠程訪問的ip。%意味着本機localhost和遠程都可以訪問。
  注意: 我們設置的漂移ip一定要和服務器在一個網段裏,其次,我們設置的漂移ip要確保沒有被其他服務器所使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章