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程序互相合作的優點如下:
- 當多個Sentinel同意一個master不再可用的時候,就執行故障檢測。這明顯降低了錯誤概率。
- 即使並非全部的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