keepalived官方有中文文檔:LVS + Keepalived Chinese application doc - March 16, 2010。
keepalived 實現VRRP協議,從路由級別實現VIP切換,可以完全避免類似heartbeat 腦裂問題。可以很nice的實現主從、主備、互備方案,尤其是無狀態業務,有狀態業務就需要額外花些功夫了。
既然mysql 可以使用keepalived很好的做到主從切換,redis自然也就有樣學樣就成了。
redis主從實現完全沒有mysql成熟,僅僅是可用而已,按照作者規划相應改進需要等3.0以后了。經過測試主從也不是那么完全不靠譜。主要問題在於同步連接斷開之后需要重新全量同步,如果頻繁進行會對主服務帶來很大性能影響。 但現實中主從機器往往要求放在一個機櫃同一台交換設備下,網絡閃斷情況極低;再者主從同步在同步數量量大情況下,需要將緩存區調得足夠大,不然也容易造成連接斷開。
實現切換邏輯如下:A B兩台機器
1. A 、B 依次啟動,A作為主、B為從
2.主A 掛掉,B接管業務,作為主
3.A 起來,作為從SLAVEOF B
4.B 掛掉,A 切回主
將一台全部作為主,即可實現主從,可做讀寫分離;也可以一台機器上多個實例一半主、一半從,實現互備份,兩機同時接管業務,一台宕機后業務都集中在一台上。
在keepalived 有兩個角色:Master(一個)、Backup(多個),如果設置一個為Master,但Master掛了后再起來,必然再次業務又一次切換,這對於有狀態服務是不可接受的。解決方案就是兩台機器都設置為Backup,而且優先級高的Backup設置為nopreemt 不搶占。
安裝比較簡單:
需要依賴包:openssl-devel(ubuntu 中為 libssl-dev),popt-devel (ubuntu中為libpopt-dev),redheat中都已經有了。
配置如下:
主:
! Configuration File for keepalived global_defs { router_id test } vrrp_script chk_redis { script "/etc/keepalived/scripts/redis_check.sh 127.0.0.1 7001" interval 2
timeout 2
fall 3 } vrrp_script chk_redis2 { script "/etc/keepalived/scripts/redis_check.sh 127.0.0.1 7002" interval 2
timeout 2
fall 3
} vrrp_instance redis { state BACKUP # 主也配置為SLAVE interface wlan0} virtual_router_id 51 priority 150 nopreempt # 不搶占,注意加上 advert_int 1 authentication { auth_type PASS auth_pass lulu } virtual_ipaddress { 192.168.1.144 } track_script { chk_redis } notify_master "/etc/keepalived/scripts/redis_master_slave.sh 127.0.0.1 192.168.1.126 7001" notify_backup "/etc/keepalived/scripts/redis_backup_slave.sh 127.0.0.1 192.168.1.126 7001" notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh } vrrp_instance redis2 { state BACKUP interface wlan0 } virtual_router_id 50 priority 150 advert_int 1 nopreempt authentication { auth_type PASS auth_pass lulu } virtual_ipaddress { 192.168.1.145 } track_script { chk_redis2 } notify_master "/etc/keepalived/scripts/redis_master_slave.sh 127.0.0.1 192.168.1.126 7002" notify_backup "/etc/keepalived/scripts/redis_backup_slave.sh 127.0.0.1 192.168.1.126 7002" notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh }
備:
! Configuration File for keepalived global_defs { router_id test } vrrp_script chk_redis { script "/etc/keepalived/scripts/redis_check.sh 127.0.0.1 7001" interval 2
timeout 2
fall 3 } vrrp_script chk_redis2 { script "/etc/keepalived/scripts/redis_check.sh 127.0.0.1 7002" interval 2
timeout 2
fall 3 } vrrp_instance redis { state BACKUP interface wlan0 } virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass test } virtual_ipaddress { 192.168.1.144 } track_script { chk_redis } notify_master "/etc/keepalived/scripts/redis_master_slave.sh 127.0.0.1 192.168.1.126 7001" notify_backup "/etc/keepalived/scripts/redis_backup_slave.sh 127.0.0.1 192.168.1.126 7001" notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh } vrrp_instance redis2 { state BACKUP interface wlan0 } virtual_router_id 50 advert_int 1 priority 100 authentication { auth_type PASS auth_pass test } virtual_ipaddress { 192.168.1.145 } track_script { chk_redis2 } notify_master "/etc/keepalived/scripts/redis_master_slave.sh 127.0.0.1 192.168.1.126 7002" notify_backup "/etc/keepalived/scripts/redis_backup_slave.sh 127.0.0.1 192.168.1.126 7002" notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh }
其他腳本見附件:http://files.cnblogs.com/lulu/scripts.rar