2012年6月27日 星期三

Redis + Keepalived Failover System


  

搞redis很久了, 但卻一直沒等到redis的Cluster, 只好自力救濟, 搞搞自動Failover ...

各系統版本號


  • Centos 5.4
  • Keepalived 1.2.2
  • redis 2.4.15
  系統架構啟發來自Youtube的一個影片 , 想參考的是可以加減看看啦, 但影片中有很多問題!

  1. 沒有字幕
  2. 口白不是英文, 本人完全聽不懂(因作者是西班牙籍, 猜想是西班牙語 )
  3. 字跡非常潦草, 還不斷塗塗改改修正
  4. 更慘的是裡面錯誤很多 (白板上的和視窗內的資料常常對不起來, 還常下錯指令, 奇怪咧為何不重錄? )
  雖然這影片有如此多缺陷, 但至少給了個起點與方向. google了一大堆內容, 自己也try了好幾天 ! 透過不斷得嘗試與找路, 終於陸續找到可行的方法, 而終於搞定了!

  既然找到可行方法了, 就留個紀錄吧, 未來自己可能再用上, 也希望對看到此文的人有點幫助, 少花點時間走冤枉路....

重點:

      先搞定Keepalived !

目的:

      因為主要是要作redis系統的Failover, 所以我挑選的Keepalived模式為Virtual Router Redundancy Protocol (VRRP) 運作模式. ( 抱歉. 後面也不會解釋VRRP, 不清楚的請自行找資料. )

環境:

       有兩台Server 各有自己的IP
           Centos 1 : 10.10.6.156   預設角色為Master server
           Centos 2 : 10.10.6.159   預設角色為Backup server
       想對外有個共同的服務窗口
           Virtual Ip Address (VIP) 10.10.6.200

運作模式:

       當 Centos 1, Centos 2運作正常時, Centos 1負責服務, Centos 2則閒置Standby, 只要Centos 1 沒掛掉, Master不會換人當, 若此時 Master身份的 Centos 1 掛了, Centos 2 則立即扛起Master的責任, 對外提供服務. 即使後來 Centos 1 復原了, Master 仍舊由Centos 2擔當, 直到下次Master掛掉為止. 至於外部使用者, 則不需考慮這麼多, 因為都是使用 VIP 來使用服務, 只要至少有一台活著, 服務就不會中斷...
     

安裝 Keepalived

下載

            請至Keepalived官網 http://www.keepalived.org/下載, 此時最新版本為 1.2.2
        Keepalived for Linux Virtual Server - Version 1.2.2 - January 16, 2011
   

安裝

             解壓縮 tar -xvf  keepalived-1.2.2.tar.gz
             進入目錄 
             開始設定 ./configure
             若出現以下內容  


Keepalived configuration

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

Keepalived version       : 1.2.2

Compiler                 : gcc

Compiler flags           : -g -O2 -DETHERTYPE_IPV6=0x86dd

Extra Lib                : -lpopt -lssl -lcrypto 
Use IPVS Framework       : No
IPVS sync daemon support : No
Use VRRP Framework       : Yes
Use Debug flags          : No

              這是有問題的, 需另外指定kernel目錄 (目錄請自行調整 )
              ./configure --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-x86_64/ 
              出現以下內容, 才能算勉強過關 ( 我曾試著安裝libnl 但發現非必要, Debug flags 對於找問題, 也沒有什麼用處, 看/var/log/messages比較實際些 )


Keepalived configuration

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

Keepalived version       : 1.2.2

Compiler                 : gcc

Compiler flags           : -g -O2 -DETHERTYPE_IPV6=0x86dd

Extra Lib                : -lpopt -lssl -lcrypto 
Use IPVS Framework       : Yes
IPVS sync daemon support : Yes
IPVS use libnl           : No
Use VRRP Framework       : Yes
Use Debug flags          : No

             編譯 make
             安裝編譯 make install

             以上安裝完成後, 我沒去多花時間設定init.d等開機啟動設定, 因為應該先搞定設定檔, 等能正常運作再說 ...             
          

    設定 Keepalived         
        這是重頭戲 !! 預設的keepalived.conf存放於 /etc/keepalived 目錄中




        先看 Centos 1 的 keepalived.conf(預設角色Master) 
             

! Configuration File for keepalived

global_defs {
   notification_email {
     youremail@abc.com.tw
   }
   notification_email_from youremail@abc.com.tw
   smtp_server  smtp.server.com.tw
   smtp_connect_timeout 30
   router_id Centos1  #這個是可以改的 建議和Hostname一致 收到信件時方便辨識
}

vrrp_instance VI_Redis {
    state MASTER
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 10
    priority 101
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.6.200
    }
}


        再來看 Centos 2 的 keepalived.conf(預設角色Backup)

! Configuration File for keepalived

global_defs {
   notification_email {
     youremail@abc.com.tw
   }
   notification_email_from youremail@abc.com.tw
   smtp_server  smtp.server.com.tw
   smtp_connect_timeout 30
   router_id Centos2  #這個是可以改的 建議和Hostname一致 收到信件時方便辨識
}

vrrp_instance VI_Redis {
    state BACKUP
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 10
    priority 100
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.6.200
    }
}

        有幾個重點, vrrp_instance名字必須相同, Master的priority必須比BACKUP的高...

         檔案配置好後, 即可開始啟動 Keepalived 進行測試 !

測試 Keepalived           


         因暫時沒其他的服務 可先用ping 測試 VIP  運作效果
         ping 10.10.6.200          
         然後 各自在Centos 1 與 Centos 2觀察 /var/log/messages
         tail -f /var/log/messages
         此時因為 Master 與 Backup 服務都還沒啟動  ping 應該會是失敗的
         先在 Centos 1 啟動 keepalived 
         因為有服務了 ping 將開始有正常回應 
         接著在 Centos 2 啟動 keepalived  
         ping 也該是正常回應 
         
         此時重點來了, 除了看messages的log, 誰知道Master是哪一台? 擁有VIP的? 使用ifconfig 是沒用的,看不到 VIP 的資料, 請改用 ip addr 的指令

[root@Centos2 redis]# ip addr
1: lo: mtu 16436 qdisc noqueue 
    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: mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 08:00:27:ff:3f:20 brd ff:ff:ff:ff:ff:ff
    inet 10.10.6.159/24 brd 10.10.6.255 scope global eth0
    inet 10.10.6.200/32 scope global eth0
    inet6 fe80::a00:27ff:feff:3f20/64 scope link 
       valid_lft forever preferred_lft forever
3: sit0: mtu 1480 qdisc noop 
    link/sit 0.0.0.0 brd 0.0.0.0

         哪台Server有多上面標示藍色的那一行, 就表示是在Master狀態 ....

         但是運氣背時會發現兩台統統都處於Master狀態, 恭喜你, 我也遇到了! 這問題花了我不少時間找答案, 解法卻很簡單... 

         請試著關閉Centos的預設Firewall. 運作就會正常了, 因為Master/Backup無法互相溝通, 所以Backup Server 也自己宣佈接手成為Master !!  ( 有誰願意幫忙找找Keepalived是用哪個Port來互相溝通的 ? )
         
         進一步測試可用下方指令把Master或Backup Server的 keepalived 程序砍掉
         killall keepalived 
         再使用ip addr來確認 Master是由哪台Server負責?
         是否整個切換運作順暢?
         ping VIP是否能持續正常服務?

         若以上的測試能如預期的正常運作, 後續的就簡單多了 !



進階配置 Keepalived


客製化的檢查方法


             剛剛的Master/Backup的切換是透過檢查Keepalived程序是否存活來做判斷, 但這不是我要的, 也不會是大多的人需要的. 所以要改變Keepalived的檢查程序, 讓它改成監控我們指定的程序或服務, 依照指定的程序或服務的健康狀況, 來作Master/Backup的切換!

             先看以下的shell script, 這是監控Redis獨有的, 但程序很簡單. 有需要的可以自己改寫成監控其他系統的程式.

[root@Centos1 redis]# more redis_check.sh 
#!/bin/sh
alive=`/usr/local/redis/redis-cli PING`
if [ "$alive" == "PONG" ]; then
  echo "OK"
  exit 0
fi
  #echo "$alive"
  echo "NG"
  exit 1

             正常的 redis Server會對PING的指令, 回覆PONG的文字, 就像字義的乒乓球一樣. 可用來判斷伺服器是否運作正常. 當運作正常時, 整個檢查程序執行後的回覆碼應該為0 . 異常時則回覆非零值.

            當此檔案編輯完成, 有個容易疏忽的動作就是要chmod, 一定要設定!! 讓此shell script能正確被執行(包含權限), 後續提到的shell script請也一併要做好設定!

            所以 更新後的 Centos 1 的 keepalived.conf(預設角色Master) 為


[root@CentosVBox1 redis]# more /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     youremail@abc.com.tw
   }
   notification_email_from youremail@abc.com.tw
   smtp_server  smtp.server.com.tw
   smtp_connect_timeout 30
   router_id Centos1  #這個是可以改的 建議和Hostname一致 收到信件時方便辨識
}

vrrp_script chk_redis {
    script "/etc/keepalived/redis/redis_check.sh"
    interval 1 
}

vrrp_instance VI_Redis {
    state MASTER
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 10
    priority 101
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.6.200
    }
    track_script {
        chk_redis 
    }
    notify_master /etc/keepalived/redis/master.sh
    notify_backup /etc/keepalived/redis/backup.sh
    notify_fault  /etc/keepalived/redis/fault.sh
    #notify
    notify_stop   /etc/keepalived/redis/stop.sh
}


            新加了 vrrp_script 區塊, 並透過 track_script 指定運行. ( 紅色區塊有關notify等 後續會解說 )

            在這邊提醒一點, 據網路上的說法 track_script 後面要加一個空白才能接著 "{" , 否則檢查程序會有運作不正常的狀態. 有空的朋友可以自己試試..

            有些文章會在 vrrp_script 區塊中加入weight, 但我試了很多次, 都沒成功切換. 後來看了這篇文章, 才試著去除weight, 採行強迫Keepalived只要檢查出錯誤就立即切換的方法. 不必再花力氣解開weight與priority間的數學問題!

            再來也一併更新 Centos 2 的 keepalived.conf(預設Backup) 

! Configuration File for keepalived

global_defs {
   notification_email {
     youremail@abc.com.tw
   }
   notification_email_from youremail@abc.com.tw
   smtp_server  smtp.server.com.tw
   smtp_connect_timeout 30
   router_id Centos2  #這個是可以改的 建議和Hostname一致 收到信件時方便辨識
}

vrrp_script chk_redis {
    script "/etc/keepalived/redis/redis_check.sh"
    interval 1 
}

vrrp_instance VI_Redis {
    state BACKUP
    debug
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 10
    priority 100
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.6.200
    }
    track_script {
        chk_redis 
    }
    notify_master /etc/keepalived/redis/master.sh
    notify_backup /etc/keepalived/redis/backup.sh
    notify_fault  /etc/keepalived/redis/fault.sh
    #notify
    notify_stop   /etc/keepalived/redis/stop.sh

}

redis的配置


         本文重點不是擺在redis的一般配置, 所以細節就不多說. 只專注於redis的 Master/Slave設定部份.

         Centos 1 的 redis.conf(預設角色Master) 

################################# REPLICATION #################################

# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. Note that the configuration is local to the slave
# so for example it is possible to configure the slave to save the DB with a
# different interval, or to listen to another port, and so on.
#
# slaveof


         Centos 2 的 redis.conf(預設角色Backup/Slave) 

################################# REPLICATION #################################

# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. Note that the configuration is local to the slave
# so for example it is possible to configure the slave to save the DB with a
# different interval, or to listen to another port, and so on.
#
# slaveof
slaveof 10.10.6.156 6379


初步測試redis與Keepalived 合體


         這次因為加入了監控redis的script 所以一定要先啟動redis
         依照往例在各系統還沒啟動前,先用redis-cli 測試 Redis VIP  運作效果, 執行下述指令 
         redis-cli  -h 10.10.6.200 info
         這時自然該得到連線失敗的訊息.
         先在 Centos 1 啟動 redis , 然後是 Centos 2 的 redis, 在後來是Centos 1的Keepalived 
         因為Keepalived啟動了, VIP開始運作,  redis-cli 將開始有正常回應 
         接著在 Centos 2 啟動 keepalived, redis-cli  也該是正常回應 

         此時兩套redis與Keepalived應該都是在運作正常的狀態, redis-cli  -h 10.10.6.200 info 看到的內容應該是 Centos1作為Master負責回應, 上面的redis Server也是Master 所以可以看到類似下面的回應.


role:master

slave0:10.10.6.159,57424,online


         若把Centos1 的 redis-server 停掉, 將導致 keepalived檢查發現異常, 進一步使得Centos1失去Master地位, Centos1的狀態將退至Fault, 在此同時 Centos2會由Backup地位扶正為Master!
         此時redis-cli  -h 10.10.6.200 info 看到的內容應該是 Centos2作為Master負責回應, 但運行的redis Server此仍是Slave 所以可以看到類似下面的回應.


role:slave

master_host:10.10.6.156

master_port:6379

master_link_status:down

master_last_io_seconds_ago:-1

master_sync_in_progress:0
master_link_down_since_seconds:17

         雖說測試到現在的階段, 這樣的運作結果對Keepalived是正確的. 但對redis來說卻還差一點.因為這個版本redis的Master與Slave只有單向複製的關係. 也就是redis Server的Master收到新資料時會把新資料的更新內容傳送給Slave一併更新, 可是換成Slave收到新資料時卻無法傳送給Master. 將會導致資料的不一致性! 也就是說為了資料的一致性, Slave最好只做ReadOnly的角色或當成備用機. 

         所以恰當的配置是當某一Server被Keepalived指定為Master時, VIP會由此Server負責,此台的redis Server應當要切換為Master, 同時另一Backup身份的Server則該設定為redis的Slave, 做好接收異動抄寫的任務, 隨時 Standby. 

進一步調整讓redis的Master/Slave配合Keepalived的Master/Backup切換

        在上面的keepalived.conf設定中有個紅色區塊的內容就是運作關鍵, 因為Keepalived在轉換狀態時會依照狀態來呼叫. 

        當進入Master狀態時會呼叫notify_master
        當進入Backup狀態時會呼叫notify_backup
        當發現異常時進入FAULT狀態時將呼叫notify_fault
        當Keepalived程式終止時則呼叫notify_stop

    notify_master /etc/keepalived/redis/master.sh
    notify_backup /etc/keepalived/redis/backup.sh
    notify_fault  /etc/keepalived/redis/fault.sh
    notify_stop   /etc/keepalived/redis/stop.sh

        我們先來看 Centos 1 的 master.sh 


[root@Centos1 redis]# more master.sh 

#!/bin/sh

KLOG=/var/log/keepalived-state.log

RLOG=/var/log/redis-state.log

echo "[master]" >> $KLOG

date >> $KLOG
echo "----------" >> $KLOG

echo "[master]" >> $RLOG
date >> $RLOG
echo "being master...." >> $RLOG 2>&1
echo " run slaveof cmd ..." >> $RLOG
echo SLAVEOF 10.10.6.159 6379 | /usr/local/redis/redis-cli >>$RLOG  2>&1
sleep 1
echo " run sync cmd ..." >> $RLOG
echo SYNC | /usr/local/redis/redis-cli >>$RLOG 2>&1
sleep 1
echo " run slaveof no one cmd ..." >> $RLOG
echo SLAVEOF NO ONE | /usr/local/redis/redis-cli >>$RLOG 2>&1

        整體概念先是假設從Slave模式轉換到Master時, 先要指定為Slave, 把資料抄回來, 再回復為Master.

        再來是 Centos 1 的 backup.sh 


[root@Centos1 redis]# more backup.sh 

#!/bin/sh

KLOG=/var/log/keepalived-state.log

RLOG=/var/log/redis-state.log

echo "[backup]" >> $KLOG

date >> $KLOG
echo "----------" >> $KLOG

echo "[backup]" >> $RLOG
date >> $RLOG
echo "being slave...." >> $RLOG 2>&1
echo " run slaveof cmd ..." >> $RLOG
echo SLAVEOF 10.10.6.159 6379 | /usr/local/redis/redis-cli >>$RLOG  2>&1
echo " run sync cmd ..." >> $RLOG
echo SYNC | /usr/local/redis/redis-cli >> $RLOG 2>&1 

        大致內容是直接設定為Slave模式並要求資料抄寫


        再來看 Centos 2 的 master.sh  


[root@Centos2 redis]# more master.sh 

#!/bin/sh

KLOG=/var/log/keepalived-state.log

RLOG=/var/log/redis-state.log

echo "[master]" >> $KLOG

date >> $KLOG
echo "----------" >> $KLOG

echo "[master]" >> $RLOG
date >> $RLOG
echo "being master...." >> $RLOG 2>&1
echo " run slaveof cmd ..." >> $RLOG
echo SLAVEOF 10.10.6.156 6379 | /usr/local/redis/redis-cli >>$RLOG  2>&1
sleep 1
echo " run sync cmd ..." >> $RLOG
echo SYNC | /usr/local/redis/redis-cli >>$RLOG 2>&1
sleep 1
echo " run slaveof no one cmd ..." >> $RLOG
echo SLAVEOF NO ONE | /usr/local/redis/redis-cli >>$RLOG 2>&1

        再來是 Centos 2 的 backup.sh 


[root@Centos2 redis]# more backup.sh 

#!/bin/sh

KLOG=/var/log/keepalived-state.log

RLOG=/var/log/redis-state.log

echo "[backup]" >> $KLOG

date >> $KLOG
echo "----------" >> $KLOG

echo "[backup]" >> $RLOG
date >> $RLOG
sleep 10
echo "being slave...." >> $RLOG 2>&1
echo " run slaveof cmd ..." >> $RLOG
echo SLAVEOF 10.10.6.156 6379 | /usr/local/redis/redis-cli >>$RLOG  2>&1
echo " run sync cmd ..." >> $RLOG
echo SYNC | /usr/local/redis/redis-cli >> $RLOG 2>&1 

        Centos2的master.sh與backup.sh類同Centos1, 但只是方向相反!

        最後是 fault.sh 與 stop.sh, 因為只單純做log紀錄 所以兩台Server的script都是一樣的.

[root@Centos1 redis]# more fault.sh 
#!/bin/sh

KLOG=/var/log/keepalived-state.log
echo "[fault]" >> $KLOG
date >> $KLOG
echo "----------" >> $KLOG


[root@CentosV1 redis]# more stop.sh 
#!/bin/sh

KLOG=/var/log/keepalived-state.log
echo "[stop]" >> $KLOG
date >> $KLOG
echo "----------" >> $KLOG

         

最終測試redis與Keepalived 合體


         依照往例在各系統還沒啟動前,先用redis-cli 測試 Redis VIP 運作效果, 執行下述指令 
         redis-cli  -h 10.10.6.200 info
         這時自然該得到連線失敗的訊息.
         先在 Centos 1 啟動 redis , 然後是 Centos 2 的 redis, 在後來是Centos 1的Keepalived 
         因為Keepalived啟動了, VIP開始運作,  redis-cli 將開始有正常回應 
         接著在 Centos 2 啟動 keepalived, redis-cli  也該是正常回應 

         此時兩套redis與Keepalived應該都是在運作正常的狀態, redis-cli  -h 10.10.6.200 info 看到的內容應該是 Centos1作為Master負責回應, 上面的redis Server也是Master 所以可以看到類似下面的回應.


role:master
slave0:10.10.6.159,41920,online



此時試著存取redis


patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 set "hello" "abc"
OK


patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 get "hello"
"abc"


patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.156 get "hello"  
"abc"


patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.159 get "hello"
"abc"



         不論是VIP (10.10.6.200), Centos1 (10.10.6.156) 還是 Centos2 (10.10.6.159)都完整取得新資料了. 也就是透過VIP存取, 兩台Server間都正確的複製內容資訊!

把Centos1的redis弄掛試試看

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 debug segfault
I/O error while reading from socket: Success


patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 info
redis_version:2.4.15
.... (刪除過多無用資訊, 只節錄重點 )
role:master

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.156 info
Could not connect to Redis at 10.10.6.156:6379: connect: Connection refused

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.159 info
redis_version:2.4.15
.... (刪除過多無用資訊, 只節錄重點 )
role:master

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 set "hello" "efg"
OK

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 get "hello" 
"efg"

         可以看到即使是Centos1掛了!若透過VIP來存取, 還是可以維持正常運作, 這就是我們希望Keepalived達成的Failover效果!(中間檢測與切換可能有一兩秒的延遲), 透過指令可看到Centos1已經無法回應,Keepalived, 此時Centos2除了在Keepalived中取得Master地位, 也一併在redis中取得了Master的身份!!

假設經過一段時間Centos1的redis救回,能正常運作了,那會如何?

         於重啟動Centos1的redis 服務後

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 info
redis_version:2.4.15
.... (刪除過多無用資訊, 只節錄重點 )
role:master
slave0:10.10.6.156,48910,online

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.156 info
redis_version:2.4.15
.... (刪除過多無用資訊, 只節錄重點 )
role:slave
master_host:10.10.6.159
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.159 info
redis_version:2.4.15
.... (刪除過多無用資訊, 只節錄重點 )
role:master
slave0:10.10.6.156,48910,online

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 get "hello" 
"efg"
patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.156 get "hello" 
"efg"
patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.159 get "hello" 
"efg"

         可以看到即使是Centos1的redis已回復正常運作但Keepalived仍視為Backup身份, 並不會立即把Master身份搶回來, 同時Centos1上的redis也被設定為是Cenots2的Slave
         就資料更新方面, 剛剛在Centos1故障期間設定的"hello","efg" 資訊, 也在Centos1正常運作後無誤的同步過來了!


         透過Centos1的/var/log/keepalived-state.log可以看到整個狀態轉換的完整過程

[master]
Wed Jun 27 18:29:08 CST 2012
----------
[fault]
Wed Jun 27 18:35:43 CST 2012
----------
[backup]
Wed Jun 27 18:44:11 CST 2012
----------

         再看看Centos2的/var/log/keepalived-state.log


[backup]

Wed Jun 27 18:29:11 CST 2012

----------

[master]

Wed Jun 27 18:35:47 CST 2012

----------

         到此算是完成了. 雖然還有很多不完美的地方, 但至少運作還算如預期 !

         有興趣的朋友請告知後再轉載, 但一定要註明出處. 當發現錯誤或有建議請留言或發信告知, 謝謝 !!

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

2012/7/20補充

         Keepalived 2012/7/13推出新版了, 新的版本為1.2.3, 但此版本不能在Centos5或Kernel版本低於2.6.29的系統下完成make編譯!! 會出現以下錯誤訊息 ....


vrrp_vmac.c: In function ‘netlink_link_setmode’:
vrrp_vmac.c:85: error: ‘IFLA_LINKINFO’ undeclared (first use in this function)
vrrp_vmac.c:85: error: (Each undeclared identifier is reported only once
vrrp_vmac.c:85: error: for each function it appears in.)
vrrp_vmac.c:86: error: ‘IFLA_INFO_KIND’ undeclared (first use in this function)
vrrp_vmac.c:90: error: ‘IFLA_INFO_DATA’ undeclared (first use in this function)
vrrp_vmac.c:96: error: ‘IFLA_MACVLAN_MODE’ undeclared (first use in this function)
vrrp_vmac.c:97: error: ‘MACVLAN_MODE_PRIVATE’ undeclared (first use in this function)
vrrp_vmac.c: In function ‘netlink_link_add_vmac’:
vrrp_vmac.c:160: error: ‘IFLA_LINKINFO’ undeclared (first use in this function)
vrrp_vmac.c:161: error: ‘IFLA_INFO_KIND’ undeclared (first use in this function)
make[2]: *** [vrrp_vmac.o] Error 1

         看來keepalived 1.2.3版只能安裝在Centos6.x上了 !! 

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

2012/7/24補充

         Keepalived 版本為1.2.3, 於Centos6.3, Kernel版本2.6.32-279下make編譯!! 仍會出現以下錯誤訊息 ....


make[2]: Entering directory `/root/keepalived-1.2.3/keepalived/libipvs-2.6'
gcc -g -O2  -I/usr/src/kernels/2.6.32-279.2.1.el6.x86_64/include -DLIBIPVS_DONTUSE_NL -Wall -Wunused -c -o libipvs.o libipvs.c
libipvs.c:882: error: expected ‘)’ before ‘fwmark’
libipvs.c: In function ‘ipvs_strerror’:
libipvs.c:1099: error: ‘ipvs_get_service’ undeclared (first use in this function)
libipvs.c:1099: error: (Each undeclared identifier is reported only once
libipvs.c:1099: error: for each function it appears in.)
make[2]: *** [libipvs.o] Error 1
make[2]: Leaving directory `/root/keepalived-1.2.3/keepalived/libipvs-2.6'

    目前試到一個解決編譯的方法就是去修改 keepalived/libipvs-2.6/ip_vs.h


#include
#include
#include   /* <--- 新增此行 Add this line  */
#include
#include

    修改完即可通過編譯 !




沒有留言: