搞redis很久了, 但卻一直沒等到redis的Cluster, 只好自力救濟, 搞搞自動Failover ...
各系統版本號
- Centos 5.4
- Keepalived 1.2.2
- redis 2.4.15
系統架構啟發來自Youtube的一個
影片 , 想參考的是可以加減看看啦, 但影片中有很多問題!
- 沒有字幕
- 口白不是英文, 本人完全聽不懂(因作者是西班牙籍, 猜想是西班牙語 )
- 字跡非常潦草, 還不斷塗塗改改修正
- 更慘的是裡面錯誤很多 (白板上的和視窗內的資料常常對不起來, 還常下錯指令, 奇怪咧為何不重錄? )
雖然這影片有如此多缺陷, 但至少給了個起點與方向. 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
修改完即可通過編譯 !