lvs學習筆記

来源:http://www.cnblogs.com/hotdog/archive/2017/10/31/7761253.html
-Advertisement-
Play Games

本人身為一個網工,最近一直在工作中學習linux的相關知識。前短時間通過自查資料學習了lvs的相關內容,摘錄部分整理後和大家分享,內容較多,較瑣碎,望見諒!!! LVS 從Linux內核版本2.6起,ip_vs code已經被整合進了內核中,因此,只要在編譯內核的時候選擇了ipvs的功能,您的Lin ...


     本人身為一個網工,最近一直在工作中學習linux的相關知識。前短時間通過自查資料學習了lvs的相關內容,摘錄部分整理後和大家分享,內容較多,較瑣碎,望見諒!!!

LVS

從Linux內核版本2.6起,ip_vs code已經被整合進了內核中,因此,只要在編譯內核的時候選擇了ipvs的功能,您的Linux即能支持LVS。Linux 2.4.23以後的內核版本也整合了ip_vs code,但如果是更舊的內核版本,您得自己手動將ip_vs code整合進內核原碼中,並重新編譯內核方可使用lvs。

一、關於ipvsadm

ipvsadm是運行於用戶空間、用來與ipvs交互的命令行工具,它的作用表現在:

1、定義在Director上進行dispatching的服務(service),以及哪此伺服器(server)用來提供此服務;

2、為每台同時提供某一種服務的伺服器定義其權重(即概據伺服器性能確定的其承擔負載的能力);

註:權重用整數來表示,有時候也可以將其設置為atomic_t;其有效表示值範圍為24bit整數空間,即(2^24-1);

因此,ipvsadm命令的主要作用表現在以下方面:

1、添加服務(通過設定其權重>0);

2、關閉服務(通過設定其權重>0);此應用場景中,已經連接的用戶將可以繼續使用此服務,直到其退出或超時;新的連接請求將被拒絕;

3、保存ipvs設置,通過使用“ipvsadm-sav > ipvsadm.sav”命令實現;

4、恢復ipvs設置,通過使用“ipvsadm-sav < ipvsadm.sav”命令實現;

5、顯示ip_vs的版本號,下麵的命令顯示ipvs的hash表的大小為4k;

  # ipvsadm

    IP Virtual Server version 1.2.1 (size=4096)

6、顯示ipvsadm的版本號

  # ipvsadm --version

   ipvsadm v1.24 2003/06/07 (compiled with popt and IPVS v1.2.0)

 

二、ipvsadm使用中應註意的問題

預設情況下,ipvsadm在輸出主機信息時使用其主機名而非IP地址,因此,Director需要使用名稱解析服務。如果沒有設置名稱解析服務、服務不可用或設置錯誤,ipvsadm將會一直等到名稱解析超時後才返回。當然,ipvsadm需要解析的名稱僅限於RealServer,考慮到DNS提供名稱解析服務效率不高的情況,建議將所有RealServer的名稱解析通過/etc/hosts文件來實現;

 

三、調度演算法

Director在接收到來自於Client的請求時,會基於"schedule"從RealServer中選擇一個響應給Client。ipvs支持以下調度演算法:

 

1、輪詢(round robin, rr),加權輪詢(Weighted round robin, wrr)——新的連接請求被輪流分配至各RealServer;演算法的優點是其簡潔性,它無需記錄當前所有連接的狀態,所以它是一種無狀態調度。輪叫調度演算法假設所有伺服器處理性能均相同,不管伺服器的當前連接數和響應速度。該演算法相對簡單,不適用於伺服器組中處理性能不一的情況,而且當請求服務時間變化比較大時,輪叫調度演算法容易導致伺服器間的負載不平衡。

2、最少連接(least connected, lc), 加權最少連接(weighted least connection, wlc)——新的連接請求將被分配至當前連接數最少的RealServer;最小連接調度是一種動態調度演算法,它通過伺服器當前所活躍的連接數來估計伺服器的負載情況。調度器需要記錄各個伺服器已建立連接的數目,當一個請求被調度到某台伺服器,其連接數加1;當連接中止或超時,其連接數減一。

3、基於局部性的最少鏈接調度(Locality-Based Least Connections Scheduling,lblc)——針對請求報文的目標IP地址的負載均衡調度,目前主要用於Cache集群系統,因為在Cache集群中客戶請求報文的目標IP地址是變化的。這裡假設任何後端伺服器都可以處理任一請求,演算法的設計目標是在伺服器的負載基本平衡情況下,將相同目標IP地址的請求調度到同一臺伺服器,來提高各台伺服器的訪問局部性和主存Cache命中率,從而整個集群系統的處理能力。LBLC調度演算法先根據請求的目標IP地址找出該目標IP地址最近使用的伺服器,若該伺服器是可用的且沒有超載,將請求發送到該伺服器;若伺服器不存在,或者該伺服器超載且有伺服器處於其一半的工作負載,則用“最少鏈接”的原則選出一個可用的伺服器,將請求發送到該伺服器。

4、帶複製的基於局部性最少鏈接調度(Locality-Based Least Connections with Replication Scheduling,lblcr)——也是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。它與LBLC演算法的不同之處是它要維護從一個目標IP地址到一組伺服器的映射,而 LBLC演算法維護從一個目標IP地址到一臺伺服器的映射。對於一個“熱門”站點的服務請求,一臺Cache 伺服器可能會忙不過來處理這些請求。這時,LBLC調度演算法會從所有的Cache伺服器中按“最小連接”原則選出一臺Cache伺服器,映射該“熱門”站點到這台Cache伺服器,很快這台Cache伺服器也會超載,就會重覆上述過程選出新的Cache伺服器。這樣,可能會導致該“熱門”站點的映像會出現在所有的Cache伺服器上,降低了Cache伺服器的使用效率。LBLCR調度演算法將“熱門”站點映射到一組Cache伺服器(伺服器集合),當該“熱門”站點的請求負載增加時,會增加集合里的Cache伺服器,來處理不斷增長的負載;當該“熱門”站點的請求負載降低時,會減少集合里的Cache伺服器數目。這樣,該“熱門”站點的映像不太可能出現在所有的Cache伺服器上,從而提供Cache集群系統的使用效率。LBLCR演算法先根據請求的目標IP地址找出該目標IP地址對應的伺服器組;按“最小連接”原則從該伺服器組中選出一臺伺服器,若伺服器沒有超載,將請求發送到該伺服器;若伺服器超載;則按“最小連接”原則從整個集群中選出一臺伺服器,將該伺服器加入到伺服器組中,將請求發送到該伺服器。同時,當該伺服器組有一段時間沒有被修改,將最忙的伺服器從伺服器組中刪除,以降低複製的程度。

5、目標地址散列調度(Destination Hashing,dh)演算法也是針對目標IP地址的負載均衡,但它是一種靜態映射演算法,通過一個散列(Hash)函數將一個目標IP地址映射到一臺伺服器。目標地址散列調度演算法先根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求發送到該伺服器,否則返回空。

6、源地址散列調度(Source Hashing,sh)演算法正好與目標地址散列調度演算法相反,它根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求發送到該伺服器,否則返回空。它採用的散列函數與目標地址散列調度演算法的相同。除了將請求的目標IP地址換成請求的源IP地址外,它的演算法流程與目標地址散列調度演算法的基本相似。在實際應用中,源地址散列調度和目標地址散列調度可以結合使用在防火牆集群中,它們可以保證整個系統的唯一齣入口。

 

四、關於LVS追蹤標記fwmark

如果LVS放置於多防火牆的網路中,並且每個防火牆都用到了狀態追蹤的機制,那麼在回應一個針對於LVS的連接請求時必須經過此請求連接進來時的防火牆,否則,這個響應的數據包將會被丟棄。

查看LVS上當前的所有連接

# ipvsadm -Lcn   

或者

#cat /proc/net/ip_vs_conn

 

查看虛擬服務和RealServer上當前的連接數、數據包數和位元組數的統計值,則可以使用下麵的命令實現:

# ipvsadm -l --stats

 

查看包傳遞速率的近似精確值,可以使用下麵的命令:

# ipvsadm -l --rate

 

 

五、LVS/NAT模式介紹

 

LVS-NAT基於cisco的LocalDirector。VS/NAT不需要在RealServer上做任何設置,其只要能提供一個tcp/ip的協議棧即可,甚至其無論基於什麼OS。基於VS/NAT,所有的入站數據包均由Director進行目標地址轉換後轉發至內部的RealServer,RealServer響應的數據包再由Director轉換源地址後發回客戶端。 

VS/NAT模式不能與netfilter相容,因此,不能將VS/NAT模式的Director運行在netfilter的保護範圍之中。現在已經有補丁可以解決此問題,但尚未被整合進ip_vs code。

 

        ____________

       |            |

       |  client    |

       |____________|                     

     CIP=192.168.0.253 (eth0)             

              |                           

              |                           

     VIP=192.168.0.220 (eth0)             

        ____________                      

       |            |                     

       |  director  |                     

       |____________|                     

     DIP=192.168.10.10 (eth1)         

              |                           

           (switch)------------------------

              |                           |

     RIP=192.168.10.2 (eth0)       RIP=192.168.10.3 (eth0)

        _____________               _____________

       |             |             |             |

       | realserver1 |             | realserver2 |

       |_____________|             |_____________|  

 

     

設置LVS/NAT模式的LVS(這裡以web服務為例)

Director:

 

建立服務

# ipvsadm -A -t VIP:PORT -s rr

如:

# ipvsadm -A -t 192.168.0.220:80 -s rr

 

設置轉發:

# ipvsadm -a -t VIP:PORT -r RIP_N:PORT -m -w N

如:

# ipvsadm -a -t 192.168.0.220:80 -r 192.168.10.2 -m -w 1

# ipvsadm -a -t 192.168.0.220:80 -r 192.168.10.3 -m -w 1

 

打開路由轉發功能

# echo "1" > /proc/sys/net/ipv4/ip_forward

 

服務控制腳本:

 

#!/bin/bash

#

# chkconfig: - 88 12

# description: LVS script for VS/NAT

#

. /etc/rc.d/init.d/functions

#

VIP=192.168.0.219

DIP=192.168.10.10

RIP1=192.168.10.11

RIP2=192.168.10.12

#

case "$1" in

start)           

 

  /sbin/ifconfig eth0:1 $VIP netmask 255.255.255.0 up

 

# Since this is the Director we must be able to forward packets

  echo 1 > /proc/sys/net/ipv4/ip_forward

 

# Clear all iptables rules.

  /sbin/iptables -F

 

# Reset iptables counters.

  /sbin/iptables -Z

 

# Clear all ipvsadm rules/services.

  /sbin/ipvsadm -C

 

# Add an IP virtual service for VIP 192.168.0.219 port 80

# In this recipe, we will use the round-robin scheduling method. 

# In production, however, you should use a weighted, dynamic scheduling method. 

  /sbin/ipvsadm -A -t $VIP:80 -s rr

 

# Now direct packets for this VIP to

# the real server IP (RIP) inside the cluster

  /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m

  /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m

  

  /bin/touch /var/lock/subsys/ipvsadm.lock

;;

 

stop)

# Stop forwarding packets

  echo 0 > /proc/sys/net/ipv4/ip_forward

 

# Reset ipvsadm

  /sbin/ipvsadm -C

 

# Bring down the VIP interface

  ifconfig eth0:1 down

  

  rm -rf /var/lock/subsys/ipvsadm.lock

;;

 

status)

  [ -e /var/lock/subsys/ipvsadm.lock ] && echo "ipvs is running..." || echo "ipvsadm is stopped..."

;;

*)

  echo "Usage: $0 {start|stop}"

;;

esac

 

 

 

六、ARP問題

                     __________

                     |        |

                     | client |

                     |________|

                         |

                         |

                      (router)

                         |

                         |

                         |       __________

                         |  DIP |          |

                         |------| director |

                         |  VIP |__________|

                         |

                         |

                         |

       ------------------------------------

       |                 |                |

       |                 |                |

   RIP1, VIP         RIP2, VIP        RIP3, VIP

 ______________    ______________    ______________

|              |  |              |  |              |

| realserver1  |  | realserver2  |  | realserver3  |

|______________|  |______________|  |______________|

 

在如上圖的VS/DR或VS/TUN應用的一種模型中(所有機器都在同一個物理網路),所有機器(包括Director和RealServer)都使用了一個額外的IP地址,即VIP。當一個客戶端向VIP發出一個連接請求時,此請求必須要連接至Director的VIP,而不能是RealServer的。因為,LVS的主要目標就是要Director負責調度這些連接請求至RealServer的。

因此,在Client發出至VIP的連接請求後,只能由Director將其MAC地址響應給客戶端(也可能是直接與Director連接的路由設備),而Director則會相應的更新其ipvsadm table以追蹤此連接,而後將其轉發至後端的RealServer之一。

如果Client在請求建立至VIP的連接時由某RealServer響應了其請求,則Client會在其MAC table中建立起一個VIP至RealServer的對就關係,並以至進行後面的通信。此時,在Client看來只有一個RealServer而無法意識到其它伺服器的存在。

為瞭解決此問題,可以通過在路由器上設置其轉發規則來實現。當然,如果沒有許可權訪問路由器並做出相應的設置,則只能通過傳統的本地方式來解決此問題了。這些方法包括:

1、禁止RealServer響應對VIP的ARP請求;

2、在RealServer上隱藏VIP,以使得它們無法獲知網路上的ARP請求;

3、基於“透明代理(Transparent Proxy)”或者“fwmark (firewall mark)”;

4、禁止ARP請求發往RealServers;

 

傳統認為,解決ARP問題可以基於網路介面,也可以基於主機來實現。Linux採用了基於主機的方式,因為其可以在大多場景中工作良好,但LVS卻並不屬於這些場景之一,因此,過去實現此功能相當麻煩。現在可以通過設置arp_ignore和arp_announce,這變得相對簡單的多了。

Linux 2.2和2.4(2.4.26之前的版本)的內核解決“ARP問題”的方法各不相同,且比較麻煩。幸運的是,2.4.26和2.6的內核中引入了兩個新的調整ARP棧的標誌(device flags):arp_announce和arp_ignore。基於此,在DR/TUN的環境中,所有IPVS相關的設定均可使用arp_announce=2和arp_ignore=1/2/3來解決“ARP問題”了。

arp_annouce:Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface;

0 - (default) Use any local address, configured on any interface.

1 - Try to avoid local addresses that are not in the target's subnet for this interface. 

2 - Always use the best local address for this target.

 

arp_ignore: Define different modes for sending replies in response to received ARP requests that resolve local target IP address.

0 - (default): reply for any local target IP address, configured on any interface.

1 - reply only if the target IP address is local address configured on the incoming interface.

2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender's IP address are part from same subnet on this interface.

3 - do not reply for local address configured with scope host, only resolutions for golbal and link addresses are replied.

4-7 - reserved

8 - do not reply for all local addresses

 

在RealServers上,VIP配置在本地迴環介面lo上。如果回應給Client的數據包路由到了eth0介面上,則arp通告或請應該通過eth0實現,因此,需要在sysctl.conf文件中定義如下配置:

#vim /etc/sysctl.conf

net.ipv4.conf.eth0.arp_ignore = 1

net.ipv4.conf.eth0.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

 

以上選項需要在啟用VIP之前進行,否則,則需要在Drector上清空arp表才能正常使用LVS。

 

到達Director的數據包首先會經過PREROUTING,而後經過路由發現其目標地址為本地某介面的地址,因此,接著就會將數據包發往INPUT(LOCAL_IN HOOK)

 HOOK)進程會發現此數據包請求的是一個集群服務,因為其目標地址是VIP。於是,此數據包的本來到達本機(Director)目標行程被改變為經由POSTROUTING HOOK發往RealServer。這種改變數據包正常行程的過程是根據IPVS表(由管理員通過ipvsadm定義)來實現的。

 

如果有多台Realserver,在某些應用場景中,Director還需要基於“連接追蹤”實現將由同一個客戶機的請求始終發往其第一次被分配至的Realserver,以保證其請求的完整性等。其連接追蹤的功能由Hash table實現。Hash table的大小等屬性可通過下麵的命令查看:

# ipvsadm -lcn

 

為了保證其時效性,Hash table中“連接追蹤”信息被定義了“生存時間”。LVS為記錄“連接超時”定義了三個計時器:

1、空閑TCP會話;

2、客戶端正常斷開連接後的TCP會話;

3、無連接的UDP數據包(記錄其兩次發送數據包的時間間隔);

上面三個計時器的預設值可以由類似下麵的命令修改,其後面的值依次對應於上述的三個計時器:

# ipvsadm --set 28800 30 600

 

數據包在由Direcotr發往Realserver時,只有目標MAC地址發生了改變(變成了Realserver的MAC地址)。Realserver在接收到數據包後會根據本地路由表將數據包路由至本地迴環設備,接著,監聽於本地迴環設備VIP上的服務則對進來的資料庫進行相應的處理,而後將處理結果回應至RIP,但數據包的原地址依然是VIP。

ipvs的持久連接:

無論基於什麼樣的演算法,只要期望源於同一個客戶端的請求都由同一臺Realserver響應時,就需要用到持久連接。比如,某一用戶連續打開了三個telnet連接請求時,根據RR演算法,其請求很可能會被分配至不同的Realserver,這通常不符合使用要求。

Director腳本:

#!/bin/bash

#

# LVS script for VS/DR

#

. /etc/rc.d/init.d/functions

#

VIP=192.168.0.210

RIP1=192.168.0.221

RIP2=192.168.0.222

PORT=80

 

#

case "$1" in

start)           

 

  /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up

  /sbin/route add -host $VIP dev eth0:1

 

# Since this is the Director we must be able to forward packets

  echo 1 > /proc/sys/net/ipv4/ip_forward

 

# Clear all iptables rules.

  /sbin/iptables -F

 

# Reset iptables counters.

  /sbin/iptables -Z

 

# Clear all ipvsadm rules/services.

  /sbin/ipvsadm -C

 

# Add an IP virtual service for VIP 192.168.0.219 port 80

# In this recipe, we will use the round-robin scheduling method. 

# In production, however, you should use a weighted, dynamic scheduling method. 

  /sbin/ipvsadm -A -t $VIP:80 -s wlc

 

# Now direct packets for this VIP to

# the real server IP (RIP) inside the cluster

  /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1

  /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2

 

  /bin/touch /var/lock/subsys/ipvsadm &> /dev/null

;; 

 

stop)

# Stop forwarding packets

  echo 0 > /proc/sys/net/ipv4/ip_forward

 

# Reset ipvsadm

  /sbin/ipvsadm -C

 

# Bring down the VIP interface

  /sbin/ifconfig eth0:1 down

  /sbin/route del $VIP

  

  /bin/rm -f /var/lock/subsys/ipvsadm

  

  echo "ipvs is stopped..."

;;

 

status)

  if [ ! -e /var/lock/subsys/ipvsadm ]; then

    echo "ipvsadm is stopped ..."

  else

    echo "ipvs is running ..."

    ipvsadm -L -n

  fi

;;

*)

  echo "Usage: $0 {start|stop|status}"

;;

esac

 

 

RealServer腳本:

 

#!/bin/bash

#

# Script to start LVS DR real server.

# description: LVS DR real server

#

.  /etc/rc.d/init.d/functions

 

VIP=192.168.0.219

host=`/bin/hostname`

 

case "$1" in

start)

       # Start LVS-DR real server on this machine.

        /sbin/ifconfig lo down

        /sbin/ifconfig lo up

        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

 

        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up

        /sbin/route add -host $VIP dev lo:0

 

;;

stop)

 

        # Stop LVS-DR real server loopback device(s).

        /sbin/ifconfig lo:0 down

        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

 

;;

status)

 

        # Status of LVS-DR real server.

        islothere=`/sbin/ifconfig lo:0 | grep $VIP`

        isrothere=`netstat -rn | grep "lo:0" | grep $VIP`

        if [ ! "$islothere" -o ! "isrothere" ];then

            # Either the route or the lo:0 device

            # not found.

            echo "LVS-DR real server Stopped."

        else

            echo "LVS-DR real server Running."

        fi

;;

*)

            # Invalid entry.

            echo "$0: Usage: $0 {start|status|stop}"

            exit 1

;;

esac

HeartBeat

 

運行於備用主機上的Heartbeat可以通過乙太網連接檢測主伺服器的運行狀態,一旦其無法檢測到主伺服器的“心跳”則自動接管主伺服器的資源。通常情況下,主、備伺服器間的心跳連接是一個獨立的物理連接,這個連接可以是串列線纜、一個由“交叉線”實現的乙太網連接。Heartbeat甚至可同時通過多個物理連接檢測主伺服器的工作狀態,而其只要能通過其中一個連接收到主伺服器處於活動狀態的信息,就會認為主伺服器處於正常狀態。從實踐經驗的角度來說,建議為Heartbeat配置多條獨立的物理連接,以避免Heartbeat通信線路本身存在單點故障。

1、串列電纜:被認為是比乙太網連接安全性稍好些的連接方式,因為hacker無法通過串列連接運行諸如telnet、ssh或rsh類的程式,從而可以降低其通過已劫持的伺服器再次侵入備份伺服器的幾率。但串列線纜受限於可用長度,因此主、備伺服器的距離必須非常短。

2、乙太網連接:使用此方式可以消除串列線纜的在長度方面限制,並且可以通過此連接在主備伺服器間同步文件系統,從而減少了從正常通信連接帶寬的占用。

 

基於冗餘的角度考慮,應該在主、備伺服器使用兩個物理連接傳輸heartbeat的控制信息;這樣可以避免在一個網路或線纜故障時導致兩個節點同時認為自已是唯一處於活動狀態的伺服器從而出現爭用資源的情況,這種爭用資源的場景即是所謂的“腦裂”(split-brain)或“partitioned cluster”。在兩個節點共用同一個物理設備資源的情況下,腦裂會產生相當可怕的後果。

為了避免出現腦裂,可採用下麵的預防措施:

1、如前所述,在主、備節點間建立一個冗餘的、可靠的物理連接來同時傳送控制信息;

2、一旦發生腦裂時,藉助額外設備強制性地關閉其中一個節點;

 

第二種方式即是俗稱的“將其它節點‘爆頭’(shoot the other node in the head)”,簡稱為STONITH。基於能夠通過軟體指令關閉某節點特殊的硬體設備,Heartbeat即可實現可配置的Stonith。但當主、備伺服器是基於WAN進行通信時,則很難避免“腦裂”情景的出現。因此,當構建異地“容災”的應用時,應儘量避免主、備節點共用物理資源。

 

Heartbeat的控制信息:

“心跳”信息: (也稱為狀態信息)僅150 bytes大小的廣播、組播或多播數據包。可為以每個節點配置其向其它節點通報“心跳”信息的頻率,以及其它節點上的heartbeat進程為了確認主節點出節點出現了運行等錯誤之前的等待時間。

 

集群變動事務(transition)信息:ip-request和ip-request-rest是相對較常見的兩種集群變動信息,它們在節點間需要進行資源遷移時為不同節點上heartbeat進程間會話傳遞信息。比如,當修複了主節點並且使其重新“上線”後,主節點會使用ip-request要求備用節點釋放其此前從因主節點故障而從主節點那裡接管的資源。此時,備用節點則關閉服務並使用ip-request-resp通知主節點其已經不再占用此前接管的資源。主接點收到ip-request-resp後就會重新啟動服務。

 

重傳請求:在某集群節點發現其從其它節點接收到的heartbeat控制信息“失序”(heartbeat進程使用序列號來確保數據包在傳輸過程中沒有被丟棄或出現錯誤)時,會要求對方重新傳送此控制信息。 Heartbeat一般每一秒發送一次重傳請求,以避免洪泛。

 

上面三種控制信息均基於UDP協議進行傳送,可以在/etc/ha.d/ha.cf中指定其使用的UDP埠或者多播地址(使用乙太網連接的情況下)。

 

此外,除了使用“序列號/確認”機制來確保控制信息的可靠傳輸外,Heartbeat還會使用MD5或SHA1為每個數據包進行簽名以確保傳輸中的控制信息的安全性。

資源腳本:

資源腳本(resource scripts)即Heartbeat控制下的腳本。這些腳本可以添加或移除IP別名(IP alias)或從屬IP地址(secondary IP address),或者包含了可以啟動/停止服務能力之外數據包的處理功能等。通常,Heartbeat會到/etc/init.d/或/etc/ha.d/resource.d/目錄中讀取腳本文件。Heartbeat需要一直明確瞭解“資源”歸哪個節點擁有或由哪個節點提供。在編寫一個腳本來啟動或停止某個資源時,一定在要腳本中明確判斷出相關服務是否由當前系統所提供。

 

Heartbeat的配置文件:

/etc/ha.d/ha.cf

定義位於不同節點上的heartbeat進程間如何進行通信;

/etc/ha.d/haresources

定義對某個資源來說哪個伺服器是主節點,以及哪個節點應該擁有客戶端訪問資源時的目標IP地址。

/etc/ha.d/authkeys

定義Heartbeat包在通信過程中如何進行加密。

 

當ha.cf或authkeys文件發生改變時,需要重新載入它們就可以使用之生效;而如果haresource文件發生了改變,則只能重啟heartbeat服務方可使之生效。

 

儘管Heartbeat並不要求主從節點間進行時鐘同步,但它們彼此間的時間差距不能超過1分鐘,否則一些配置為高可用的服務可能會出異常。

 

Heartbeat當前也不監控其所控制的資源的狀態,比如它們是否正在運行,是否運行良好以及是否可供客戶端訪問等。要想監控這些資源,冉要使用額外的Mon軟體包來實現。

 

haresources配置文件介紹:

主從節點上的/etc/ra.d/raresource文件必須完全相同。文件每行通常包含以下組成部分:

1、伺服器名字:指正常情況下資源運行的那個節點(即主節點),後跟一個空格或tab;這裡指定的名字必須跟某個節點上的命令"uname -n"的返回值相同;

2、IP別名(即額外的IP地址,可選):在啟動資源之前添加至系統的附加IP地址,後跟空格或tab;IP地址後面通常會跟一個子網掩碼和廣播地址,彼此間用“/”隔開;

3、資源腳本:即用來啟動或停止資源的腳本,位於/etc/init.d/或/etc/ha.d/resourcd.d目錄中;如果需要傳遞參數給資源腳本,腳本和參數之間需要用兩個冒號分隔,多個參數時彼此間也需要用兩個冒號分隔;如果有多個資源腳本,彼此間也需要使用空格隔開;

 

 格式如下:

 primary-server [IPaddress[/mask/interface/broadcast]]  resource1[::arg1::arg2]  resource2[::arg1::arg2]

 例如:

 primary-server 221.67.132.195 sendmail httpd

 

安裝配置Heartbeat

yum install

 

cp /usr/share/doc/heartbeat-2*/authkeys, ha.cf, haresources

( echo -ne "auth 1\n1 sha1 "; \dd if=/dev/urandom bs=512 count=1 | openssl md5 ) \> /etc/ha.d/authkeys

chmod 0600 /etc/ha.d/authkeys

/usr/lib/heartbeat/ha_propagate

 

 HA的LVS集群有兩台Director,在啟動時,主節點占有集群負載均衡資源(VIP和LVS的轉發及高度規則),備用節點監聽主節點的“心跳”信息併在主節點出現異常時進行“故障轉移”而取得資源使用權,這包括如下步驟:

1、添加VIP至其網路介面;

2、廣播GARP信息,通知網路內的其它主機目前本Director其占有VIP;

3、創建IPVS表以實現入站請求連接的負載均衡;

4、Stonith;

 

 

棄用resource腳本,改用ldirecotord來控制LVS:

ldirectord用來實現LVS負載均衡資源的在主、備節點間的故障轉移。在首次啟動時,ldirectord可以自動創建IPVS表。此外,它還可以監控各Realserver的運行狀態,一旦發現某Realserver運行異常時,還可以將其從IPVS表中移除。

ldirectord進程通過向Realserver的RIP發送資源訪問請求並通過由Realserver返回的響應信息來確定Realserver的運行狀態。在Director上,每一個VIP需要一個單獨的ldirector進程。如果Realserver不能正常響應Directord上ldirectord的請求,ldirectord進程將通過ipvsadm命令將此Realserver從IPVS表中移除。而一旦Realserver再次上線,ldirectord會使用正確的ipvsadm命令將其信息重新添加至IPVS表中。

例如,為了監控一組提供web服務的Realserver,ldirectord進程使用HTTP協議請求訪問每台Realserver上的某個特定網頁。ldirectord進程根據自己的配置文件中事先定義了的Realserver的正常響應結果來判斷當前的返回結果是否正常。比如,在每台web伺服器的網站目錄中存放一個頁面".ldirector.html",其內容為"GOOD",ldirectord進程每隔一段時間就訪問一次此網頁,並根據獲取到的響應信息來判斷Realserver的運行狀態是否正常。如果其返回的信息不是"GOOD",則表明服務不正常。

ldirectord需要從/etc/ha.d/目錄中讀取配置文件,文件名可以任意,但建議最好見名知義。

實現過程:

 

創建/etc/ha.d/ldirectord-192.168.0.219.cf,添加如下內容:

# Global Directives

checktimeout=20    

# ldirectord等待Realserver健康檢查完成的時間,單位為秒;

# 任何原因的檢查錯誤或超過此時間限制,ldirector將會將此Realserver從IPVS表中移除;

checkinterval=5

# 每次檢查的時間間隔,即檢查的頻率;

autoreload=yes

# 此項用來定義ldirectord是否定期每隔一段時間檢查此配置文件是否發生改變並自動重新載入此文件;

logfile="/var/log/ldirectord.log"

# 定義日誌文件存放位置;

quiescent=yes

# 當某台Realserver出現異常,此項可將其設置為靜默狀態(即其權重為“0”)從而不再響應客戶端的訪問請求;

 

# For an http virtual service

virtual=192.168.0.219:80

# 此項用來定義LVS服務及其使用的VIP和PORT

        real=192.168.0.221:80 gate 100

        # 定義Realserver,語法:real=RIP:port gate|masq|ipip [weight]

        real=192.168.0.223:80 gate 300

        fallback=127.0.0.1:80 gate

        # 當IPVS表沒有任何可用的Realserver時,此“地址:埠”作為最後響應的服務;

        # 一般指向127.0.0.1,並可以通過一個包含錯誤信息的頁面通知用戶服務發生了異常;

        service=http

        # 定義基於什麼服務來測試Realserver;

        request=".ldirectord.html"

        receive="GOOD"

        scheduler=wlc 

        #persistent=600

        #netmask=255.255.255.255

        protocol=tcp

        # 定義此虛擬服務用到的協議;

        checktype=negotiate

        # ldirectord進程用於監控Realserver的方法;{negotiate|connect|A number|off}

        checkport=80

        

在/etc/hd.d/haresources中添加類似如下行:

 node1.example.com 192.168.0.219 ldirectord::ldirectord-192.168.0.219.cf       

# yum install docbook-stype-xsl

# yum install net-snmp-devel

# yum install OpenIPMI-devel

# groupadd -g 694 haclient

# useradd -G haclient -d /dev/null -s /sbin/nologin -u 694 hacluster

 

安裝glue和heartbeat

# wget http://hg.linux-ha.org/glue/archive/glue-1.0.3.tar.bz2

# tar jxvf glue-1.0.3.tar.bz2

# cd glue-1.0.3

# ./autogen.sh

# ./configure

# make

# make install

 

# wget http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/STABLE-3.0.2.tar.bz2

# tar jxvf STABLE-3.0.2.tar.bz2

# cd Heartbeat-3-0-STABLE-3.0.2/

# ./bootstrap

# ./ConfigureMe configure

# make

# make install

# cp doc/{ha.cf,haresources} /etc/ha.d/

 

生成authkeys:

# echo -ne "auth 1\n1 sha1 " >> /etc/ha.d/authkeys

# dd if=/dev/urandom bs=512 count=1 | openssl md5  >> /etc/ha.d/authkeys

# chmod 0600 /etc/ha.d/authkeys

 

將heartbeat服務加入到自動啟動隊列:

# chkconfig --add heartbeat

# chkconfig heartbeat on

 

# /usr/share/heartbeat/ha_propagate

 

LVS & Heartbeat

 

# yum -y --nogpgcheck localinstall libnet-1.1.4-3.el5.i386.rpm  

# yum -y --nogpgcheck localinstall perl-MailTools-1.77-1.el5.noarch.rpm 

# yum -y --nogpgcheck localinstall heartbeat-pils-2.1.4-10.el5.i386.rpm  

# yum -y --nogpgcheck localinstall heartbeat-stonith-2.1.4-10.el5.i386.rpm 

# yum -y --nogpgcheck localinstall heartbeat-gui-2.1.4-10.el5.i386.rpm

# yum -y --nogpgcheck localinstall heartbeat-ldirectord-2.1.4-10.el5.i386.rpm

# yum -y --nogpgcheck localinstall heartbeat-devel-2.1.4-10.el5.i386.rpm

# yum -y --nogpgcheck localinstall heartbeat-2.1.4-10.el5.i386.rpm

 

perl-Compress-Zlib

perl-HTML-Parser

perl-HTML-Tagset

perl-URI

perl-libwww-perl

perl-MailTools

perl-TimeDate

perl-String-CRC32

net-snmp-libs

 

 

# cp -v /usr/share/doc/heartbeat-2.1.4/{ha.cf,authkeys,haresources} /etc/ha.d/

# cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/

 

 

 

Director:

eth0 , 192.168.0.209

 

ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255

route add -host $VIP dev eth0:1

 

ipvsadm -A -t $VIP:80 -s wrr

ipvsadm -a -t $VIP:80 -r $RIP1 -w 5 -g

ipvsadm -a -t $VIP:80 -r $RIP2 -w 50 -g

 

RealServer

 

iptables -t nat -F

iptables -F

 

ipvsadm -C

 

ifdown lo

ifup lo

 

echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

 

ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up

route add -host $VIP dev lo:0

primary.mydomain.com 209.100.100.3/24/eth0/209.100.100.255 httpd

heartbeat (HA), keepalived, ultramokey, openais/corosync

RHCS:RedHat Cluster Suite, (openais/corosync), CRM

pacemaker

 

方法:

heartbeat v1

/etc/init.d/httpd

CIF

web

IP:192.168.0.186

primary:

IP:192.168.0.181

192.168.10.6

standby

192.168.0.182

192.168.10.7

web

/etc/ha.d/authkeys 該文件在兩個版本作用是完全相同的,都必須設置,並且保證每個節點(node)內容一樣;

/etc/ha.d/ha.cf 這個是主要配置文件,由其決定v1或v2 style格式

/etc/ha.d/haresources 這是v1的資源配置文件

/var/lib/heartbeat/crm/cib.xml 這是v2的資源配置文件,兩者根據ha.cf的設定只能選其一

v2版本使用CRM管理工具,而cib.xml文件可有幾種方式來編寫:

a)人工編寫XML文件;

b)使用admintools工具,其已經包含在heartbeat包中;

c)使用GUI圖形工具配置,也包含在heartbeat-gui包裡面;

d)使用python腳本轉換1.x style的格式配置文件。

 

 

# more /etc/ha.d/ha.cf

#發送keepalive包的間隔時間

keepalive 2

#定義節點的失效時間

deadtime 30

#定義heartbeat服務啟動後,等待外圍其他設備(如網卡啟動等)的等待時間

initdead 30

#使用udp埠694 進行心跳監測

udpport 694

#定義心跳

bcast   eth0 eth1               # Linux

#定義是否使用auto_failback功能

auto_failback off

#定義集群的節點

node    hatest3

node    hatest4

#使用heartbeat提供的日誌服務,若use_logd設置為yes後,下麵的三個選項會失效

use_logd yes

#logfile /var/log/ha_log/ha-log.log

#logfacility local7

#debugfile /var/log/ha_log/ha-debug.log

#設定一個監控網關,用於判斷心跳是否正常

ping 192.168.0.254

deadping 5

#指定和heartbeat一起啟動、關閉的進程

respawn hacluster /usr/local/lib64/heartbeat/ipfail

apiauth ipfail gid=haclient uid=hacluster

 

 

 

 

先停止heartbeat

service heartbeat stop

 

vim /etc/ha.d/ha.cf

 

添加/啟用如下選項:

crm respawn

#下麵是對傳輸的數據進行壓縮,是可選項

compression     bz2

compression_threshold 2

 

 

轉換v1.x為v2.x格式文件

heartbeat提供了一個使用python寫的轉換工具,可直接轉換v1 style的配置文件為v2 style:

# /usr/lib/heartbeat/haresources2cib.py /etc/ha.d/haresources

 

查看資源列表:

crm_resource -L

 

查看某資源在哪個節點上運行:

# crm_resource -W -r

 

查看節點運行狀態信息:

# crm_mon -1

 

CRM:

heartbeat v1, haresources

crm

pacemaker

 

heartbeat v2 

1、停止heartbeat:

2、vim /etc/ha.d/ha.cf

crm respawn

 

3、# cd /usr/lib/heartbeat

# ./haresources2cib.py  /etc/ha.d/haresources  

轉換後的文件:/var/lib/heartbeat/crm/cib.xml

mv /etc/ha.d/haresources /root

# scp /var/lib/heartbeat/crm/cib.xml standby:/var/lib/heartbeat/crm

 

4、啟動heartbeat

piranha, LVS

pacemaker, heartbeat

heartbeat2, heartbeat3

/usr/lib/ocf/resource.d/heartbeat/IPaddr meta-data 

隔離

級別:

節點級別

STONITH: Shoot The Other Node In The Head

資源級別

fencing

active/active

active/passive

n/n-1

n/m

n/n

 

HA:

fencing

節點

資源

Message and Infrastructure Layer

Membership, CCM

Resource Allcation, CRM, LRM, CIB, PE, TE

Resource Layer, RA           

 

Linux: HA

Heartbeat(v1, v2, v3) (heartbeat, pacemaker, cluster-glue)

Keepalive

Ultramonkey

Corosync/openais + pacemaker

RHCS( heartbeat ) 

Types of Resources

Primitives

A primitive resource, the most basic type of a resource.

Groups

Groups contain a set of resources that need to be located together, started sequentially and stopped in the reverse order.

Clones

Clones are resources that can be active on multiple hosts. Any resource can be cloned, provided the respective resource agent supports it.

Masters

Masters are a special type of clone resources, they can have multiple modes.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [20171031]rman xxx Failure.txt--//簡單測試 List Failure, Advise Failure and Repair Failure命令在11g下,也許以後工作需要.--//雖然我自己很少使用這個命令,感覺這個有點傻瓜化.1.環境:SYS@book> @ &r ...
  • [20171031]markhot.txt--//昨天看了https://jonathanlewis.wordpress.com/2017/10/02/markhot/,測試看看這樣時候可以減少爭用.1.環境:SCOTT@book> @ &r/ver1PORT_STRING VERSION BANN ...
  • 出現問題的可能性 1、可能是/opt/mysql/data/數據目錄mysql用戶沒有許可權(修改數據目錄的許可權) 解決方法 :給予許可權,執行 "chown -R mysql.mysql /opt/mysql/data" 然後重新啟動mysqld 2、可能進程里已經存在mysql進程 解決方法:用命令 ...
  • Windows 10客戶端及Windows server 2016 伺服器可以使用powershell 命令獲得系統支持的密碼套件列表,禁用啟用相應的密碼套件。 Windows server 2016之前版本微軟並沒有給出相應的powershell 命令來獲取密碼套件列表,但在msdn上給出了c++ ...
  • 1、簡介 GCC程式編譯可分成四個階段: 預處理(Pre-Preocessing) 編譯(Compiling) 彙編(Assembling) 鏈接(Linking) 2、GCC基本用法 基本用法:gcc [options][filename] 常用options選型及其用法介紹如下: -o outp ...
  • 一、Nginx簡介 1.1Nginx特性 模塊化設計,較好的擴展性 高可靠性 支持熱部署:不停機更新配置文件,升級版本,更換日誌文件 低記憶體消耗:10000個keep alive連接模式下的非活動連接,僅 需要2.5M記憶體event driven,aio,mmap,sendfile 1.2Nginx ...
  • 1.描述 網卡的驅動其實很簡單,它還是與硬體相關,主要是負責收髮網絡的數據包,它將上層協議傳遞下來的數據包以特定的媒介訪問控制方式進行發送, 並將接收到的數據包傳遞給上層協議。 網卡設備與字元設備和塊設備不同, 網路設備並不對應於/dev目錄下的文件,不過會存放在/sys/class/net目錄下 ...
  • 使用輸入子系統實現的按鍵程式,每次按鍵後進入中斷,就會報錯如下: input_key_handler [ cut here ] WARNING: at drivers/gpio/gpiolib.c:101 gpio_ensure_requested+0x5c/0x118() autorequest ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...