1、Redis的復(fù)制功能是支持多個數(shù)據(jù)庫之間的數(shù)據(jù)同步。一類是主數(shù)據(jù)庫(master)一類是從數(shù)據(jù)庫(slave),主數(shù)據(jù)庫可以進(jìn)行讀寫操作,當(dāng)發(fā)生寫操作的時候自動將數(shù)據(jù)同步到從數(shù)據(jù)庫,而從數(shù)據(jù)庫一般是只讀的,并接收主數(shù)據(jù)庫同步過來的數(shù)據(jù),一個主數(shù)據(jù)庫可以有多個從數(shù)據(jù)庫,而一個從數(shù)據(jù)庫只能有一個主數(shù)據(jù)庫。
2、通過redis的復(fù)制功能可以很好的實現(xiàn)數(shù)據(jù)庫的讀寫分離,提高服務(wù)器的負(fù)載能力。主數(shù)據(jù)庫主要進(jìn)行寫操作,而從數(shù)據(jù)庫負(fù)責(zé)讀操作。
主從復(fù)制過程:見下圖
過程:
1:當(dāng)一個從數(shù)據(jù)庫啟動時,會向主數(shù)據(jù)庫發(fā)送sync命令,
2:主數(shù)據(jù)庫接收到sync命令后會開始在后臺保存快照(執(zhí)行rdb操作),并將保存期間接收到的命令緩存起來
3:當(dāng)快照完成后,redis會將快照文件和所有緩存的命令發(fā)送給從數(shù)據(jù)庫。
4:從數(shù)據(jù)庫收到后,會載入快照文件并執(zhí)行收到的緩存的命令。
注意:redis2.8之前的版本:當(dāng)主從數(shù)據(jù)庫同步的時候從數(shù)據(jù)庫因為網(wǎng)絡(luò)原因斷開重連后會重新執(zhí)行上述操作,不支持?jǐn)帱c續(xù)傳。
redis2.8之后支持?jǐn)帱c續(xù)傳。
Redis主從結(jié)構(gòu)支持一主多從
主節(jié)點:192.168.33.130
從節(jié)點:192.168.33.131
注意:所有從節(jié)點的配置都一樣
方式1:手動修改配置文件
只需要額外修改從節(jié)點中redis的配置文件中的slaveof屬性即可
配置修改圖示:
配置效果圖示:
1、192.168.33.130主機:啟動130主節(jié)點上面的redis,查看redis的info信息
2、192.168.33.131主機:啟動131從節(jié)點上面的redis,查看redis的info信息
方式2:動態(tài)設(shè)置
通過redis-cli 連接到從節(jié)點服務(wù)器,執(zhí)行下面命令即可。
slaveof 192.168.33.130 6379
演示結(jié)果和手動方式一致。
如果你使用主從復(fù)制,那么要確保你的master激活了持久化,或者確保它不會在當(dāng)?shù)艉笞詣又貑?。原因?/p>
slave是master的完整備份,因此如果master通過一個空數(shù)據(jù)集重啟,slave也會被清掉。
在配置redis復(fù)制功能的時候如果主數(shù)據(jù)庫設(shè)置了密碼,需要在從數(shù)據(jù)的配置文件中通過masterauth參數(shù)設(shè)置主數(shù)據(jù)庫的密碼,這樣從數(shù)據(jù)庫在連接主數(shù)據(jù)庫時就會自動使用auth命令認(rèn)證了。相當(dāng)于做了一個免密碼登錄。
redis的sentinel系統(tǒng)用于管理多個redis服務(wù)器,該系統(tǒng)主要執(zhí)行三個任務(wù):監(jiān)控、提醒、自動故障轉(zhuǎn)移。
1、監(jiān)控(Monitoring): Redis Sentinel實時監(jiān)控主服務(wù)器和從服務(wù)器運行狀態(tài),并且實現(xiàn)自動切換。
2、提醒(Notification):當(dāng)被監(jiān)控的某個 Redis 服務(wù)器出現(xiàn)問題時, Redis Sentinel 可以向系統(tǒng)管理員發(fā)送通知, 也可以通過 API 向其他程序發(fā)送通知。
3、自動故障轉(zhuǎn)移(Automatic failover): 當(dāng)一個主服務(wù)器不能正常工作時,Redis Sentinel 可以將一個從服務(wù)器升級為主服務(wù)器, 并對其他從服務(wù)器進(jìn)行配置,讓它們使用新的主服務(wù)器。當(dāng)應(yīng)用程序連接Redis 服務(wù)器時, Redis Sentinel會告之新的主服務(wù)器地址和端口。
注意:在使用sentinel監(jiān)控主從節(jié)點的時候,從節(jié)點需要是使用動態(tài)方式配置的,如果直接修改配置文件,后期sentinel實現(xiàn)故障轉(zhuǎn)移的時候會出問題。
主觀下線和客觀下線:
1、主觀下線狀態(tài):當(dāng)一個sentinel認(rèn)為一個redis服務(wù)連接不上的時候,會給這個服務(wù)打個標(biāo)記為下線狀態(tài)。
2、客觀下線狀態(tài):當(dāng)多個sentinel認(rèn)為一個redids連接不上的時候,則認(rèn)為這個redis服務(wù)確實下線了。這里的多個sentinel的個數(shù)可以在配置文件中設(shè)置。
主節(jié)點:主觀下線和客觀下線
從節(jié)點:主觀下線狀態(tài)
修改sentinel.conf文件
最后一個參數(shù)為需要判定客觀下線所需的主觀下線sentinel個數(shù),這個參數(shù)不可以大于sentinel個數(shù)。
啟動sentinel
啟動后結(jié)果圖示:
sentinel日志明細(xì)說明
http://redisdoc.com/topic/sentinel.html
通過訂閱指定的頻道信息,當(dāng)服務(wù)器出現(xiàn)故障得時候通知管理員
客戶端可以將 Sentinel 看作是一個只提供了訂閱功能的 Redis 服務(wù)器,你不可以使用 PUBLISH 命令向這個服務(wù)器發(fā)送信息,但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通過訂閱給定的頻道來獲取相應(yīng)的事件提醒。
一個頻道能夠接收和這個頻道的名字相同的事件。 比如說, 名為 +sdown 的頻道就可以接收所有實例進(jìn)入主觀下線(SDOWN)狀態(tài)的事件。
sentinel的基本狀態(tài)信息
列出所有被監(jiān)視的主服務(wù)器,以及這些主服務(wù)器的當(dāng)前狀態(tài)
列出給定主服務(wù)器的所有從服務(wù)器,以及這些從服務(wù)器的當(dāng)前狀態(tài)
返回給定名字的主服務(wù)器的 IP 地址和端口號
重置所有名字和給定模式 pattern 相匹配的主服務(wù)器。重置操作清除主服務(wù)器目前的所有狀態(tài), 包括正在執(zhí)行中的故障轉(zhuǎn)移, 并移除目前已經(jīng)發(fā)現(xiàn)和關(guān)聯(lián)的, 主服務(wù)器的所有從服務(wù)器和 Sentinel 。
當(dāng)主服務(wù)器失效時, 在不詢問其他 Sentinel 意見的情況下, 強制開始一次自動故障遷移,但是它會給其他sentinel發(fā)送一個最新的配置,其他sentinel會根據(jù)這個配置進(jìn)行更新
代碼示例:
打印結(jié)果:
redis集群是一個無中心的分布式Redis存儲架構(gòu),可以在多個節(jié)點之間進(jìn)行數(shù)據(jù)共享,解決了Redis高可用、可擴展等問題。redis集群提供了以下兩個好處
1、將數(shù)據(jù)自動切分(split)到多個節(jié)點
2、當(dāng)集群中的某一個節(jié)點故障時,redis還可以繼續(xù)處理客戶端的請求。
一個 Redis 集群包含 16384 個哈希槽(hash slot),數(shù)據(jù)庫中的每個數(shù)據(jù)都屬于這16384個哈希槽中的一個。集群使用公式 CRC16(key) % 16384 來計算鍵 key 屬于哪個槽。集群中的每一個節(jié)點負(fù)責(zé)處理一部分哈希槽。
集群中的主從復(fù)制
集群中的每個節(jié)點都有1個至N個復(fù)制品,其中一個為主節(jié)點,其余的為從節(jié)點,如果主節(jié)點下線了,集群就會把這個主節(jié)點的一個從節(jié)點設(shè)置為新的主節(jié)點,繼續(xù)工作。這樣集群就不會因為一個主節(jié)點的下線而無法正常工作。
注意:
1、如果某一個主節(jié)點和他所有的從節(jié)點都下線的話,redis集群就會停止工作了。redis集群不保證數(shù)據(jù)的強一致性,在特定的情況下,redis集群會丟失已經(jīng)被執(zhí)行過的寫命令
2、使用異步復(fù)制(asynchronous replication)是 Redis 集群可能會丟失寫命令的其中一個原因,有時候由于網(wǎng)絡(luò)原因,如果網(wǎng)絡(luò)斷開時間太長,redis集群就會啟用新的主節(jié)點,之前發(fā)給主節(jié)點的數(shù)據(jù)就會丟失。
修改配置文件redis.conf
要讓集群正常運作至少需要三個主節(jié)點
我們這里就簡單在一臺主機上創(chuàng)建6個redis節(jié)點來演示集群配置,實際生產(chǎn)環(huán)境中需要每個節(jié)點一臺主機。
我們要創(chuàng)建的6個redis節(jié)點,其中三個為主節(jié)點,三個為從節(jié)點,對應(yīng)的redis節(jié)點的ip和端口對應(yīng)關(guān)系如下:
1、首先我們創(chuàng)建6個以端口為名稱的文件夾(由于每個redis節(jié)點啟動的時候,都會在當(dāng)前文件夾下創(chuàng)建快照文件,所以我們需要創(chuàng)建每個節(jié)點的啟動目錄)
2、接下來把每個節(jié)點啟動所需要的配置文件拷貝到相應(yīng)的啟動目錄:
3、然后我們進(jìn)入每個啟動目錄,修改之前拷貝的redis.conf文件中的端口port 為上面列出的對應(yīng)端口。
最終每個節(jié)點的配置類似于:
4、進(jìn)入每個啟動目錄,以每個目錄下的redis.conf文件啟動
使用命令查看redis節(jié)點是否啟動
5、創(chuàng)建集群命令
注意:
5.1、執(zhí)行上面的命令的時候可能會報錯,因為是執(zhí)行的ruby的腳本,需要ruby的環(huán)境
錯誤內(nèi)容:
所以我們需要安裝ruby的環(huán)境,這里推薦使用yum安裝:
5.2、安裝ruby后,執(zhí)行命令可能還會報錯,提示缺少rubygems組件,使用yum安裝
解決方法:
5.3、上面兩個步驟后,執(zhí)行創(chuàng)建集群目錄可能還會報錯,提示不能加載redis,是因為缺少redis和ruby的接口,使用gem 安裝。
解決方法:
上面三個問題解決后,啟動創(chuàng)建集群應(yīng)該可以正常啟動了:
這里輸入yes
最后結(jié)果:
到此,我們的集群搭建成功了。
6、接下來我們使用命令進(jìn)入集群環(huán)境
使用redis-cli客戶端來操作redis集群,使用命令 :
查看集群中的所有主節(jié)點信息
根據(jù)添加節(jié)點類型的不同,有兩種方法來添加新節(jié)點
1、主節(jié)點:如果添加的是主節(jié)點,那么我們需要創(chuàng)建一個空節(jié)點,然后將某些哈希槽移動到這個空節(jié)點里面
2、從節(jié)點:如果添加的是從節(jié)點,我們也需要創(chuàng)建一個空節(jié)點,然后把這個新節(jié)點設(shè)置成集群中某個主節(jié)點的復(fù)制品。
添加節(jié)點:
1、首先把需要添加的節(jié)點啟動
創(chuàng)建7006目錄,拷貝7000中的redis.conf到7006中,然后修改端口port為7006,修改好后進(jìn)入7006目錄啟動這個節(jié)點:
2、執(zhí)行以下命令,將這個新節(jié)點添加到集群中:
結(jié)果圖示:
3、執(zhí)行命令查看剛才新增的節(jié)點:
4、增加了新的節(jié)點之后,這個新的節(jié)點可以成為主節(jié)點或者是從節(jié)點
4.1將這個新增節(jié)點變成從節(jié)點
前面我們已經(jīng)把這個新節(jié)點添加到集群中了,現(xiàn)在我們要讓新節(jié)點成為192.168.33.130:7001的從節(jié)點,只需要執(zhí)行下面的命令就可以了,命令后面的節(jié)點ID就是192.168.33.130:7001的節(jié)點ID。(注意,這個從節(jié)點哈希槽必須為空,如果不為空,則需要轉(zhuǎn)移掉哈希槽使之為空)
使用下面命令來確認(rèn)一下192.168.33.130:7006是否已經(jīng)成為192.168.33.130:7001的從節(jié)點。
4.2、將這個新增節(jié)點變成主節(jié)點:
使用redis-trib程序,將集群中的某些哈希槽移動到新節(jié)點里面,這個新節(jié)點就成為真正的主節(jié)點了。執(zhí)行下面的命令對集群中的哈希槽進(jìn)行移動:
命令執(zhí)行后,系統(tǒng)會提示我們要移動多少哈希槽,這里移動1000個
然后還需要指定把這些哈希槽轉(zhuǎn)移到哪個節(jié)點上
輸入我們剛才新增的節(jié)點的ID
d113e0f033c98e2f6b88fb93e6e98866256d85c4
然后需要我們指定轉(zhuǎn)移哪幾個幾點的哈希槽
輸入all 表示從所有的主節(jié)點中隨機轉(zhuǎn)移,湊夠1000個哈希槽
然后再輸入yes,redis集群就開始分配哈希槽了。
至此,一個新的主節(jié)點就添加完成了,執(zhí)行命令查看現(xiàn)在的集群中節(jié)點的狀態(tài)
結(jié)果圖示:
1、如果刪除的節(jié)點是主節(jié)點,這里我們刪除192.168.33.130:7006節(jié)點,這個節(jié)點有1000個哈希槽
首先要把節(jié)點中的哈希槽轉(zhuǎn)移到其他節(jié)點中,執(zhí)行下面的命令:
系統(tǒng)會提示我們要移動多少哈希槽,這里移動1000個,因為192.168.33.130:7006節(jié)點有1000個哈希槽。
然后系統(tǒng)提示我們輸入要接收這些哈希槽的節(jié)點的ID,這里使用192.168.33.130:7001的節(jié)點ID
然后要我們選擇從那些節(jié)點中轉(zhuǎn)出哈希槽,這里一定要輸入192.168.33.130:7006這個節(jié)點的ID
最后輸入done表示輸入完畢。
最后一步,使用下面的命令把這個節(jié)點刪除
2、如果是從節(jié)點,直接刪除即可。
向Redis集群中存入鍵值:
代碼示例: