首頁  >  文章  >  資料庫  >  快速了解Redis中的單機、主從、哨兵和叢集模式

快速了解Redis中的單機、主從、哨兵和叢集模式

青灯夜游
青灯夜游轉載
2021-05-06 11:08:322495瀏覽

這篇文章帶大家了解Redis中的四種模式:單機、主從、哨兵、集群。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

快速了解Redis中的單機、主從、哨兵和叢集模式

少點程式碼,多點頭髮

入職第一周,我被坑了

最近剛入職新公司,本來想著這剛來新公司,一般都是熟悉熟悉公司同事,看看組內工程文檔,找幾個demo自己練練手。

咳咳,萬萬沒想到啊,一切都是我以為的,我還是太了。

入職那天下午,組長給我丟了幾份文檔,讓我看下這個這些工程的快取系統問題,讓我把redis升級為哨兵模式。

接到任務的我,內心是懵逼的。

快速了解Redis中的單機、主從、哨兵和叢集模式

第一、不知道都是些什麼類型的服務在用redis。

第二、不知道以什麼姿勢在用redis。

第三、如果redis掛了會不會影響使用者。

第四、我完全沒用過redis。

雖然說沒幹過,但咋也不慫。畢竟要是天天乾的都是幹過的工作,那就是有問題了,很快就被優化掉了。

看來社招入職和校招還是不一樣的,校招進來都會有些入職訓練或是新人班課程。

透過這些形式的教育,第一、了解公司的文化、價值觀,第二、學習工作流程、感受公司技術氛圍。

任務

把我們部門所有使用redis服務升級到哨兵模式。 【相關推薦:Redis影片教學

redis的多種模式

都說了升級到哨兵模式,那之前用的不是哨兵模式,一定還有其他模式。

單機模式、主從模式、哨兵模式、叢集模式

#單機模式

這個最簡單,一看就懂。

就是安裝一個redis,啟動起來,業務呼叫即可。具體安裝步驟和啟動步驟就不贅述了,網路上隨便搜一下就有了。

單機在許多場景也是有使用的,例如在一個並非必須保證高可用的情況下。

咳咳,其實我們的服務使用的就是redis單機模式,所以來了就讓我改為哨兵模式。

說說單機的優缺點吧。

優點:

  • 部署簡單,0成本。
  • 成本低,沒有備用節點,不需要其他的開銷。
  • 高效能,單機不需要同步數據,數據天然一致性。

缺點:

  • 可靠性保證不是很好,單一節點有宕機的風險。
  • 單機高效能受限於CPU的處理能力,redis是單執行緒的。

單機模式選擇需要依照自己的業務場景去選擇,如果需要很高的效能、可靠性,單機就不太合適了。

主從複製

主從複製,是指將一台Redis伺服器的數據,複製到其他的Redis伺服器。

前者稱為主節點(master),後者稱為從節點(slave);資料的複製是單向的,只能由主節點到從節點。

快速了解Redis中的單機、主從、哨兵和叢集模式

主從模式配置很簡單,只需要在從節點配置主節點的ip和連接埠號碼。

slaveof <masterip> <masterport>
# 例如
# slaveof 192.168.1.214 6379</masterport></masterip>

啟動主從節點的所有服務,查看日誌即可以看到主從節點之間的服務連接。

從上面很容易就想到一個問題,既然主從複製,代表master和slave的資料都是一樣的,有資料冗餘問題。

在程式設計上,為了高可用性和高效能,是允許有冗餘存在的。這點希望大家在設計系統的時候要考慮進去,不用為公司省下這一點資源。

對於追求極致使用者體驗的產品,是絕對不允許有宕機存在的。

主從模式在許多系統設計時都會考慮,一個master掛在多個slave節點,當master服務宕機,會選舉產生一個新的master節點,從而保證服務的高可用性。

主從模式的優點:

  • 一旦主節點宕機,從節點 作為主節點的備份 可以隨時頂上來。

  • 擴充 主節點讀取能力,分擔主節點讀取壓力。

  • 高可用基石:除了上述作用以外,主從複製還是哨兵模式和集群模式能夠實施的基礎,因此說主從複製是Redis高可用的基石。

也有對應的缺點,例如我剛剛提到的資料冗餘問題:

  • #一旦主節點宕機從節點 晉升成主節點,同時需要修改應用程式主節點位址,還需要指令所有從節點複製 新的主節點,整個過程需要人工幹預
  • 主節點寫入能力 受到 單機的限制
  • 主節點儲存能力 受到 單機的限制

哨兵模式

剛剛提到了,主從模式,當主節點宕機之後,從節點是可以作為主節點頂上來,繼續提供服務的。

但是有一個問題,主節點的IP已經變動了,此時應用服務還是拿著主節點的位址去訪問,這...

##於是,在Redis 2.8版本開始引入,就有了哨兵這個概念。

複製的基礎上,哨兵實現了自動化的故障復原。

快速了解Redis中的單機、主從、哨兵和叢集模式

如圖,哨兵節點由兩個部分組成,哨兵節點和資料節點:

##哨兵節點:哨兵系統由一個或多個哨兵節點組成,哨兵節點是特殊的redis節點,不儲存資料。
  • 資料節點:主節點和從節點都是資料節點。
  • 存取redis叢集的資料都是透過哨兵叢集的,哨兵監控整個redis叢集。

一旦發現redis叢集出現了問題,例如剛剛說的主節點掛了,從節點會頂上來。但是主節點位址變了,這時候應用服務無感知,也不用更改存取位址,因為哨兵才是和應用程式服務做互動的。

Sentinel 很好的解決了故障轉移,在高可用方面又上升了一個台階,當然Sentinel還有其他功能。

例如

主節點存活偵測

主從運行情況偵測主從切換Redis的Sentinel最小配置是

一主一從

說下哨兵模式監控的原理

每個Sentinel以每秒鐘一次的頻率,向它

所有

主伺服器從伺服器 以及其他Sentinel實例 傳送一個PING 指令。

快速了解Redis中的單機、主從、哨兵和叢集模式如果一個實例(instance)距離最後一次有效回覆PING指令的時間超過down-after-milliseconds 所指定的值,那麼這個實例會被Sentinel標記為

主觀下線

如果一個

主伺服器

被標記為主觀下線,那麼正在監視這個主伺服器的所有 Sentinel 節點,要以每秒一次 的頻率確認該主伺服器是否的確進入了主觀下線 狀態。 如果一個主伺服器被標記為主觀下線,並且有

足夠數量

的Sentinel(至少要達到設定檔指定的數量)在指定的時間範圍內同意這個判斷,那麼這個該主伺服器被標記為客觀下線在一般情況下, 每個 Sentinel 會以每 10秒一次的頻率,向它已知的所有 主伺服器 和 從伺服器 發送 INFO 命令。

當一個

主伺服器

被Sentinel標記為客觀下線 時,Sentinel 向下線主伺服器的所有從伺服器發送INFO 指令的頻率,會從10秒一次改為每秒一次。 Sentinel和其他Sentinel 協商

主節點

的狀態,如果主節點處於SDOWN`狀態,則投票自動選出新的主節點。將剩餘的 從節點 指向 新的主節點 進行 資料複製當沒有足夠數量的 Sentinel 同意 主伺服器 下線時, 主伺服器 的

客觀下線狀態

就會被移除。當 主伺服器 重新向 Sentinel的PING指令傳回 有效回覆 時,主伺服器 的 主觀下線狀態 就會被移除。

哨兵模式的優缺點

優點:

哨兵模式是基於主從模式的,所有主從的優點,哨兵模式都具有。
  • 主從可以自動切換,系統更健壯,可用性更高。
  • Sentinel 會持續的檢查 主伺服器 和 從伺服器 是否正常運作。當被監控的某個 Redis 伺服器出現問題,Sentinel 會透過API腳本向管理員或其他的應用程式發送通知。
  • 缺點:
  • Redis较难支持在线扩容,对于集群,容量达到上限时在线扩容会变得很复杂。

我的任务

我部署的redis服务就如上图所示,三个哨兵节点,三个主从复制节点。

使用java的jedis去访问我的redis服务,下面来一段简单的演示代码(并非工程里面的代码):

public static void testSentinel() throws Exception {
     //mastername从配置中获取或者环境变量,这里为了演示
         String masterName = "master";
         Set<String> sentinels = new HashSet<>();
     // sentinel的IP一般会从配置文件获取或者环境变量,这里为了演示
         sentinels.add("192.168.200,213:26379");
         sentinels.add("192.168.200.214:26380");
         sentinels.add("192.168.200.215:26381");
 
     //初始化过程做了很多工作
         JedisSentinelPool pool = new JedisSentinelPool(masterName, sentinels); 
     //获取到redis的client
         Jedis jedis = pool.getResource();
     //写值到redis
         jedis.set("key1", "value1");
     //读取数据
     jedis.get("key1");
}

具体部署的配置文件这里太长了,需要的朋友可以公众号后台回复【redis配置】获取。

听起来是入职第二天就部署了任务感觉很难的样子。

其实现在看来是个so easy的任务,申请一个redis集群,自己配置下。在把工程里面使用到redis的地方改一下,之前使用的是一个两个单机节点。

干完,收工。

快速了解Redis中的單機、主從、哨兵和叢集模式

虽然领导的任务完成了,但并不意味着学习redis的路结束了。爱学习的龙叔,继续研究了下redis的集群模式。

集群模式

主从不能解决故障自动恢复问题,哨兵已经可以解决故障自动恢复了,那到底为啥还要集群模式呢?

主从和哨兵都还有另外一些问题没有解决,单个节点的存储能力是有上限,访问能力是有上限的。

Redis Cluster 集群模式具有 高可用可扩展性分布式容错 等特性。

Cluster 集群模式的原理

通过数据分片的方式来进行数据共享问题,同时提供数据复制和故障转移功能。

之前的两种模式数据都是在一个节点上的,单个节点存储是存在上限的。集群模式就是把数据进行分片存储,当一个分片数据达到上限的时候,就分成多个分片。

数据分片怎么分?

集群的键空间被分割为16384个slots(即hash槽),通过hash的方式将数据分到不同的分片上的。

HASH_SLOT = CRC16(key) & 16384 复制代码

CRC16是一种循环校验算法,这里不是我们研究的重点,有兴趣可以看看。

这里用了位运算得到取模结果,位运算的速度高于取模运算。

快速了解Redis中的單機、主從、哨兵和叢集模式

有一个很重要的问题,为什么是分割为16384个槽?这个问题可能会被面试官随口一问

数据分片之后怎么查,怎么写?
快速了解Redis中的單機、主從、哨兵和叢集模式

读请求分配给slave节点,写请求分配给master,数据同步从master到slave节点。

读写分离提高并发能力,增加高性能。

如何做到水平扩展?

快速了解Redis中的單機、主從、哨兵和叢集模式

master节点可以做扩充,数据迁移redis内部自动完成。

当你新增一个master节点,需要做数据迁移,redis服务不需要下线。

举个栗子:上面的有三个master节点,意味着redis的槽被分为三个段,假设三段分别是0~7000,7001~12000、12001~16383。

现在因为业务需要新增了一个master节点,四个节点共同占有16384个槽。

槽需要重新分配,数据也需要重新迁移,但是服务不需要下线。

redis集群的重新分片由redis内部的管理软件redis-trib负责执行。redis提供了进行重新分片的所有命令,redis-trib通过向节点发送命令来进行重新分片。

如何做故障转移?

快速了解Redis中的單機、主從、哨兵和叢集模式

假如途中红色的节点故障了,此时master3下面的从节点会通过 选举 产生一个主节点。替换原来的故障节点。

此过程和哨兵模式的故障转移是一样的。

总结

每种模式都有各自的优缺点,在实际使用场景中要根据业务特点去选择合适的模式。

redis是一个非常常用的中间件,作为一个使用者来说,学习成本一点不高。

如果作为一个很好的中间件去研究的话,还是有很多值得学习和借鉴的地方。比如redis的各种数据结构(动态字符串、跳跃表、集合、字典等)、高效的内存分配(jemalloc)、高效的IO模型等等。

每個點都可以深入研究,在後期設計高並發、高可用系統的時候融入進去。

更多程式相關知識,請造訪:程式設計影片! !

以上是快速了解Redis中的單機、主從、哨兵和叢集模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除