Redis手動failover

來源:互聯網
上載者:User

本文介紹redis主從環境下的手工failover操作及排錯過程,實現主執行個體宕機的時候,將從執行個體提升為主執行個體,繼續寫入資料;等到原主執行個體恢複後,同步原從執行個體上的資料完成後,恢複初始的主從執行個體角色!

環境介紹
作業系統版本均為:rhel5.4 64bit
redis版本:2.6.4
redis執行個體連接埠均為:6379
redis執行個體密碼均為:123
主執行個體為server11(192.168.1.112)
從執行個體為server12(192.168.1.113)

一:未配置持久化情況下的手工切換
1:正常情況下,server11為主執行個體,server12為從執行個體,資料同步正常

 
  1. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123  
  2. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 3 'Replication'  
  3. # Replication  
  4. role:master  
  5. connected_slaves:1  
  6. slave0:192.168.1.113,6379,online  
  7.  
  8. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 config get save  
  9. 1) "save"  
  10. 2) ""  
  11.  
  12. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 config get save  
  13. 1) "save"  
  14. 2) ""  
  15.  
  16. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 set 5 e  
  17. OK  
  18.  
  19. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 5  
  20. "e"  
  21.  
  22. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 5  
  23. "e" 

2:當主執行個體掛掉的時候,從執行個體可以正常查詢,但無法寫入資料

 
  1. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 shutdown  
  2. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 5  
  3. Could not connect to Redis at 192.168.1.112:6379: Connection refused  
  4.  
  5. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 5  
  6. "e"  
  7. [root@server12 ~]#  /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 set 6 f  
  8. (error) READONLY You can't write against a read only slave. 

3:將從執行個體提升為主執行個體,從而實現資料寫入

 
  1. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 SLAVEOF NO ONE  
  2. OK  
  3. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 info |grep -A 3 'Replication'  
  4. # Replication  
  5. role:master  
  6. connected_slaves:0  
  7.  
  8. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 5  
  9. "e"  
  10. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 set 6 f  
  11. OK  
  12. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 6  
  13. "f" 

4:主執行個體恢複後嘗試從server12執行個體上擷取最新的資料,實際測試表明這種方法不可行,最終導致server11和server12的資料不一致,如果強行恢複初始執行個體角色,則會導致資料丟失

 
  1. [root@server11 ~]# /usr/local/redis2/bin/redis-server /usr/local/redis2/etc/redis.conf  
  2. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 3 'Replication'  
  3. # Replication  
  4. role:master  
  5. connected_slaves:0  
  6.  
  7. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123  get 5  
  8. (nil)  
  9. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123  get 6  
  10. (nil)  
  11.  
  12. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123  get 5  
  13. "e"  
  14. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123  get 6  
  15. "f"  
  16.  
  17. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -p 6379 -a 123 SLAVEOF 192.168.1.113 6379  
  18. OK  
  19.  
  20. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 10 'Replication'  
  21. # Replication  
  22. role:slave  
  23. master_host:192.168.1.113  
  24. master_port:6379  
  25. master_link_status:down  
  26. master_last_io_seconds_ago:-1  
  27. master_sync_in_progress:0  
  28. master_link_down_since_seconds:517  
  29. slave_priority:100  
  30. slave_read_only:1  
  31. connected_slaves:0  
  32.  
  33. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 info |grep -A 3 'Replication'  
  34. # Replication  
  35. role:master  
  36. connected_slaves:0  
  37.  
  38. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 5  
  39. (nil)  
  40. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 6  
  41. (nil)  
  42.  
  43. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 6  
  44. "f"  
  45. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 5  
  46. "e" 

二:開啟從執行個體快照持久化下的測試
1:恢複原測試環境後,開啟從執行個體的快照持久化,因為是測試環境,所以設定60秒內如果有1條資料變更則保持一次快照

 
  1. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 config get save  
  2. 1) "save"  
  3. 2) ""  
  4.  
  5. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 config get save  
  6. 1) "save"  
  7. 2) "60 1"  
  8.  
  9. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 3 'Replication'  
  10. # Replication  
  11. role:master  
  12. connected_slaves:1  
  13. slave0:192.168.1.113,6379,online  
  14.  
  15. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 info |grep -A 3 'Replication'  
  16. # Replication  
  17. role:slave  
  18. master_host:192.168.1.112  
  19. master_port:6379 

2:寫入測試資料主從環境資料是否同步正常

 
  1. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 set 5 e  
  2. OK  
  3.  
  4. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 5  
  5. "e"  
  6.  
  7. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 5  
  8. "e" 

3:類比主執行個體宕機,手動將從執行個體提升為主執行個體,繼續寫入新資料

 
  1. [root@server11 ~]# killall -9 redis-server  
  2. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 3 'Replication'  
  3. Could not connect to Redis at 192.168.1.112:6379: Connection refused  
  4.  
  5. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 5  
  6. "e"  
  7. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 set 6 f  
  8. (error) READONLY You can't write against a read only slave  
  9.  
  10. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 slaveof no one  
  11. OK  
  12. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 info |grep -A 3 'Replication'  
  13. # Replication  
  14. role:master  
  15. connected_slaves:0  
  16.  
  17. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 5  
  18. "e"  
  19.  
  20. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 set 6 f  
  21. OK  
  22.  
  23. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 6  
  24. "f" 

4:原主執行個體恢複後的資料同步及角色複原,這裡同步資料採取將從執行個體的快照檔案複製到主執行個體的方式實現

 
  1. [root@server12 ~]# scp /usr/local/redis2/slave_dump.rdb  server11:/usr/local/redis2/master_dump.rdb  
  2. [root@server11 ~]# /usr/local/redis2/bin/redis-server /usr/local/redis2/etc/redis.conf   
  3. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 2 'Replication'  
  4. # Replication  
  5. role:master  
  6. connected_slaves:0  
  7. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 5  
  8. "e"  
  9. [root@server11 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 6  
  10. "f"  
  11.  
  12. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 slaveof 192.168.1.112 6379  
  13. OK  
  14. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 info |grep -A 10 'Replication'  
  15. # Replication  
  16. role:slave  
  17. master_host:192.168.1.112  
  18. master_port:6379  
  19. master_link_status:up  
  20. master_last_io_seconds_ago:1  
  21. master_sync_in_progress:0  
  22. slave_priority:100  
  23. slave_read_only:1  
  24. connected_slaves:0  
  25. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 5  
  26. "e"  
  27. [root@server12 ~]# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 6  
  28. "f  
  29.  
  30. [root@server11 ~]#  /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 3 'Replication'  
  31. # Replication  
  32. role:master  
  33. connected_slaves:1  
  34. slave0:192.168.1.113,6379,online 

後續擴充:本文實現的failover過程,到從執行個體提升到主執行個體階段都是可以通過部署keepalive自動實現的,在最後原主執行個體資料同步和角色複原可以通過shell指令碼來調度,下篇文章中將對此進行詳細的介紹!
 

本文出自 “斬月” 部落格,謝絕轉載!

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.