一、主從模式
通過持久化功能,Redis保證了即使在服務器重啟的情況下也不會損失(或少量損失)數據,因為持久化會把內存中數據保存到硬盤上,重啟會從硬盤上加載數據。
但是由于數據是存儲在一臺服務器上的,如果這臺服務器出現硬盤故障等問題,也會導致數據丟失。為了避免單點故障,通常的做法是將數據庫復制多個副本以部署在不同的服務器上,這樣即使有一臺服務器出現故障,其他服務器依然可以繼續提供服務。為此, Redis 提供了復制(replication)功能,可以實現當一臺數據庫中的數據更新后,自動將更新的數據同步到其他數據庫上。
在復制的概念中,數據庫分為兩類,一類是主數據庫(master),另一類是從數據庫(slave)。主數據庫可以進行讀寫操作,當寫操作導致數據變化時會自動將數據同步給從數據庫。而從數據庫一般是只讀的,并接受主數據庫同步過來的數據。一個主數據庫可以擁有多個從數據庫,而一個從數據庫只能擁有一個主數據庫。
主從數據庫的配置
主數據庫不用配置,從redis的conf文件中可以加載從數據庫的信息,也可以在啟動時,使用 redis-server --port 6380 --slaveof 127.0.0.1 6379
從數據庫一般是只讀,可以改為可寫,但寫入的數據很容易被主同步沒,所以還是只讀就可以。
也可以在運行時使用slaveof ip port命令,停止原來的主,切換成剛剛設置的主 slaveof no one會把自己變成主
復制原理
當從數據庫啟動時,會向主數據庫發送sync命令,主數據庫接收到sync后開始在后臺保存快照rdb,在保存快照期間收到的命令緩存起來,當快照完成時,主數據庫會將快照和緩存的命令一塊發送給從**。復制初始化結束。
之后,主每收到1個命令就同步發送給從。
當出現斷開重連后,2.8之后的版本會將斷線期間的命令傳給重數據庫。增量復制
主從復制是樂觀復制,當客戶端發送寫執行給主,主執行完立即將結果返回客戶端,并異步的把命令發送給從,從而不影響性能。也可以設置至少同步給多少個從主才可寫。
無硬盤復制:如果硬盤效率低將會影響復制性能,2.8之后可以設置無硬盤復制,repl-diskless-sync yes
二、哨兵
當主數據庫遇到異常中斷服務后,開發者可以通過手動的方式選擇一個從數據庫來升格為主數據庫,以使得系統能夠繼續提供服務。然而整個過程相對麻煩且需要人工介入,難以實現自動化。 為此,Redis 2.8中提供了哨兵工具來實現自動化的系統監控和故障恢復功能。
哨兵的作用就是監控redis主、從數據庫是否正常運行,主出現故障自動將從數據庫轉換為主數據庫。
例子:
1主2從1哨兵
注:
配置哨兵監控一個系統時,只需要配置其監控主數據庫即可,哨兵會自動發現所有復制該主數據庫的從數據庫
這樣哨兵就能監控主6379和從6380、6381,一旦6379掛掉,哨兵就會在2個從中選擇一個作為主,根據優先級選,如果一樣就選個id小的,當6379再起來就作為從存在。
三、集群(cluster-enable)
使用集群,只需要將每個數據庫節點的cluster-enable配置打開即可。每個集群中至少需要三個主數據庫才能正常運行。
即使使用哨兵,redis每個實例也是全量存儲,每個redis存儲的內容都是完整的數據,浪費內存且有木桶效應。為了最大化利用內存,可以采用集群,就是分布式存儲。即每臺redis存儲不同的內容。
集群至少需要3主3從,且每個實例使用不同的配置文件,主從不用配置,集群會自己選。
修改每個實例的配置文件:
集群的運行
這里的master選舉和zookeeper的相似