http://bboyjing.github.io/2016/12/08/Redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B9%9D%E3%80%90%E5%A4%84%E7%90%86%E7%B3%BB%E7%BB%9F%E6%95%85%E9%9A%9C%E3%80%91/
如果決定要將Redis用作應用程序唯一的數據存儲手段的話,那么就必須確保Redis不會丟失任何數據。根提供了ACID保證的傳統關系數據庫不同,在使用Redis為后端構建應用程序的時候,我們需要多做一些工作才能保證數據的一致性。
驗證快照文件和AOF文件
無論時快照持久化還是AOF持久化,都提供了在遇到系統故障時進行數據回復的工具。Redis提供了兩個命令行程序redis-check-aof和redis-check-dump(redis-check-rdb),它們可以在系統故障發生之后,檢查AOF文件和快照文件的狀態,并在有需要的情況下對文件進行修復。下面是使用方法:
1 2 3 4 5
| cd /opt/redis-3.2.4 redis-3.2.4 src/redis-check-aof Usage: src/redis-check-aof [--fix] <file.aof> redis-3.2.4 src/redis-check-rdb Usage: src/redis-check-rdb <rdb-file-name>
|
如果運行redis-check-aof程序時給了–fix參數,那么會對AOF文件進行修復。修復方法非常簡單:掃描AOF文件,尋找不正確或不完整的命令,當發現第一個出錯命令的時候,程序會刪除出錯的命令以及位于出錯命令之后的所有命令。在大多數情況下,被刪除的都是AOF文件末尾的不完整寫命令。
遺憾的是,目前沒有辦法修復出錯的快照文件。盡管發現快照文件收個出現錯誤的地方是有可能的,但因為快照文件本身經過了壓縮,而出現在快照文件中間的錯誤有可能會導致快照文件的剩余部分無法讀取。因此,最好為重要的快照文件保留多個備份。
更換故障主服務器
我們來看一下在擁有一個主服務器和一個從服務器的情況下,更換主服務器的具體步驟。假設A、B兩臺機器都運行著Redis,機器A為master,機器B為slave。機器A因為暫時無法修復的故障而斷開了連接,因此決定將同樣安裝了Redis的機器C用作新的主服務器。
更換服務器的計劃非常簡單:首先像機器B發送一個SAVE命令,讓它創建一個新的快照文件,接著將這個快照文件發送給機器C,并在機器C上面啟動Redis。最后讓B成為機器C的從從服務器。由于環境有限,就在同一臺機器上起不同的端口測試,本機已經安裝了兩個Redis服務,下面演示下步驟:
再安裝一個Redis服務并修改port配置,改為6381
1 2 3 4
| cd /opt sudo cp -r redis-3.2.4 redis-new-master sudo chmod -R 777 redis-new-master vim redis-new-master/redis.conf
|
啟動機器A、B,讓環境正常運行
1 2 3 4 5 6 7 8 9 10
| //啟動機器A cd /opt/redis-3.2.4 ./src/redis-server redis.conf //添加一個key ./src/redis-cli 127.0.0.1:6379> set key4 haha OK //啟動機器B cd /opt/redis-replication ./src/redis-server redis.conf
|
kill掉機器A的Redis服務,此時只剩Redis從服務在運行
向機器B發送SAVE命令
1 2 3 4
| cd /opt/redis-replication ./src/redis-cli -h localhost -p 6380 localhost:6380> SAVE OK
|
將機器B的快照文件復制到機器C的對應目錄,并啟動Redis服務
1 2 3
| cp -f /opt/redis-replication/dump.rdb /opt/redis-new-master cd /opt/redis-new-master src/redis-server redis.conf
|
讓機器B成為機器C的從服務器
1 2
| localhost:6380> SLAVEOF localhost 6381 OK
|
從機器B的日志已經可以看出成功連接上了6381的新主服務
- 測試機器B是否能從機器C同步數據
1 2 3 4 5 6 7 8
| //連接新master并新增key cd /opt/redis-new-master ./src/redis-cli -h localhost -p 6381 localhost:6381> set key5 new_master OK //查看B機器的key,成功 localhost:6380> get key5 "new_master"
|
Redis Sentinel可以監視指定的Redis主服務器及其下屬的從服務器,并在主服務器下線時自動進行故障轉移(failover),后面再學習這個功能。