快速了解Redis中的單機、主從、哨兵和叢集模式
這篇文章帶大家了解Redis中的四種模式:單機、主從、哨兵、集群。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
少點程式碼,多點頭髮
入職第一周,我被坑了
最近剛入職新公司,本來想著這剛來新公司,一般都是熟悉熟悉公司同事,看看組內工程文檔,找幾個demo自己練練手。
咳咳,萬萬沒想到啊,一切都是我以為的,我還是太嫩了。
入職那天下午,組長給我丟了幾份文檔,讓我看下這個這些工程的快取系統問題,讓我把redis升級為哨兵模式。
接到任務的我,內心是懵逼的。
第一、不知道都是些什麼類型的服務在用redis。
第二、不知道以什麼姿勢在用redis。
第三、如果redis掛了會不會影響使用者。
第四、我完全沒用過redis。
雖然說沒幹過,但咋也不慫。畢竟要是天天乾的都是幹過的工作,那就是有問題了,很快就被優化掉了。
看來社招入職和校招還是不一樣的,校招進來都會有些入職訓練或是新人班課程。
透過這些形式的教育,第一、了解公司的文化、價值觀,第二、學習工作流程、感受公司技術氛圍。
任務
把我們部門所有使用redis服務升級到哨兵模式。 【相關推薦:Redis影片教學】
redis的多種模式
都說了升級到哨兵模式,那之前用的不是哨兵模式,一定還有其他模式。
單機模式、主從模式、哨兵模式、叢集模式
#單機模式
這個最簡單,一看就懂。
就是安裝一個redis,啟動起來,業務呼叫即可。具體安裝步驟和啟動步驟就不贅述了,網路上隨便搜一下就有了。
單機在許多場景也是有使用的,例如在一個並非必須保證高可用的情況下。
咳咳,其實我們的服務使用的就是redis單機模式,所以來了就讓我改為哨兵模式。
說說單機的優缺點吧。
優點:
- 部署簡單,0成本。
- 成本低,沒有備用節點,不需要其他的開銷。
- 高效能,單機不需要同步數據,數據天然一致性。
缺點:
- 可靠性保證不是很好,單一節點有宕機的風險。
- 單機高效能受限於CPU的處理能力,redis是單執行緒的。
單機模式選擇需要依照自己的業務場景去選擇,如果需要很高的效能、可靠性,單機就不太合適了。
主從複製
主從複製,是指將一台Redis伺服器的數據,複製到其他的Redis伺服器。
前者稱為主節點(master),後者稱為從節點(slave);資料的複製是單向的,只能由主節點到從節點。
主從模式配置很簡單,只需要在從節點配置主節點的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叢集出現了問題,例如剛剛說的主節點掛了,從節點會頂上來。但是主節點位址變了,這時候應用服務無感知,也不用更改存取位址,因為哨兵才是和應用程式服務做互動的。
Sentinel 很好的解決了故障轉移,在高可用方面又上升了一個台階,當然Sentinel還有其他功能。
例如
主節點存活偵測、主從運行情況偵測、主從切換。 Redis的Sentinel最小配置是
一主一從。 說下哨兵模式監控的原理
每個Sentinel以每秒鐘一次的頻率,向它
所有的主伺服器、從伺服器 以及其他Sentinel實例 傳送一個PING 指令。
如果一個實例(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 Cluster 集群模式具有 高可用、可扩展性、分布式、容错 等特性。
Cluster 集群模式的原理
通过数据分片的方式来进行数据共享问题,同时提供数据复制和故障转移功能。
之前的两种模式数据都是在一个节点上的,单个节点存储是存在上限的。集群模式就是把数据进行分片存储,当一个分片数据达到上限的时候,就分成多个分片。
数据分片怎么分?
集群的键空间被分割为16384个slots(即hash槽),通过hash的方式将数据分到不同的分片上的。
HASH_SLOT = CRC16(key) & 16384 复制代码
CRC16是一种循环校验算法,这里不是我们研究的重点,有兴趣可以看看。
这里用了位运算得到取模结果,位运算的速度高于取模运算。

有一个很重要的问题,为什么是分割为16384个槽?这个问题可能会被面试官随口一问
数据分片之后怎么查,怎么写?
读请求分配给slave节点,写请求分配给master,数据同步从master到slave节点。
读写分离提高并发能力,增加高性能。
如何做到水平扩展?
master节点可以做扩充,数据迁移redis内部自动完成。
当你新增一个master节点,需要做数据迁移,redis服务不需要下线。
举个栗子:上面的有三个master节点,意味着redis的槽被分为三个段,假设三段分别是0~7000,7001~12000、12001~16383。
现在因为业务需要新增了一个master节点,四个节点共同占有16384个槽。
槽需要重新分配,数据也需要重新迁移,但是服务不需要下线。
redis集群的重新分片由redis内部的管理软件redis-trib负责执行。redis提供了进行重新分片的所有命令,redis-trib通过向节点发送命令来进行重新分片。
如何做故障转移?
假如途中红色的节点故障了,此时master3下面的从节点会通过 选举 产生一个主节点。替换原来的故障节点。
此过程和哨兵模式的故障转移是一样的。
总结
每种模式都有各自的优缺点,在实际使用场景中要根据业务特点去选择合适的模式。
redis是一个非常常用的中间件,作为一个使用者来说,学习成本一点不高。
如果作为一个很好的中间件去研究的话,还是有很多值得学习和借鉴的地方。比如redis的各种数据结构(动态字符串、跳跃表、集合、字典等)、高效的内存分配(jemalloc)、高效的IO模型等等。
每個點都可以深入研究,在後期設計高並發、高可用系統的時候融入進去。
更多程式相關知識,請造訪:程式設計影片! !
以上是快速了解Redis中的單機、主從、哨兵和叢集模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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