1. 程式人生 > 實用技巧 >redis 4 主從,哨兵 叢集模式

redis 4 主從,哨兵 叢集模式

一、主從複製

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

在複製的概念中,資料庫分為兩類,一類是主資料庫(master),另一類是從資料庫[1] (slave)。主資料庫可以進行讀寫操作,當寫操作導致資料變化時會自動將資料同步給從資料庫。而從資料庫一般是隻讀的,並接受主資料庫同步過來的資料。一個主資料庫可以擁有多個從資料庫,而一個從資料庫只能擁有一個主資料庫。

特點:

1、master/slave 角色

2、master/slave 資料相同

3、降低 master 讀壓力在轉交從庫

問題:

1.主節點只有一臺伺服器,因此寫能力和儲存能力收到了單機限制

2.一旦主節點出現故障,需要手動將一個從節點晉升為主節點,同時還需要修改應用方(如java程式)的主節點地址(連線redis的ip埠等),還需要命令其他從節點重新去複製新的主節點,整個過程需要人工干預。這個時候就需要用到哨兵機制了

二 Redis容災部署哨兵(sentinel)

Redis Sentinel為Redis提供了高可用解決方案。實際上這意味著使用Sentinel可以部署一套Redis,在沒有人為干預的情況下去應付各種各樣的失敗事件。

Redis Sentinel同時提供了一些其他的功能,例如:監控、通知、併為client提供配置。

哨兵的作用:

  • 監控(Monitoring):Sentinel不斷的去檢查你的主從例項是否按照預期在工作。
  • 通知(Notification):Sentinel可以通過一個api來通知系統管理員或者另外的應用程式,被監控的Redis例項有一些問題。
  • 自動故障轉移(Automatic failover):如果一個主節點沒有按照預期工作,Sentinel會開始故障轉移過程,把一個從節點提升為主節點,並重新配置其他的從節點使用新的主節點,使用Redis服務的應用程式在連線的時候也被通知新的地址。
  • 配置提供者(Configuration provider):Sentinel給客戶端的服務發現提供來源:對於一個給定的服務,客戶端連線到Sentinels來尋找當前主節點的地址。當故障轉移發生的時候,Sentinels將報告新的地址。

Sentinel的分散式特性
Redis Sentinel是一個分散式系統,Sentinel執行在有許多Sentinel程序互相合作的環境下,它本身就是這樣被設計的。有許多Sentinel程序互相合作的優點如下:

    1. 當多個Sentinel同意一個master不再可用的時候,就執行故障檢測。這明顯降低了錯誤概率。
    2. 即使並非全部的Sentinel都在工作,Sentinel也可以正常工作,這種特性,讓系統非常的健康。

多個哨兵,不僅同時監控主從資料庫,而且哨兵之間互為監控

例子: 
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從。然而當我把原來的主再起來,它會作為新的從

特點:

1、保證高可用

2、監控各個節點

3、自動故障遷移

缺點:主從模式,切換需要時間丟資料

沒有解決 master 寫的壓力

三、叢集

Redis叢集的概念:

  RedisCluster是redis的分散式解決方案,在3.0版本後推出的方案,有效地解決了Redis分散式的需求,當一個服務掛了可以快速的切換到另外一個服務,當遇到單機記憶體、併發等瓶頸時,可使用此方案來解決這些問題

一、分散式資料庫概念

1.分散式資料庫把整個資料按分割槽規則對映到多個節點,即把資料劃分到多個節點上,每個節點負責整體資料的一個子集。比如我們庫有900條使用者資料,有3個redis節點,將900條分成3份,分別存入到3個redis節點

2.分割槽規則:

常見的分割槽規則雜湊分割槽和順序分割槽,redis叢集使用了雜湊分割槽,順序分割槽暫用不到,不做具體說明;

rediscluster採用了雜湊分割槽的“虛擬槽分割槽”方式(雜湊分割槽分節點取餘、一致性雜湊分割槽和虛擬槽分割槽)

3.虛擬槽分割槽(槽:slot)

RedisCluster採用此分割槽,所有的鍵根據雜湊函式(CRC16[key]&16383)對映到0-16383槽內,共16384個槽位,每個節點維護部分槽及槽所對映的鍵值資料

雜湊函式: Hash()=CRC16[key]&16383按位與

槽與節點的關係如下

redis用虛擬槽分割槽原因:解耦資料與節點關係,節點自身維護槽對映關係,分散式儲存

4.redisCluster的缺陷:

a,鍵的批量操作支援有限,比如mset, mget,如果多個鍵對映在不同的槽,就不支援了

b,鍵事務支援有限,當多個key分佈在不同節點時無法使用事務,同一節點是支援事務

c,鍵是資料分割槽的最小粒度,不能將一個很大的鍵值對對映到不同的節點

d,不支援多資料庫,只有0,select 0

e,複製結構只支援單層結構,不支援樹型結構。

5、叢集環境搭建-手動篇

部署結構圖:6389為6379的從節點,6390為6380的從節點,6391為6381的從節點

1.在/usr/local/bin/目錄下新建一個資料夾clusterconf,用來存放叢集的配置檔案

2.分別修改6379、6380、7381、6389、6390、6391配置檔案

以6379的配置為例:

port 6379 //節點埠

cluster-enabled yes //開啟叢集模式

cluster-node-timeout 15000 //節點超時時間(接收pong訊息回覆的時間)

cluster-config-file /usr/localbin/cluster/data/nodes-6379.conf叢集內部配置檔案

其它節點的配置和這個一致,改埠即可

3.配置完後,啟動6個redis服務

./redis-server clusterconf/redis6379.conf &

./redis-server clusterconf/redis6380.conf &

./redis-server clusterconf/redis6381.conf &

./redis-server clusterconf/redis6389.conf &

./redis-server clusterconf/redis6390.conf &

./redis-server clusterconf/redis6391.conf &

4. 各節點啟動後,使用cluster meet ip port與各節點握手,是叢集通訊的第一步(關鍵步驟1:叢集搭建-與各節點握手)

5.握手成功後,使用cluster nodes可以看到各節點都可以互相查詢到

6.節點握手成功後,此時叢集處理下線狀態,所有讀寫都被禁止

7.使用cluster info命令獲取叢集當前狀態

8.redis叢集有16384個雜湊槽,要把所有資料對映到16384槽,需要批量設定槽(關鍵步驟2:叢集搭建-分配槽

redis-cli -h 192.168.152.128 -p 6379 cluster addslots {0...5461}

redis-cli -h 192.168.152.128-p 6380 cluster addslots {5641...10922}

redis-cli -h 192.168.152.128-p 6381 cluster addslots {10923...16383}

9.分配完槽後,可檢視叢集狀態cluster info

11.然後再檢視cluster nodes,檢視每個節點的ID

12.將6389,6390,6391與6379,6380,6381做主從對映(關鍵步驟3:叢集搭建-叢集對映),到此redis叢集手動搭建完成

192.168.152.128:6389> cluster replicate9b7b0c22f95eb01fb9935ad4b04d396c7f99e881

192.168.152.128:6390> cluster replicate5351c088472467ae485ed519cea271efda646bfa

92.168.152.128:6391> cluster replicatee718f126278072e1e180c3e518d73e0bc877b3dc

更多詳解,可參考以下連結

https://www.cnblogs.com/leeSmall/p/8414687.html