1. 程式人生 > >redis主從、哨兵、叢集的區別

redis主從、哨兵、叢集的區別

關於redis主從、哨兵、叢集的介紹網上很多,這裡就不贅述了。 一、主從 通過持久化功能,Redis保證了即使在伺服器重啟的情況下也不會損失(或少量損失)資料,因為持久化會把記憶體中資料儲存到硬碟上,重啟會從硬碟上載入資料。  。但是由於資料是儲存在一臺伺服器上的,如果這臺伺服器出現硬碟故障等問題,也會導致資料丟失。為了避免單點故障,通常的做法是將資料庫複製多個副本以部署在不同的伺服器上,這樣即使有一臺伺服器出現故障,其他伺服器依然可以繼續提供服務。為此, Redis 提供了複製(replication)功能,可以實現當一臺資料庫中的資料更新後,自動將更新的資料同步到其他資料庫上。

在複製的概念中,資料庫分為兩類,一類是主資料庫(master),另一類是從資料庫[1] (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哨兵,可以用命令起也可以用配置檔案裡  可以使用雙哨兵,更安全,  redis-server --port 6379  redis-server --port 6380 --slaveof 192.168.0.167 6379  redis-server --port 6381 --slaveof 192.168.0.167 6379

redis-sentinel sentinel.conf  哨兵配置檔案      sentinel.conf          sentinel monitor mymaster 192.168.0.167 6379 1 

其中mymaster表示要監控的主資料庫的名字,可以自己定義一個。這個名字必須僅由大小寫字母、數字和“.-_”這 3 個字元組成。後兩個引數表示主資料庫的地址和埠號,這裡我們要監控的是主資料庫6379。 注意:

    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從。然而當我把原來的主再起來,它不會作為從,只是個獨立的節點。

如果在新的主剛被選出來時,我把原來的主起來,它就能成為新主的從節點。  如果在新的主選出來過一會再起原來的主,就不能成為新主的從節點  或者在老的主起來後,重啟哨兵也能把它變成從,哨兵配置檔案裡有,哨兵會執行“+convert-to-slave”

這很奇怪,我也沒弄明白是怎麼回事。

三、叢集 即使使用哨兵,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

2、把6個redis例項都起來,每個例項的叢集都開啟。

3、redis安裝目錄的src執行./redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385

提示資訊如下

Connecting to node 127.0.0.1:6380: OK  Connecting to node 127.0.0.1:6381: OK  Connecting to node 127.0.0.1:6382: OK  Connecting to node 127.0.0.1:6383: OK  Connecting to node 127.0.0.1:6384: OK  Connecting to node 127.0.0.1:6385: OK  >>> Performing hash slots allocation on 6 nodes...  Using 3 masters:  127.0.0.1:6380  127.0.0.1:6381  127.0.0.1:6382  Adding replica 127.0.0.1:6383 to 127.0.0.1:6380  Adding replica 127.0.0.1:6384 to 127.0.0.1:6381  Adding replica 127.0.0.1:6385 to 127.0.0.1:6382  M: d4f906940d68714db787a60837f57fa496de5d12 127.0.0.1:6380 slots:0-5460 (5461 slots) master  M: b547d05c9d0e188993befec4ae5ccb430343fb4b 127.0.0.1:6381 slots:5461-10922 (5462 slots) master  M: 887fe91bf218f203194403807e0aee941e985286 127.0.0.1:6382 slots:10923-16383 (5461 slots) master S: e0f6559be7a121498fae80d44bf18027619d9995 127.0.0.1:6383 replicates d4f906940d68714db787a60837f57fa496de5d12  S: a61dbf654c9d9a4d45efd425350ebf720a6660fc 127.0.0.1:6384 replicates b547d05c9d0e188993befec4ae5ccb430343fb4b  S: 551e5094789035affc489db267c8519c3a29f35d 127.0.0.1:6385 replicates 887fe91bf218f203194403807e0aee941e985286  Can I set the above configuration? (type 'yes' to accept):

輸入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 任意一個埠 ---------------------  作者:黃河邊上的牧馬人  來源:CSDN  原文:https://blog.csdn.net/c295477887/article/details/52487621  版權宣告:本文為博主原創文章,轉載請附上博文連結!