Keepalived簡介及安裝

1. 什麼是Keepalived?

    keepalived是一個類似與layer3,4,5交換機制的軟件,也就是我們平時說的第3,4,5層交換.Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工作正常後keepalived自動將web服務器加入到服務器集羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器.

2. Keepalived作用

    負載均衡方案

    高可用性HA

    實現對是小機器/服務的故障隔離

負載均衡器間的失敗切換failover,是通過VRRPv2(Virtual Router Redundancy Protocol) stack實現

3. Keepalived體系結構

    Keepalived大致分爲兩層結構: 用戶空間(User space)和內核空間(kernel space)

spacer.gif

WatchDog    負責監控checkers和VRRP進程的狀況

Checkers        負責真實服務器的健康檢查healthchecking,是Keepalived最主要的功能.換句話說--可以沒有VRRP Stack,但健康檢查healthchecking是一定要有的.

CRRP Stack        負責負載均衡器之間失敗切換FailOver. 如果只用一個負載均衡器,則VRRP不是必須的.

IPVS wrapper        用來發送設定的規則到內核ipvs代碼

Netlink Reflector        用來設定vrrp 的vip地址等

3. Keepalived的安裝

[root@clust1 keepalived-1.2.1]# ln -s /usr/src/kernels/2.6.18-238.el5-i686/ /usr/src/linux  

## 否則 Use IPVS Framework : No

[root@clust1 keepalived-1.2.1]# ./configure --prefix=/opt/keepalived121/

[root@clust1 keepalived-1.2.1]# make

[root@clust1 keepalived-1.2.1]# make install

[root@clust1 keepalived-1.2.1]# cd /opt/keepalived121/

# 設置 service 方式啓動服務

[root@clust1 keepalived121]# mkdir /etc/keepalived

[root@clust1 keepalived121]# cp etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

[root@clust1 keepalived121]# cp etc/sysconfig/keepalived /etc/sysconfig/

[root@clust1 keepalived121]# cp etc/keepalived/keepalived.conf /etc/keepalived/

[root@clust1 keepalived121]# cp sbin/keepalived /usr/sbin/

#啓動進程

[root@clust1 keepalived121]# service keepalived start

Starting keepalived: [ OK ]

[root@clust1 keepalived121]# ps aux | grep keep

root 15417 0.0 0.2 5032 576 ? Ss 19:58 0:00 keepalived -D

root 15418 0.0 0.5 5104 1452 ? S 19:58 0:00 keepalived -D

root 15419 0.0 0.3 5104 972 ? S 19:58 0:00 keepalived -D

Keepalived正常運行時,共啓動3個進程,其中一個進程是父進程,負責監控其子進程,一個是vrrp子進程,另外一個是checkers子進程.

4. Keepalived的配置文件

位置: 

[root@clust1 keepalived121]# cat /etc/keepalived/keepalived.conf 

    Keepalived的所有配置都在一個配置文件裏設置,支持的配置項也比較多,可以分爲三類:

a. 全局配置(Global configuration)  

    就是對整個Keepalived起作用的配置,不管是否使用LVS

b. VRRPD配置

    是Keepalived的核心

c. LVS配置

    只在使用Keepalived來配置和管理LVS時需要使用,如果僅使用Keepalived來做HA,LVS的配置完全是不需要的

    

4.1 全局配置

    全局配置包括兩個子配置: 全局定義(global definition), 靜態地址路由(static ipaddress routes)

A: 全局定義主要設置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 LVS_DEVEL

}

notification_email : 指定Keepalived在發生事件時,需要發送Email到的對象,可以有多個,每行一個

smtp_* : 指定發送email的smtp服務器

route_id : 運行Keepalived的機器的一個標識

B: 靜態地址和路由

    所謂靜態,就是說不會隨vrrpd instance的開/關的變化的,VIP就不是static的,會隨着vrrp而添加/刪除,這個配置可以用來給服務器配置靜態的IP地址/路由

靜態地址和路由的配置結構:

static_ipaddress {

    192.168.1.1/24 brd + dev eth0 scope global

}


static_routes {

    src $SRC_IP to $DST_IP dev $SRC_DEVICE

    .....

    src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE

}

4.2 VRRPD配置

    VRRPD的配置也包括兩個部分: VRRP同步組(synchronization group), VRRP實例(VRRP instance)

A: VRRP同步組

    如果機器或路由有兩個網段,一個內網一個外網,每個網段開啓一個VRRP實例,假設VRRP配置爲檢查內網,那麼外網出現問題時,VRRPD認爲自己仍然健康,那麼不會發送Master和Backup的切換,sync group就是爲了解決這個問題,可以把兩個實例都放進一個sync group. 這樣group裏任何一個實例出現問題都會發生切換.

    VRRP同步組的配置結構:

vrrp_sync_group VG_1 {

 group {

  inside_network

  outside_network

 }

 notify_master /path/to/to_master.sh

 notify_backup /path/to/to_backup.sh

 notify_fault "/path/fault.sh VG_1"

 notify /path/to/notify.sh

 smtp_alert

}

# notify_master : 指定當切換到master時,執行的腳本,這個腳本可以傳入參數

# smtp_alert : 使用global_defs裏面定義的郵件地址和smtp服務器在切換後發送郵件通知


B: VRRP實例

    VRRP實例表示在上面開啓了VRRP協議,這個實例說明了VRRP的一些特性.

    VRRP實例的配置結構:

vrrp_instance VI_1 {

    state MASTER # 實例的初始狀態

    interface eth0 # 實例綁定的網卡

    dont_track_primary # 忽略VRRP的interface錯誤

    lvs_sync_daemon_interface eth0 # 綁定eth0作爲lvs同步的

    track_interface { # 設置額外的監控,裏面的任意一個出現問題,都會進入fault狀態

        eth0

        eth1

    }

    mcast_src_ip <IPADDR> # 發送多播包地址,默認使用綁定的網卡

    garp_master_delay 10 # 在切換到master狀態後,延遲進行gratuitous ARP請求

    virtual_router_id 51 # VRID標記

    priority 100 # 高優先級競選爲master,至少高backup 50

    advert_int 1 # 檢查間隔

    authentication { # 設置驗證

        auth_type PASS # 認證方式,支持PASS和AH

        auth_pass 1111 # 認證的密碼

    }

    virtual_ipaddress {   # 虛擬IP

        # <IPADDR>/<MASK>brd<IPADDR>dev<STRING>scope<SCOPT>label<LABEL>

        192.168.200.16

        192.168.200.17

        192.168.200.18

    }

}

C: 檢查服務是否正常配置:

vrrp_script chk_http_port {

    script "killall -0 httpd"  #檢查httpd服務是否正常

    # script "/tcp/127.0.0.1/80"

    interval 1  #檢查時間間隔

}

使用:

在vrrp_instance裏面

track_script {

    chk_http_port

}

4.3 LVS配置

    LVS的配置有兩個部分: 虛擬主機組(virtual server group), 虛擬主機(virtual server)

A: 虛擬主機組

    可選的,目的是爲了讓一臺RealServer上的某個service可以屬於多個virtual server並且只做一次健康檢查

virtual_server_group <STRING> {

 # VIP port

 <IPADDR> <PORT>

 <IPADDR> <PORT>

 .....

 fwmark <INT>

}

B: 虛擬主機   --虛擬服務器定義部分

    

virtual_server 10.10.10.3 1358 { # 設置虛擬服務器,需要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開

    delay_loop 3 # 設置健康檢查時間,單位是秒

    lb_algo rr # 設置負載調度算法

    lb_kind NAT # 設置LVS實現負載均衡的機制,可以有NAT,TUN和DR三個模式

    nat_mask 255.255.255.0

    persistence_timeout 50 # 會話保持時間,單位的秒

    protocol TCP # 指定轉發協議類型,有tcp和udp兩種

    sorry_server <IPADDR> <PORT> # 備機IP端口,所有的real server失效後啓用

    # 節點服務器配置部分

    real_server 192.168.200.4 1358 { # 配置服務節點,需要指定real server的真實IP地址和端口,ip與端口之間用空格隔開

        weight 1 # 配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,

                       # 設置權值的大小可以爲不同性能的服務器分配不同的負載,

                       # 可以對性能高的服務器設置較高的權值,而對性能較低的服務器設置相對較低的權值

                       # 這樣就合理的利用和分配了系統資源

        inhibit_on_failure # 健康檢查失敗後,將weight設置爲0,不從IPVS裏面刪除

        TCP_CHECK { # realserver的狀態檢查設置部分,單位是秒

             connect_timeout 10 # 10秒無響應超時

             nb_get_retry 3 # 重試次數

             delay_before_retry 3 # 重試間隔

        }

        HTTP_GET {

            url {

              path /testurl/test.jsp

              digest 640205b7b0fc66c1ea91c463fac6334d

            }

            url {

              path /testurl2/test.jsp

              digest 640205b7b0fc66c1ea91c463fac6334d

            }

            url {

              path /testurl3/test.jsp

              digest 640205b7b0fc66c1ea91c463fac6334d

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}

5. 測試

spacer.gif

clust3 -> keepalived.conf

[root@clust3 keepalived-1.2.1]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id Haweb_1

}

vrrp_sync_group VGM {

    group {

        VI_HA

    }

}

vrrp_instance VI_HA {

    state MASTER

    interface eth1

    lvs_sync_daemon_interface eth1

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.98.155/24 dev eth1

    }

}

clust4 -> keepalived.conf

[root@clust4 keepalived-1.2.1]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id Haweb_1

}

vrrp_sync_group VGM {

    group {

        VI_HA

    }

}

vrrp_instance VI_HA {

    state BACKUP

    interface eth1

    lvs_sync_daemon_interface eth1

    virtual_router_id 51

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.98.155/24 dev eth1

    }

}

# 查看日誌輸出

[root@clust4 keepalived-1.2.1]# tail -f /var/log/messages  

# stop master/backup查看IP地址變化

[root@clust4 keepalived-1.2.1]# ip a

# cluster3 -> service keepalived stop

# 瀏覽器輸入 192.168.98.155 看現實的哪臺服務器的頁面內容

# cluster3 -> service keepalived start

# 瀏覽器輸入 192.168.98.155 看現實的哪臺服務器的頁面內容

問題:

1. Keepalived搶佔問題如何優化?

    兩臺服務器組成高可用集羣,分別處於Master和Backup狀態,當Master出現故障時由Backup來接管所有任務,那麼當Master恢復時,Master會搶回所有權.雖然是高可用,但是對客戶來說,來回的切換是比較煩惱的事.

    解決: 可將兩服務器均設置成backup狀態是因爲 nopreempt(不搶佔)只支持backup模式,而讓那一臺成爲master,這個由優先級priority來決定


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