目錄
入職第一周,我被坑了
任務
redis的多種模式
#單機模式
主從複製
哨兵模式
每個Sentinel以每秒鐘一次的頻率,向它
我的任务
集群模式
Cluster 集群模式的原理
数据分片怎么分?
数据分片之后怎么查,怎么写?
如何做到水平扩展?
如何做故障转移?
总结
首頁 資料庫 Redis 快速了解Redis中的單機、主從、哨兵和叢集模式

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

May 06, 2021 am 11:08 AM
redis 單機 哨兵 叢集

這篇文章帶大家了解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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

centos redis如何配置Lua腳本執行時間 centos redis如何配置Lua腳本執行時間 Apr 14, 2025 pm 02:12 PM

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

redis命令行怎麼用 redis命令行怎麼用 Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

redis過期策略怎麼設置 redis過期策略怎麼設置 Apr 10, 2025 pm 10:03 PM

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

如何優化debian readdir的性能 如何優化debian readdir的性能 Apr 13, 2025 am 08:48 AM

在Debian系統中,readdir系統調用用於讀取目錄內容。如果其性能表現不佳,可嘗試以下優化策略:精簡目錄文件數量:盡可能將大型目錄拆分成多個小型目錄,降低每次readdir調用處理的項目數量。啟用目錄內容緩存:構建緩存機制,定期或在目錄內容變更時更新緩存,減少對readdir的頻繁調用。內存緩存(如Memcached或Redis)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信

redis計數器怎麼實現 redis計數器怎麼實現 Apr 10, 2025 pm 10:21 PM

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

See all articles