關于redis主從、哨兵、叢集
一、主從
通過持久化功能,Redis保證了即使在伺服器重新開機的情況下也不會損失(或少量損失)資料,因為持久化會把記憶體中資料儲存到硬碟上,重新開機會從硬碟上加載資料。
但是由于資料是存儲在一台伺服器上的,如果這台伺服器出現硬碟故障等問題,也會導緻資料丢失。為了避免單點故障,通常的做法是将資料庫複制多個副本以部署在不同的伺服器上,這樣即使有一台伺服器出現故障,其他伺服器依然可以繼續提供服務。為此, Redis 提供了複制(replication)功能,可以實作當一台資料庫中的資料更新後,自動将更新的資料同步到其他資料庫上。
在複制的概念中,資料庫分為兩類,一類是主資料庫(master),另一類是從資料庫(slave)。主資料庫可以進行讀寫操作,當寫操作導緻資料變化時會自動将資料同步給從資料庫。而從資料庫一般是隻讀的,并接受主資料庫同步過來的資料。一個主資料庫可以擁有多個從資料庫,而一個從資料庫隻能擁有一個主資料庫。
主從資料庫的配置
master slave
主不用配置,從redis的conf檔案加入 slaveof ip port 就可以了
或者從redis啟動時 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主、從資料庫是否正常運作,主出現故障自動将從資料庫轉換為主資料庫。
顧名思義,哨兵的作用就是監控Redis系統的運作狀況。它的功能包括以下兩個。
(1)監控主資料庫和從資料庫是否正常運作。
(2)主資料庫出現故障時自動将從資料庫轉換為主資料庫。
可以用info replication檢視主從情況
例子:
1主2從 1哨兵,可以用指令起也可以用配置檔案裡
可以使用雙哨兵,更安全,
哨兵配置檔案
sentinel.conf
sentinel monitor mymaster 192.168.0.167 6379 1
其中mymaster表示要監控的主資料庫的名字,可以自己定義一個。這個名字必須僅由大小寫字母、數字和“.-_”這 3 個字元組成。後兩個參數表示主資料庫的ip位址和端口号,這裡我們要監控的是主資料庫6379。最後一個參數表示投舉票數,及某從資料庫的票數為n時即為master
注意:
1、使用時不能用127.0.0.1,需要用真實IP,不然java程式通過哨兵會連到java程式所在的機器(127.0.0.1 )
2、配置哨兵監控一個系統時,隻需要配置其監控主資料庫即可,哨兵會自動發現所有複制該主資料庫的從資料庫,這樣哨兵就能監控主6379和從6380、6381,一旦6379挂掉,哨兵就會在2個從中選擇一個作為主,根據優先級選,如果一樣就選個id小的,當6379再起來就作為從存在。
主從切換過程:
(1) slave leader更新為master
(2) 其他slave修改為新master的slave
(3) 用戶端修改連接配接
(4) 老的master如果重新開機成功,變為新master的slave
哨兵監控1主2從,停掉主,哨兵會選出1個從作為主,變成1主1從。然而當我把原來的主再起來,它不會作為從,隻是個獨立的節點。
三、叢集
即使使用哨兵,redis每個執行個體也是全量存儲,每個redis存儲的内容都是完整的資料,浪費記憶體且有木桶效應。為了最大化利用記憶體,可以采用叢集,就是分布式存儲。即每台redis存儲不同的内容,
共有16384個slot。每個redis分得一些slot,hash_slot = crc16(key) mod 16384 找到對應slot,鍵是可用鍵,如果有{}則取{}内的作為可用鍵,否則整個鍵是可用鍵
叢集至少需要3主3從,且每個執行個體使用不同的配置檔案,主從不用配置,叢集會自己選。
修改每個執行個體的配置檔案:
cluster-enabled yes --開啟叢集
cluster-config-file nodes-6382.conf --叢集配置檔案名,每個執行個體配置的要不同,redis會根據檔案名自動建立
用叢集工具建立叢集:
我們可以用叢集工具進行叢集,該工具是redis源碼包中,用ruby編寫,是以需要先安裝ruby。
1、安裝rubygems
yum install ruby
yum install rubygems
gem install redis
注:若安裝過程中提示:
ERROR: Could not find a valid gem 'redisa' (>= 0) in any repository
請檢視
2、把6個redis執行個體都起來,每個執行個體的叢集都打開。(可以複制n份redis.conf,更改檔案内的端口号及叢集配置檔案名,然後再以redis-service ./redis-6380.conf 啟動redis執行個體)
3、redis安裝目錄的src執行
./redis-trib.rb create --replicas 1 10.100.50.23:638010.100.50.23:6381 10.100.50.23:638210.100.50.23:6383 10.100.50.23:6384 10.100.50.23:6385
提示資訊如下
輸入yes,這樣叢集就建立了。
登入任一台redis,執行 info cluster,提示cluster_enabled:1
叢集過程:
首先redis-trib.rb會以用戶端的形式嘗試連接配接所有的節點,并發送PING指令以确定節點能夠正常服務。如果有任何節點無法連接配接,則建立失敗。同時發送 INFO 指令擷取每個節點的運作ID以及是否開啟了叢集功能(即cluster_enabled為1)。 準備就緒後叢集會向每個節點發送 CLUSTER MEET指令,格式為 CLUSTER MEET ip port,這個指令用來告訴目前節點指定ip和port上在運作的節點也是叢集的一部分,進而使得6個節點最終可以歸入一個叢集。
然後redis-trib.rb會配置設定主從資料庫節點,配置設定的原則是盡量保證每個主資料庫運作在不同的IP位址上,同時每個從資料庫和主資料庫均不運作在同一IP位址上,以保證系統的容災能力
3主3從,當1個主故障,大家會給對應的從投票,把從立為主,若沒有從資料庫可以恢複則redis叢集就down了。
用戶端連接配接:
使用redis-cli -c -p 任意一個端口