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

Redis是一個開源的內存數據結構存儲,用作數據庫、緩存和消息代理,適合需要快速響應和高並發的場景。 1.Redis使用內存存儲數據,提供微秒級的讀寫速度。 2.它支持多種數據結構,如字符串、列表、集合等。 3.Redis通過RDB和AOF機制實現數據持久化。 4.使用單線程模型和多路復用技術高效處理請求。 5.性能優化策略包括LRU算法和集群模式。

Redis的功能主要包括緩存、會話管理和其他功能:1)緩存功能通過內存存儲數據,提高讀取速度,適用於電商網站等高頻訪問場景;2)會話管理功能在分佈式系統中共享會話數據,並通過過期時間機制自動清理;3)其他功能如發布-訂閱模式、分佈式鎖和計數器,適用於實時消息推送和多線程系統等場景。

Redis的核心功能包括內存存儲和持久化機制。 1)內存存儲提供極快的讀寫速度,適用於高性能應用。 2)持久化通過RDB和AOF兩種方式確保數據不丟失,選擇依據應用需求。

Redis'sserver-sedierations offerfunctions andTriggersForexeCutingCompleXoperationsontheserver.1)函數functionsAllowCompOustomoperationsInlua,JavaScript,javaScript,orredis'sscriptinglanguigh,增強效率和增強性。 2)

redisisbothadatabaseandaserver.1)asadatabase,ituseSin-memorystorageforfastaccess,ifealforreal-timeapplications andCaching.2)Asaserver,ItsupportsPub/submessagingAndluAsessingandluAsessingandluascriptingftingftingftingftingftingftingftingfinteral-timecommunicationandserverserverserverserverserverserverserver-soperations。

Redis是NoSQL數據庫,提供高性能和靈活性。 1)通過鍵值對存儲數據,適合處理大規模數據和高並發。 2)內存存儲和單線程模型確保快速讀寫和原子性。 3)使用RDB和AOF機制進行數據持久化,支持高可用性和橫向擴展。

Redis是一种内存数据结构存储系统,主要用作数据库、缓存和消息代理。它的核心特点包括单线程模型、I/O多路复用、持久化机制、复制与集群功能。Redis在实际应用中常用于缓存、会话存储和消息队列,通过选择合适的数据结构、使用管道和事务、以及进行监控和调优,可以显著提升其性能。

Redis和SQL數據庫的主要區別在於:Redis是內存數據庫,適用於高性能和靈活性需求;SQL數據庫是關係型數據庫,適用於復雜查詢和數據一致性需求。具體來說,1)Redis提供高速數據訪問和緩存服務,支持多種數據類型,適用於緩存和實時數據處理;2)SQL數據庫通過表格結構管理數據,支持複雜查詢和事務處理,適用於電商和金融系統等需要數據一致性的場景。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

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

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。