keepalived

一、集羣基礎
1、系統的擴展方式

scale up向上擴展:提高單臺服務器的性能
scale out向外擴展:多臺服務器聯合起來滿足同一個需要

2、集羣類型


LB :load balancing,負載均衡集羣,通過橫向擴展提高系統性能

實現方式
傳輸層 : ipvs(lvs)
應用層 : nginx(upstream,proxy)


架構的基本表現方式

前端 : 負載均衡器,調度器
後端 : 上游服務器(upstream server),後端服務器,“真”服務器(real server)

SPOF : Single point of failure(單點故障)



HA : High Avalilability,高可用集羣,提供冗餘主機提升系統可用性


架構的基本表現方式

前端:Active,活動服務器
後端:passive,備用服務器

avalilability = 平均無故障時間/(平均無故障時間+平均修復時間)

值的取值範圍:0-1之間,99%,99.9%, 99.99%,99.999%
5個9表示: 一年有5分鐘不在線的時間



HP : High Performance,高可用集羣組合多臺主機解決一個問題, 每個主機只負責其中一部分運算


DS : Distributed System,分佈式系統

分佈式存儲
HDFS(hadoop)
mogileFS
ClusterFS
Ceph(已經收錄到linux內核)


分佈式計算
Hadoop的YARN框架
batch : MapReduce(批處理計算)
in-memory : spark
stream : storm



二、集羣實現方式
1、集羣的實現

基於實現方式劃分:
硬件實現:
F5(BIG-IP)
Citrix Netscaler
A10(A10)
Arry
redware


軟件實現
Lvs(Linux virtual Server)
HAproxy
Nginx
ats (apache traffic server)
perlbal



基於工作的協議層次劃分
傳輸層
lvs
HAproxy(mode tcp)


應用層
HAproxy(mode http)
Nginx
ats
perlbal



2、HA集羣的實現

Keepalived
通過模擬Vrrp協議來實現地址漂移


AIS系統
heartbeat(Centos 6之前系統可能使用)
Cman+rgmanager(RHCS : Redhat Cluster Suite)
Corosync+pacemaker+crmsh


HA Cluster
HA Nginx Porxy Service需要的關鍵資源

公網IP
Nginx Service(兩臺server的時間要嚴格同步)
相同的配置文件

AIS可用性委員組,規定高可用集羣棧

1、Messaging Layer(Infrastructure Layer),消息層(心跳層)
互相傳遞心跳信息(集羣事務信息的傳遞,由監聽的套接字服務來實現),向上提供一堆的API接口,在這周提供高可用的能力


2、CRM(Cluster Resource manager)集羣資源管理層
專門負責高可用集羣的資源管理,如:選取主節點
其中CRM包含了LRM(Local Resource Manager),執行資源配置


3、RA(Resource Agent),資源代理層
管理機制的實現(如:start,stop,restart,status,monitor)


高可用集羣面臨的問題
1、集羣的分裂(partion)
被稱之爲集羣的分區(partion)也被稱之爲腦裂(brain-split))爲了避免出現分裂,事先做好決策,在每個主機上都有一票,票數多的將獲取主節點。如果一個服務器性能好,可以有2票。
2、多節點使用同一個共享存儲
在集羣發生分裂的情況下, 可能會引發多節點同時對一個塊級別的共享存儲寫一個文件,這樣會導致文件系統損壞

解決方法
幹掉對方服務器的電源(如通過電源交換機將主機的電源斷掉)


VRRP概述
VRRP協議
虛擬路由冗餘協議(virtual router redundancy protocol,簡稱VRRP),是由IETF提出的解決局域網中配置靜態網關出現單點失效現象的路由協議,1998年已推出正式的RFC2338協議標準,VRRP廣泛應用在邊緣網絡中,它的設計目標是支持特定情況下IP數據流量失敗轉移不會引起混亂,允許主機使用單路由器,以及及時在實際第一跳路由器使用失敗的情形下仍能夠維護路由器間的連通性。
VRRP術語


虛擬路由器
由一個Master路由器和多個Backup路由器組成,主機將虛擬路由器當作默認網關


VRID
虛擬路由器的標識,有相同VRID的一組路由器構成一個虛擬路由器


Master路由器
虛擬路由器中承擔報文轉發任務的路由器,即主節點(僅能有一個)


Backup路由器
Master路由器出現故障時,能夠代替Master路由器工作的路由器,即備用節點(可以有多個)


虛擬IP地址(VIP)
虛擬路由器的IP地址,已改爲虛擬路由器可以擁有一個或多個IP地址


IP地址擁有者
接口IP地址與虛擬IP地址相同的路由器被稱之爲IP地址擁有者


虛擬MAC地址(VMAC)
一個虛擬路由器擁有一個虛擬MAC地址,虛擬路由器迴應ARP請求使用的是虛擬MAC地址


優先級
VRRP根據優先級來確定虛擬路由器中每臺路由器的地位


非搶佔方式
若Backup路由器工作在非搶佔模式下,則只要Master路由器沒有故障,Backup路由器即使隨後被配置了更高的優先級也不會成爲Master路由器


搶佔方式
如果backup路由器工作在搶佔方式下, 當它收到VRRP報文後,會將自己的優先級與通告報文中的優先級進行比較,如果自己的優先級比當前的Master優先級高,就會主動搶佔成爲Master路由器,否則,將保持Backup狀態


VRRP工作過程

1、虛擬路由器中的路由器根據優先級選舉出Master,Master通過發送ARP報文,將自己的虛擬MAC地址發送給其它設備和主機
2、Master路由器週期性發送VRRP報文,以公佈其配置信息(優先級等)和工作狀態
3、如果Master路由器出現故障, 虛擬路由器的backup路由器根據優先級重新選舉新的Master
4、虛擬路由器狀態切換時,新的Master路由器只是簡單地發送一個攜帶虛擬路由器的MAC地址和IP地下信息的ARP報文,這樣就可以更新與它連接的主機或設備中的ARP相關信息,網絡中的主機感知不到Master的切換
5、backup路由器優先級高於master路由器時,由backup路由的工作方式(搶佔或非搶佔方式)決定是否重新選舉Master
VRRP優先級的取值範圍爲0-255(數值越大優先級越高),可配置的範圍爲1到254,優先級0爲系統保留給路由器放棄master位置時使用,255則是系統保留給IP地址擁有者使用,當路由器爲IP地址擁有者時,其優先級始終爲255,當虛擬路由器擁有虛擬IP地址時,只要其工作正常,則爲Master路由器

路由通告的工作原理

Master路由器週期發送VRRP報文,在虛擬路由器中公佈其配置信息(優先級)和工作狀態,backup路由器通過接收vrrp報文情況來判斷master是否工作正常
master路由器主動放棄master地位時,發送優先級爲0的VRRP報文,致使backup路由器切換爲master路由器,這個切換時間爲skew time, 計算方式爲:(256-backup路由器的優先級/256,單位爲秒)
當master路由器發送網絡故障不能發送VRRP報文的時,backup路由器不能立即知道其工作狀態,backup路由器等待一段時間後,如果還沒有收到VRRP報文, 會認爲master工作不正常, 而把自己升級爲master路由器,週期發送VRRP報文,如果此時多個backup路由器競爭master路由的位置,將通過優先級選舉master路由器,backup路由器默認等待的時間爲master_down_interval,取值爲:(3*VRRP報文的發送時間間隔+skew time,單位爲秒)
在性能不穩定的網絡中, backup路由器可能因爲網絡堵塞而在master_down_interval期間沒有收到master路由的報文,而主動搶佔master位置, 如果此時master報文又到達了, 就會出現虛擬路由器的成員頻繁的進行master搶佔現象,爲了緩解這種情況發生,特制定了延遲等待定時器,它可以使得backup路由器在等待了master_down_interval後,再等待延遲等待時間,如果在此期間仍然沒有收到VRRP報文,則此backup路由器纔會切換爲master路由器,對外發送VRRP報文

VRRP實現的工作

路由選舉
路由狀態通知
爲了提高安全性,VRRP還軟件娃娃了認證功能

VRRP認證方式

無認證
簡單字符認證,通常用於局域網
MD5認證,跨越互聯網

VRRP高可用工作模型


主備備份

主備備份方式表示業務僅由Master路由器承擔,當Master路由器出現故障時,纔會由選舉出來的Backup路由器接替它的工作,如下圖:

strip

主主備份

在路由器的一個接口上可以創建多個虛擬路由器,使得該路由器可以在一個虛擬路由器中作爲Master路由器,同時在其它的虛擬路由器中作爲Bacup路由器,主主備份模式可以實現負載分擔方式,是指多臺路由器同時承擔業務,因此負載分擔方式需要兩個或兩個以上的虛擬路由器,每個虛擬路由器都包括一個Master路由器和若干個Backup路由器。各虛擬路由器的Master路由器可以不相同,如下圖:

strip

Keepalived
keepalived功能
keepalived程序是vrrp協議在linux主機上以守護進程方式的實現,能夠根據配置文件生成IPVS規則 ,並對各real server的健康做檢測,以及Loadbalance主機和backup主機之間failover的實現,keepalived在Centos6.4+收錄到了發行版光盤中。
keepalived核心組件


核心組件
Watchdog : 高可用監視器(監控服務本身,可實現重啓的)
Checkers : 健康狀態檢測器,可實現如下協議
TCP
HTTP
SSL
MISC


SMTP : 支持發送郵件通知機制
System Call : 通過系統調用做出管理操作
VRRP stack : VRRP棧的實現,實現VRRP協議調用
NetLink Reflectior : VRRP藉助於netlink監控網絡,實現網絡功能配置
Ipvs wrapper : ipvs控制


IO複用器
內存管理
控制面板(配件文件分析器,以實現應用配置文件)

Keepalive的工作原理:

1、主節點主動向備用節點發送存活通知消息(只是3層判斷)
2、發送存活通知消息機制:
廣播(broadcast)
組播(multicast)
單播(unicast)


3、設定各服務器的優先級,優先級判斷方法
手動設定
根據IP地址數值大小,大的優先級高
隨機的挑選


4、需要監控服務器的存活狀態,如果服務故障需要重啓服務,如重啓服務無效,就需要降低主節點的優先級
5、各節點需要安裝keepalive服務,並且都加入到同一個集羣中,並且每個節點都監聽在某個套接字止,不斷向外傳遞心跳信息
6、多個節點配置域共享密鑰,防止有人惡意加入集羣
7、集羣自行決定來啓動服務,不能夠也不應該手動啓動(建立策略來決定哪個節點啓動服務)
8、將多個資源綁定在一起,一同調用或配置
9、模擬VRRP協議,實現地址飄移,keepalived僅能飄移IP地址
10、不能轉移服務,內置了一個模塊,能直接向內核的ipvs添加規則,創建一人LVS(keepalved天生高可用lvs)
11、內置的提供了一個接口,可以通過編寫腳本,來檢測服務的狀態,根據返回的狀態,如果發生了故障,就主動降低服務器的優先級(vrrp_script,track_script)

Keepalived高可用集羣配置前提

各節點時間要同步,一般使用網絡時間服務器
確保iptables及selinux服務關閉
各節點之間可通過主機名互相通信,節點的名稱設定與hosts文件中解析的主機名都要保持一致(AIS架構必須項)
uname -n 獲得主機名,與解析的主機名要相同


各節點基於密鑰認證的方式通過ssh互信通信

keepalived的程序環境

主配置文件
/etc/keepalived/keepalived.service


生成hash指紋的工具


/etc/bin/genhash
[root@Centos7 ~]# genhash -s 172.16.36.70 -p 80 -u index.html
MD5SUM = 7833123aaf6b782a8997b80affda274f



/etc/keepalived/keepalived.conf


Global configuration : 全局配置
  global_defs {
      ...
  }


VRRP Configuration : 配置VRRP實例
  vrrp_instance NAME {
      ...

  }


LVS Configuration : IPVS的相關配置
  virtual_server IP PORT {
      ...
      real_server IP PORT {
          ...
      }
  }


Global指令


notification_email {} : 郵件通知的對象,收件人郵箱

notification_email_from : 發件人郵箱

smtp_server : 郵件發送服務器IP地址

smtp_connect_timeout : 連接郵件服務器的超時時長

router-id HOSTNAME : 物理節點的標識符,建議使用主機名

vrrp_mcast_grou4 224.0.0.18 : vrrp的多播地址,IPV4,默認爲224.0.0.18

vrrp_mcast_group6 ff02::12 : vrrp的多播地址, IPV6

vrrp_script NAME { } : 定義腳本,可以在vrrp_instance中使用track_script引用
script COMMAND : script是固定字段,後面爲腳本的內容,有空格需要使用引號包括起來
interval # : 間隔多長時間進行狀態查看,以秒爲單位
weight [+|-] # : 如果腳本的返回狀態是失敗的,將優先級減去相應的數值


nopreempt : 定義爲非搶佔模式

preempt_delay TIME : 定義爲延遲搶佔模式

VRRP_instance指令


state MASTER | BACKUP : 在當前VRRP實例中(虛擬路由器組)此節點的初始實例

Interface IFACE_NAME : vrrp用於綁定VIP的接口,各節點網卡接口名稱需保持一致

virtual_route_id # : 虛擬路由器的ID(VRID),可用值爲0-255,默認爲51

priority # : 當前路由器節點的優先級,可用範圍爲0-255

advert_in # : 通告時間間隔,單位是秒種,默認是1秒

authentication { } : 定義認證的特殊引用段
auth type PASS : 指定集羣密鑰方式
auth_pass 1234 : 字符密鑰吸有前8個有效


virtual_ipaddress { } : 定義集羣中主機的特殊引用
\<IPADDR>/<MASK>brd \<IPADDR>Dev\<string> scope \<SCOPE> label \<LEBEL>


notify_master <string> | <quoted-string> : 當前節點轉爲主節點觸發的腳本

notify_backup <string> | <quoted-string> : 當前節點轉爲備用節點觸發的腳本

notify_fault <string> | <quoted-string> : 當前節點出現故障時觸發的腳本

notify <string> | <quoted-string> : 一般情況下, 只使用上面三個, 或者只使用下面一個

track_script { VRRP_SCRIPT_NAME } : 使用此引用,可以調用vrrp_script定義的腳本並執行

track_script { IFACE_NAME } : 調用vrrp_script內置方法,可以判斷主機的網絡接口是否正常,如果不正常將自動降低其權重,轉爲backup模式

virtual_server指令


delay_loop <INT> : 延遲多長時間檢測集羣服務是否OK

lb_algo rr|wrr|lc|wlc|lblc|sh|dh : lvs的調度算法

lb_kind NAT|DR|TUN : lvs的類型,如需支持fullnat,需要打補丁

persistence_timeout <INT> : 持久時長,0表示不啓用

nat_mask 255.255.255.0 : IP掩碼地址,此處的nat沒有寫錯

protocol TCP : lvs調度的協議,默認是udp,如果是udp可以不用添加此指令

virtual_host <string> : 對哪個虛擬主機做健康狀態檢測,可以不定義

quorum <INT> : 最少法定票數,判斷realserver有幾臺纔是OK的

quorum_up : 添加票數

quorum_down : 降低票數

sorry_server <IPADDR><PORT> : 定義sorry server

real_server IP PORT { } :定義一個real_server主機

weight <INT> : 權重

inhibit_no_failure : 如果檢測失敗,就把權重設置爲0

notify_up <string> | <quoted-string> : realserver上線通知,依賴腳本完成

notify_down <string> | <quoted-string> : realserver下線通知,依賴腳本完成

HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK : 對後端的realserver主機,使用相應的方法做健康狀態檢測

url { } : 對url做健康檢測的特殊引用

path <string> : 檢測的url路徑

status_code <INT> : 依賴返回狀態碼進行檢測

digest <string> : 依賴頁面的hash值進行檢測,基於genhash命令完成hash值計算


nb_get_retry <INT> : get請求的重試次數

delay_befor_retry <INT> : 兩次重試之間的時間間隔,要延遲多長時間,再retry

connect_ip <IPADDR> : 默認會按real server的IP做健康狀態檢測,一般不需要再寫,但有的時候可能有一個IP專門做健康狀態檢測的IP,故要手動添加上去

connect_port <PORT> : 連接的端口

bindto <IPADDR> : 如果keepalived主機有多個IP,定義用哪個IP完成健康狀態檢測

connect_timeout <INT> : 連接超時時長,默認爲5秒,但這個時長比較長, 建議調整至3秒

warmup <INT> : 做健康狀態檢測的延遲, 即keepalived服務起來後,等待多長時間再開始健康狀態檢測,有時候後端的real server還未啓動完成,故需要等待一段時間


TCP_CHECK { } : 傳輸層健康狀態檢測

connect_timeout <INT> : 連接超時時長

connect_ip : 檢測的realserver的IP,一般不需要寫,同url中的參數一樣

connect_port : 檢測的realserver的port,一般不需要寫,同url中的參數一樣

bindto <IP ADDR> : 同url中的參數一樣

bind_port <port> : 使用哪個端口做健康狀態檢測



主備模式的可高可用nginx的配置實例(實現IP地址漂移)
實驗環境:
172.16.36.70
172.16.36.71


######172.16.36.70的配置
~]# ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
~]# ssh-copy-id [email protected]
~]# vim /etc/hosts
172.16.36.71 Centos7.pc2
~]# ntpdate 172.16.0.1
~]# yum install nginx
~]# mv /usr/share/nginx/html/index.html{,.bak}
~]# vim /usr/share/nginx/html/index.html
172.16.36.70

~]# systemctl start nginx

使用客戶端IE測試測試頁面,是否正常顯示
~]# yum install keepalived
~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived_admin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id Centos7.pc1 #路由設備在網絡中的名稱,一般爲hostname
}
######使用vrrp_script實現依賴腳本監測文件的存在性,來降低節點的優先級,以此實現主備模式的切換
vrrp_script chk_down {
    script "[ -f /etc/keepalived/down ] && exit 1 || exit 0"
    interval 1
    weight -20
}
######監測web的訪問返回結果,判斷服務的可用性, 來了解你節點的優先級
vrrp_script chk_nginx {
    script "curl -s 172.16.36.70 | grep 172 &> /dev/null"
    interval 1
    weight -20
}
######監控主機的nginx是否存在,0信號只是做進程探測的
vrrp_script chk_nginx2 {
        script "killall -0 nginx"  
        interval 1
        weigth -20
}

vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 99999999
    }
    virtual_ipaddress {
    172.16.36.100/16 dev eno16777736 label eno16777736:1
    }
    notify_master "/etc/keepalived/keepalived.sh master"
    notify_bakcup "/etc/keepalived/keepalived.sh backup"
    notify_fault "/etc/keepalived/keepalived.sh fault"
    track_script {
    chk_down
    chk_nginx
    eno16777736    #監控主機的網卡,如果出現故障可自動降低優先級。 此腳本調用不用定義,是vrrp_script內置的

    }
}

~]# vim /etc/keepalived/keepalived.sh
#!/bin/bash
#author :Magedu
#Description : an example of notify script
contact='root@localhost'

notify() {
    mailsubject="$(hostname) to be $1:vip floating"
    mailbody="$(date +'%F %H:%M:%S'): vrrp transition,$(hostname) change to be $1"
    echo $mailbody | mail -s "$mailsubject" $contact

case $1 in
master)
    notify master
    systemctl start nginx.service
    exit 0
    ;;
backup)
    notify backup
    systemctl restart nginx.service
    exit 0
    ;;
fault)
    notify fault
    systemctl stop nginx.service
    exit 0
    ;;
*)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit
    ;;
esac


######172.16.36.71的配置
172.16.36.71
~]# ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
~]# ssh-copy-id [email protected]
~]# vim /etc/hosts
172.16.36.70 Centos7.pc1
~]# ntpdate 172.16.0.1

~]# yum install nginx
~]# mv /usr/share/nginx/html/index.html{,.bak}
~]# vim /usr/share/nginx/html/index.html
172.16.36.70
~]# systemctl start nginx
使用客戶端IE測試測試頁面,是否正常顯示
~]# yum install keepalived
~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from keepalived_admin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id Centos7.pc2
}
vrrp_script chk_down {
        script "[ -f /etc/keepalived/down ] && exit 1 || exit 0"
        interval 1
        weight -20
}
vrrp_script chk_nginx {
        script "curl -s http://172.16.36.100 | grep 172 &> /dev/null"
        interval 1
        weight -10
}


vrrp_instance VI_1 {
    state BACKUP
    interface eno16777736
    virtual_router_id 100
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 99999999
    }
    virtual_ipaddress {
        172.16.36.100/16 dev eno16777736 label eno16777736:1
    }
    notify_master "/etc/keepalived/keepalived.sh master"
    notify_bakcup "/etc/keepalived/keepalived.sh backup"
    notify_fault "/etc/keepalived/keepalived.sh fault"
    track_script {
        chk_down
        chk_nginx
    }
}
~]# vim /etc/keepalived/keepalived.sh
#!/bin/bash
#author :Magedu
#Description : an example of notify script
contact='root@localhost'

notify() {
    mailsubject="$(hostname) to be $1:vip floating"
    mailbody="$(date +'%F %H:%M:%S'): vrrp transition,$(hostname) change to be $1"
    echo $mailbody | mail -s "$mailsubject" $contact

case $1 in
master)
    notify master
    systemctl start nginx.service
    exit 0
    ;;
backup)
    notify backup
    systemctl restart nginx.service
    exit 0
    ;;
fault)
    notify fault
    systemctl stop nginx.service
    exit 0
    ;;
*)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit
    ;;
esac
keepalived+lvs的配置示例
實驗環境說明:
    VIP : 172.16.100.22(Centos7)
    keepalived主機1 : 172.16.100.67(Centos7)
    keepalived主機2 : 172.16.100.68 (Centos7)
    realserver主機1 : 172.16.100.69 (Centos7)
    realserver主機2 : 172.16.100.6 (Centos6)

實驗目的:
    1 結合keepalive服務對lvs做高可用
    2 實現lvs的dr模型,rr輪循機制訪問後端的realserver
    3 對後端的realserver做健康狀態檢測(基於7層)
    4 將sorry_server放置在前端的keepalived主機,並且對sorry_server做高可用
    5 對keepalived的狀態切換進行郵件通知


######172.16.100.67主機配置(keepalived)
global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from KAadmin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id Centos7.pc1
}
vrrp_script chk_nginx {
        script "curl -s http://172.16.36.70 | grep 172 &> /dev/null"
        interval 1
        weight -20
}

vrrp_instance VI_1 {
        state MASTER
        interface eno16777736
        virtual_router_id 101
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass ZPNnTQ5F
        }
        virtual_ipaddress {
            172.16.100.22
        }
        notify_master "/etc/keepalived/keepalived.sh master"
        notify_backup "/etc/keepalived/keepalived.sh backup"
        notify_fault "/etc/keepalived/keepalived.sh fault"
        track_script {
            chk_nginx
        }
    }
virtual_server 172.16.100.22 80 {
    delay_loog 6
    lb_algo rr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 172.16.100.69 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
    real_server 172.16.100.6 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
}


######172.16.100.68的主機配置(keepalived)
global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from KAadmin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id Centos7.pc2
}
vrrp_script chk_nginx {
        script "curl -s http://172.16.36.70 | grep 172 &> /dev/null"
        interval 1
        weight -20
}
vrrp_instance VI_1 {
        state MASTER
        interface eno16777736
        virtual_router_id 101
        priority 99
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass ZPNnTQ5F
        }
        virtual_ipaddress {
            172.16.100.22
        }
        notify_master "/etc/keepalived/keepalived.sh master"
        notify_backup "/etc/keepalived/keepalived.sh backup"
        notify_fault "/etc/keepalived/keepalived.sh fault"
        track_script {
            chk_nginx
        }
    }
virtual_server 172.16.100.22 80 {
    delay_loog 6
    lb_algo rr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 172.16.100.69 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
    real_server 172.16.100.6 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
}
genhash  -s 172.16.100.69 -p 80 -u index.html : 計算url的MD5值,使用digest參數判斷是否一樣   



######配置real_server
######172.16.100.69
    yum install httpd -y
    vim /var/www/html/index.html
        <h1>rs1</h1>
    vim set.sh
    #!/bin/bash
    #
    iface=$(ifconfig | grep "^[^[:sapce:]]" | awk -F: '/^e/{print $1}')
    vip='172.16.100.22'
    case $1 in
    start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

        echo 1 > /proc/sys/net/ipv4/conf/${iface}/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/${iface}/arp_announce
        ifconfig lo:0 $vip netmask 255.255.255.255 broadcast $vip up
        route add -host $vip dev lo:0
        ;;

    stop)
        ifconfig lo:0 down
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/${iface}/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/${iface}/arp_announce
        ;;
esac
    ./set.sh start
    啓動服務

######172.16.100.6

    vim set.sh
    #!/bin/bash
    #
    iface=$(ifconfig | grep "^[^[:sapce:]]" | awk '/^e/{print $1}')
    vip='172.16.100.22'
    case $1 in
    start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

        echo 1 > /proc/sys/net/ipv4/conf/${iface}/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/${iface}/arp_announce
        ifconfig lo:0 $vip netmask 255.255.255.255 broadcast $vip up
        route add -host $vip dev lo:0
        ;;

    stop)
        ifconfig lo:0 down
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/${iface}/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/${iface}/arp_announce
        ;;
    esac

    ./set.sh start
    yum install httpd -y
    vim /var/www/html/index.html
    <h1>rs2</h1>
    啓動服務


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