1. 程式人生 > >Linux叢集儲存——day3——keepalived的高可用服務、HAProxy的負載均衡服務

Linux叢集儲存——day3——keepalived的高可用服務、HAProxy的負載均衡服務

埠監測

   nmap  命令進行測試
    需要裝包 nmap
    可以進行檢測具體的IP的某個埠
nmap -sS -n -p 埠 檢測的主機IP | grep open
[ $? -eq 0 ] && echo  埠開放  ||  echo 埠未開放


HA 高可用叢集

    軟體名:keepalived
    服務: keepalived
    主配置檔案:/etc/keepalived/keepalived.conf(可以在進行配置修改前做個備份)

  keepalived可以做兩種高可用叢集,一個是就單個服務解決單點故障問題的高可用,另一個是結合LVS實現分發器的高可用(起初設計keepalived的目的)

   1. 對於普通服務的高可用,也就是在已經搭建了具體服務的伺服器上進行操作
      先是裝包、再配置、最後啟服務
      對於配置就是修改配置檔案,主要修改裡面的:
       global_defs 全域性配置(主要是登出一個設定)
       vrrp_instance  具體服務配置
              --  修改HA伺服器名
              --  修改是 主、輔 伺服器
              --  修改優先順序
              --  修改密碼
              --  修改VIP
         刪除後面所有無用的配置

   2. 對於 Keepalived + LVS 服務的配置
      首先要安裝包兩個服務的包都要安裝 Keepalived 和 ipvsadm ,如果之前有做過LVS服務需要清除其中的所有配置和策略。
      然後進行配置,還是要先進行和為普通服務配置高可用一樣的操作,再在進行一些特殊配置代替ipvsadm命令的操作,實現讓 keepalived 根據具體情況具體配置
      最後啟動服務(如果設定開機自啟動需要把ipvsadm也開啟,不過啟動服務的時候只需要啟動keepalived)
       virtual_server  具體的ipvsadm的規則
              --  修改排程演算法
              --  修改工作模式
              --  修改各個真實伺服器的RIP、權重
              --  開啟健康性檢查,如果真實伺服器出現問題就自動將其移除,如果恢復了自動加回

     對於配置檔案詳細解釋(有!結尾的是必須修改的部分內容)

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]                   //設定報警收件人郵箱
   }
   notification_email_from [email protected]  //設定發件人的具體資訊
   smtp_server 127.0.0.1                   //定義郵件伺服器
   smtp_connect_timeout 30
   router_id LVS_DEVEL                //設定路由ID號
   vrrp_skip_check_adv_addr
 # vrrp_strict                    //必須將其註釋 !
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance HA伺服器名字 {                //名字
  state MASTER                         //主伺服器為MASTER、輔伺服器為BACKUP !
  interface eth0                    //定義網路介面
  virtual_router_id 50                //主輔VRID號必須一致
  priority 100                     //伺服器優先順序,優先順序高優先獲取VIP !
  advert_int 1                    //每多少秒檢視一次
  authentication {
    auth_type pass
    auth_pass 密碼                       //主輔伺服器密碼必須一致 !
  }
  virtual_ipaddress { 預備定義的VIP  }    //誰是主伺服器誰獲得該VIP !
}

virtual_server 預備定義的VIP 埠 {       //設定ipvsadm的VIP規則 !
  delay_loop 6
  lb_algo wrr                          //設定LVS排程演算法為WRR !
  lb_kind DR                           //設定LVS的模式為DR !
  persistence_timeout 50              //多長時間內同一個客戶的訪問,將分發給同一個伺服器,可以註釋掉關閉該功能
  protocol TCP

  real_server 真實伺服器的RIP1 埠 {          //設定後端web1伺服器真實IP !
    weight 權重值                                 //設定權重 !
    TCP_CHECK {                    //對後端web2伺服器的TCP協議進行檢查,如果其相關服務如HTTP出問題了,就會自動刪除相關的ipvs的配置,如果伺服器重新可用了就會再新增到ipvs配置中
    connect_timeout 3
    nb_get_retry 3
    delay_before_retry 3
    }
  }
  real_server 真實伺服器的RIP2 埠 {          //設定後端web2伺服器真實IP !
    weight 權重值                                 //設定權重 !
    TCP_CHECK {                    //對後端web2伺服器的TCP協議進行檢查,如果其相關服務如HTTP出問題了,就會自動刪除相關的ipvs的配置,如果伺服器重新可用了就會再新增到ipvs配置中
    connect_timeout 3
    nb_get_retry 3
    delay_before_retry 3
    }
  }
}

注:
   1. 如果先開啟的是輔伺服器,那時候還沒開主伺服器,輔伺服器並不會立刻獲得vip 進行工作,需要等待一段時間,原因是他要反覆確認主伺服器不可用,不過也有可能。
   2. 每個關鍵字間,與大括號間都是有空格的
   3. 做 Keepalived + LVS 服務的時候需要安裝ipvsadm,設定開機自啟動的時候,ipvsadm也需要開啟
   4. 做一些服務的HA高可用的時候,比如HTTP等,如果整個主伺服器down機了,那麼輔伺服器的keepalived就會起作用,搶奪服務,這樣保證服務的穩定,可是如果主伺服器的核心服務突然出現出問題掛了的時候,keepalived就不會轉移服務,這時候需要寫指令碼,結合nmap檢測來實現,基本演算法就算nmap發現某個服務掛了就把自己的keepalived關閉,這樣服務就會被輔伺服器取走從而繼續提供服務
      但是對於lvs服務的高可用的時候不需要,因為只需要配置中開啟檢測 keepalived 就會自動完成該功能


HTTP的協議模型

  1. HTTP close 一次連線一個請求,依次訪問
       客戶端傳送請求建立連線,然後服務端迴應請求後斷開連線
       適用於: 網頁資訊完整性高,安全性高的網頁,每個資料都要認真傳遞,丟包率低
       缺點: 每次服務端只會響應一次請求,每次請求都要消耗資源建立TCP三次握手,導致延遲較大

  2. Keep-alive 一次連線多個請求,依次迴應
       客戶端傳送請求建立連線,然後服務端迴應請求,然後客戶端可以繼續傳送請求,服務端繼續迴應,直到客戶端請求斷開
       適用於: 一般網頁資料的傳遞
       缺點: 服務端必須讓客戶端知道傳輸資料的長度以避免無限期的等待,一個一個請求處理,效率不高

  3. Pipelining 一次連線多次請求,同步迴應
       客戶端傳送請求建立連線,然後客戶端可以傳送多個請求,服務端多執行緒同步回覆資料
       適用於: 大量圖片視訊的網頁,效率極高,延遲低
       缺點: 安全性不如前面,丟包率也相對略高


HAProxy

    LVS是基於埠的LB負載均衡服務,如果像HTTP他具體域名想給不同的伺服器負責,那LVS是不能實現的,這時候就要用HAProxy來實現基於uri的負載均衡
    url 是網路地址,也就是從協議http開始,裡面有域名,還有具體訪問的檔案所在網路位置,
    uri 是資源位置,一般在web網頁名中指的就是域名後面新增的網頁檔案所在的位置,不過和url關係比較複雜,就不細說了。

   搭建HAProxy的步驟:裝包配置起服務
   裝包 yum install haproxy
   修改配置檔案:/etc/haproxy/haproxy.cfg
   啟動服務:systemctl restart haproxy

   有三個工作模式
       mode http    客戶端被深度分析後發給伺服器
       mode tcp     客戶端和伺服器建立對話,不檢查第七層協議
       mode health  只做健康狀態檢查

配置檔案組成
    default  後面所有部分沒有設定的引數就用這個預設的引數
    frontend 根據接受客戶端的資料包進行分類處理
    backed  根據連線的後端伺服器,進行分類部署
    listen   吧fronted的基本配置和backed結合起來配置

配置檔案內容的詳細解釋:

global                # 採用全域性配置
 log 127.0.0.1 local2
 chroot /usr/local/haproxy
 pidfile /var/run/haproxy.pid        # 記錄haproxy程序的pid資訊的檔案存放路徑
 maxconn 4000            # 最大連線數,預設4000
 user haproxy
 group haproxy
 daemon               # 建立1個程序進入deamon模式執行

defaults                # 預設配置引數,當下面沒有具體配置的時候所有配置引數的預設引數
 mode http            # 預設的模式mode { tcp|http|health } 
 log global             # 採用全域性定義的日誌
 option dontlognull      # 不記錄健康檢查的日誌資訊
 option httpclose        # 每次請求完畢後主動關閉http通道
 option httplog           # 日誌類別http日誌格式
 option forwardfor      # 後端伺服器可以從Http Header中獲得客戶端ip
 option redispatch      # serverid伺服器掛掉後強制定向到其他健康伺服器
 timeout connect 10000              # 如果backend沒有指定,預設為10s
 timeout client 300000               # 客戶端連線超時時間
 timeout server 300000              # 伺服器連線超時
 maxconn  60000              # 最大連線數
 retries  3              # 3次連線失敗就認為服務不可用,也可以通過後面設定

 stats refresh 5s             # 統計頁面自動重新整理時間
 stats uri /網路路徑              # 自定義統計頁面的uri
# 例如: stats uri /status       客戶端訪問 http://域名/status 就可以檢視叢集狀態

# 建立負載均衡服務
listen  weblb  172.25.10.100:80     # 分發服務,建立一個叫weblb的叢集,對客戶端開放訪問的VIP是172.25.10.100,埠是80
    cookie  SERVERID rewrite        # 設定cookie-session服務
    balance roundrobin            # 指定負載均衡演算法
    server  web1 172.25.10.110:80 cookie cook1 check inter 2000 rise 2 fall 5
    server  web2 172.25.10.120:80 cookie cook2 check inter 2000 rise 2 fall 5
   # 上面是配置server的真實伺服器,配置了兩個真實web伺服器名字分別為web1,web2,後面就是真實伺服器的RIP,設定了cookie名,然後每2000ms連線一次,如果出現失敗後,就每2ms連線一次,連續連線5次失敗就預設該裝置有問題,就不傳送請求給他了,然後還是每2000ms連線一次,如果某個時候連上了,就再恢復其服務。

# 基於uri進行負載均衡配置的接受資料端配置,建立網路地址分組
frontend  netlb  192.168.10.100:80    # 建立一個叫netlb的叢集,對客戶端開放訪問的VIP是192.168.10.100,埠是80
    acl url_boy       path_beg    -i /boy        # 客戶輸入的網路地址是/boy開頭的所有請求放入自定義名為url_boy組中
    acl url_girl      path_beg    -i /girl

    acl url_html     path_end    -i .html        # 客戶輸入的網路地址是.html開頭的所有請求放入自定義名為url_html組中
    acl url_php      path_end    -i .php

    use_backend   htmlgrp     if url_html        # url_html組的請求轉發給 htmlgrp的真實伺服器組中的伺服器
    use_backend   phpgrp      if url_php
    use_backend   boygrp      if url_boy
    use_backend   girlgrp      if url_girl    

    default_backend      htmlgrp        # 當用戶輸入的uri特點不滿足上面任意一個uri組,就預設發給htmlgrp伺服器組內所有的伺服器,然後把完整的uri發給這些伺服器,如果伺服器中沒有網頁就不會返回,HAProxy只是做一個轉發

# 基於uri進行負載均衡配置的傳送資料端配置,建立真實伺服器組
backend htmlgrp        # 建立一個名為htmlgrp的真實伺服器組,上面宣告的每個真實伺服器組都要建立            
    balance     roundrobin    # 分佈演算法
    server   weba  192.168.10.110:80 check        # 把真實伺服器的RIP為192.168.10.110的80埠加入htmlgrp真實伺服器組
    server   webb  192.168.10.111:80 check

總結:

   1. 排程伺服器只是把請求進行分發,不過也沒有資料返回取決於後端真實伺服器,他有相應的資料就有返回,如果沒有,那就沒有,如果客戶端訪問的時候不是一個具體的檔案,那請求轉發後,網站伺服器能響應就可以返回,不能就不會響應

   2. 如果想做個簡單的負載均衡,就直接寫一個listen即可,如果想做基於uri等按照職能需求區分的負載均衡就需要分別編輯frontend(把接受的資料包分類)、backend(把後端伺服器進行分類)


  用HAProxy做基於uri的LB負載均衡服務

    0.準備網站伺服器(web主機,不過負載均衡叢集中會有很多web主機,每個主機都要做一樣的部署),LB排程器(haproxy)

       0.1 裝包(apache軟體包、資料庫軟體包、php解析軟體包、php連線資料庫軟體包)

[[email protected] ~]# yum install httpd mariadb-server php php-mysql

       0.2 啟動服務

[[email protected] ~]# for i in httpd mariadb
do
systemctl restart $i
systemctl enable $i
done

       0.3. 測試web服務的html和php解析情況(編寫一個html檔案和php檔案,讓客戶端訪問一下即可)

[[email protected] ~]# echo "$HOSTNAME" > /var/www/html/test.html
[[email protected] ~]# echo '<?php
$x=mysql_connect("localhost","root","資料庫root密碼(剛剛建立的資料庫root密碼是空,這引號內什麼都不寫即可)");
if ($x) {echo "'$HOSTNAME' mariab OK";} else {echo "'$HOSTNAME' mariab error";}
' > /var/www/html/test.php

    1. 搭建haproxy伺服器
       1.1 安裝軟體包haproxy

[[email protected] ~]# yum install -y haproxy

       1.2 修改配置檔案/etc/haproxy/haproxy.cfg(配置如上,如果要動靜分離就根據uri的結尾來分,如果做基於功能模組的負載均衡就按照uri開頭分)

       1.3 啟動服務

[[email protected] ~]# systemctl restart haproxy

    2. 客戶端訪問測試


對比Nginx、LVS、HAProxy的負載均衡作用的區別

Nginx
   用來做HTPP的web服務的情況最多

  優點:
    1. 不單單可以做LB,還可以HA高可用叢集,也可以做web服務
    2. 支援拓展正則,可以根據業務需求做調整,可以做動靜結合
    3. 可以支援極高的併發量
  缺點:
    1. 只支援http協議
    2. 監控檢查只能通過埠
    3. 效率和負載最低


LVS
   LVS/DR 作為LB負載均衡中,用的最多的叢集結構

  優點:
    1. 負載能力強,效率最高
    2. 應用面廣,幾乎可以用在所有應用提供負載均衡
  缺點:
    1. 本身不能做健康檢查,但是可以配合keepalived
    2. 只能記錄埠的,不能做動靜分離等
    3. 如果架構龐大,LVS/DR配置會很繁瑣


HAProxy
    通常作為web網站的負載均衡服務
  優點:
    1. 支援cookie、session功能
    2. 有友好的檢查伺服器健康性的功能
    3. 可以根據業務需求做區分,效率和負載中等
    4. 支援TCP,可以對資料庫做負載
  缺點:
    1. 不支援拓展正則,匹配能力不強,只能勉強做點區分
    2. 不支援apache日誌

配置中的對比記憶
服務 對輸入資料分類 對資料傳送進行分類
Nginx upsteam local
HAProxy frontend backend