keepalived
HA的解決方案的兩大流派分爲heartbeat、corosync和keepalived
keepalived在誕生時被賦予的使命僅僅是爲lvs的director的HA、生成ipvs規則和監控後端主機的健康狀況
keepalived是可以模擬並以進程的方式實現vrrp協議,並以此協議進行工作的HA解決方案
vrrp:虛擬冗餘路由協議
vrrp的工作方式:將兩個或兩個以上的物理路由設備定義成一個虛擬的路由器,這種方式稱作爲一個路由組,這組路由設備共同構建成爲一個虛擬的路由,在此路由上配置一個VIP和與此VIP相對應的VMAC,在此路由組中,每個路由器都有自己的優先級,當路由器開啓時都會自我初始化,然後發送廣播通告路由組中的所有路由器自己的優先級,以此推選出主節點MASTER和備用節點BACKUP級別的路由器,只有當主節點故障或優先級降低時纔會通告其他節點,然後其他節點再次通過比較優先級推選出另外一個主節點,另外一個主節點會去奪取之前主節點的IP地址等信息
在keepalived中有三種節點類型:
MASTER:主節點類型
BACKUP:備用節點類型
Initialized:表初始化
下面是keepalived的常用案例:
案例環境:
主節點:172.16.25.1
從節點:172.16.25.2
先在兩臺節點上安裝keepalived程序包
這裏使用yum的方式安裝
#yum install keepalived
兩臺主機都安裝完以後,開始我們的案例
1、先做簡單的主從節點
主節點配置:
編輯keepalived的配置文件,在編輯之前先將此文件備份,以免以後使用 [root@localhost keepalived]# vim keepalived.conf 在此文件中暫時沒用的信息都刪除,然後開始定義所需的配置,這裏我們開始直接進行定義 vrrp_instance VI_1 { state MASTER //表示設置此主機的節點信息爲主節點 interface eth0 //表示使用eth0網卡 virtual_router_id 51 //默認的id號 priority 100 //優先級爲100 advert_int 1 //表示發送自己在線信息,兩節點的時間必須一樣 authentication { //表示設置認證方式 auth_type PASS auth_pass 1111 } virtual_ipaddress { //表示設置一個虛擬的IP地址 172.16.25.30 } }
從節點配置:
編輯keepalived的配置文件 [root@localhost keepalived]# vim keepalived.conf 在此文件中暫時沒用的信息都刪除,然後開始定義所需的配置,這裏我們開始直接進行定義 vrrp_instance VI_1 { state BACKUP //表示設置此主機的節點信息爲備節點 interface eth0 //表示使用eth0網卡 virtual_router_id 51 //默認的id號 priority 99 //優先級爲99 advert_int 1 //表示發送自己在線信息,兩節點的時間必須一樣 authentication { //表示設置認證方式 auth_type PASS auth_pass 1111 } virtual_ipaddress { //表示設置一個虛擬的IP地址 172.16.25.30 } }
這樣兩節點的主備配置就已完成,然後啓動服務,就可以測試了 [root@localhost keepalived]# service keepalived restart 啓動完以後,將主節點的服務停掉,然後查看備節點的情況 [root@localhost keepalived]# service keepalived stop 然後在備節點使用ip addr show查看剛纔設定的IP是否已經從主節點上獲取到備節點上;從中可以看出備節點上已經得到了IP [root@localhost keepalived]# ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:62:4d:37 brd ff:ff:ff:ff:ff:ff inet 172.16.25.2/16 brd 172.16.255.255 scope global eth0 inet 172.16.25.30/32 scope global eth0 如果再把主節點啓動起來的話,因爲主節點的優先級大於從節點,主節點就會把IP奪回自己的主機
2、雙主模型
只需要在兩臺主機的剛纔的配置文件中再添加配置定義信息即可
在主節點配置:
[root@localhost keepalived]# vim keepalived.conf vrrp_instance VI_2 { //改下次名稱 state BACKUP interface eth0 virtual_router_id 61 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { //設置第二個虛擬IP爲60 172.16.25.60 } }
在從節點配置:
vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 61 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.25.60 } }
配置完以後將兩主機的服務都重新啓動,然後都使用ip addr show命令查看配置結果
會發現在主節點上會得出172.16.25.30的IP地址;而在從節點上會看出有172.16.25.60的IP地址
2、使用自定義腳本監控設定當主節點所設定的服務出現問題時自動切換到備用節點
在/usr/share/doc/keepalived-1.2.7/目錄下有一個名叫keepalived.conf.vrrp.localcheck的文件,裏面存放有運行實例
定義檢測腳本:
使用單獨的配置段定義檢測機制
vrrp_script CHK_NAME { script "/path/to/somefile.sh" //檢測的方式 interval # //表示檢測的間隔時間,單位爲秒鐘 weight -5 //表示當檢測失敗時,此主機的優先級減去5 fall 3 //表示當檢測失敗時,再檢測3次 rise 1 // 從正常到失敗要檢測幾次,一般來說1次即可 定義完成以後,要在實例調用定義的檢測機制,才能生效 vrrp_instance NAME { track_script { CHK_NAME } }
使用示例:
主節點配置:
在兩節點上都安裝nginx程序,保證nginx運行無誤後,配置keepalived
編輯配置文件,在global_defs下面定義內容 vrrp_script chk_nginx { script "killall -0 nginx" //表示檢測此進程是否運行,killall -0 nginx表示此進程的是否運行,使用此命令不會打印到屏幕信息,使用echo $?查看狀態返回值 interval 1 //檢測間隔時間爲1秒 weight -5 //檢測失敗時優先級減5 fall 2 //檢測失敗時再檢測2次 rise 1 //從正常到失敗要檢測1次 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.25.30 } track_script { //調用定義機制 chk_nginx } notify_master "/etc/rc.d/init.d/nginx start" //調用信息 notify_backup "/etc/rc.d/init.d/nginx stop" notify_fault "/etc/rc.d/init.d/nginx stop" }
備用節點配置:
! 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 LVS_DEVEL } vrrp_script chk_nginx { script "killall -0 nginx" interval 1 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.25.30 } track_script { chk_nginx } notify_master "/etc/rc.d/init.d/nginx start" notify_backup "/etc/rc.d/init.d/nginx stop" notify_fault "/etc/rc.d/init.d/nginx stop" } 兩節點都配置完後,便可進行測試。爲了讓測試結果更加信息,可以把主從節點的nginx的主頁設置不同,以便區分,然後關閉兩個節點的其中一個,再使用瀏覽器訪問虛擬IP,查看得到的結果,這裏測試步驟不在做演示。 vrrp_script chk_sched_down { //表示當需要自己手動調試keepalived,可使用此方法 script "[ -e /etc/keepalived/down ] && exit 1 || exit 0 " //表示當此文件存在時便顯示失敗,不存在則顯示成功 interval 2 //失敗後檢查2秒 weight -50 //優先級減50 fall 2 //檢測失敗時再檢測2次 rise 1 //從正常到失敗要檢測1次 }
然後在使用track_script調用定義便可,然後再從節點配置相同內容;配置完成後查看配置結果,然後再/etc/keepalived/下創建一個down文件,便發現在此節點上的keepalived下線了。
3、使用DR模型構建一個real_server
172.16.25.1:主節點
172.16.25.2:備節點
172.16.25.3:real_server
172.16.25.3配置
創建一個目錄 [root@www ~]# mkdir -pv /web/htdocs/a 並添加一個頁面文件 [root@www ~]# vim /web/htdocs/a/index.html 配置httpd的主配置文件 [root@www ~]# vim /etc/httpd/conf/httpd.conf <VirtualHost *:80> DocumentRoot /web/htdocs/a ServerName www1.how.com </VirtualHost> 更改內核信息 [root@www ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@www ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore [root@www ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce [root@www ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 設置路由[root@www ~]# ifconfig lo:0 172.16.25.30 netmask 255.255.255.255 broadcast 172.16.25.30 up [root@www ~]# route add -host 172.16.25.30 dev lo:0
172.16.25.1配置
將之前配置的文件刪除,並複製最開始的配置文件 [root@localhost keepalived]# cp keepalived.bak keepalived.conf 配置此文件[root@localhost keepalived]# vim keepalived.conf vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.25.30 } } virtual_server 172.16.25.30 80 { delay_loop 6 lb_algo rr lb_kind NAT nat_mask 255.255.0.0 protocol TCP real_server 172.16.25.3 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 2 nb_get_retry 3 delay_before_retry 1 } } } 安裝ipvsadm [root@localhost keepalived]# yum install ipvsadm [root@localhost keepalived]# ipvsadm -L -n
172.16.25.2配置
[root@localhost keepalived]# cp keepalived.bak keepalived.conf [root@localhost keepalived]# vim keepalived.conf vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.25.30 } } virtual_server 172.16.25.30 80 { delay_loop 6 lb_algo rr lb_kind NAT nat_mask 255.255.0.0 protocol TCP real_server 172.16.25.3 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 2 nb_get_retry 3 delay_before_retry 1 } } } 配置完後主備節點都重啓keepalived服務 [root@localhost keepalived]# service keepalived restart
配置完使用瀏覽器查訪問虛擬IP地址,可看到已經得到了172.16.25.3的http頁面