這篇文章帶大家了解Redis中的四種模式:單機、主從、哨兵、集群。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
少點程式碼,多點頭髮
最近剛入職新公司,本來想著這剛來新公司,一般都是熟悉熟悉公司同事,看看組內工程文檔,找幾個demo自己練練手。
咳咳,萬萬沒想到啊,一切都是我以為的,我還是太嫩了。
入職那天下午,組長給我丟了幾份文檔,讓我看下這個這些工程的快取系統問題,讓我把redis升級為哨兵模式。
接到任務的我,內心是懵逼的。
第一、不知道都是些什麼類型的服務在用redis。
第二、不知道以什麼姿勢在用redis。
第三、如果redis掛了會不會影響使用者。
第四、我完全沒用過redis。
雖然說沒幹過,但咋也不慫。畢竟要是天天乾的都是幹過的工作,那就是有問題了,很快就被優化掉了。
看來社招入職和校招還是不一樣的,校招進來都會有些入職訓練或是新人班課程。
透過這些形式的教育,第一、了解公司的文化、價值觀,第二、學習工作流程、感受公司技術氛圍。
把我們部門所有使用redis服務升級到哨兵模式。 【相關推薦:Redis影片教學】
都說了升級到哨兵模式,那之前用的不是哨兵模式,一定還有其他模式。
單機模式、主從模式、哨兵模式、叢集模式
這個最簡單,一看就懂。
就是安裝一個redis,啟動起來,業務呼叫即可。具體安裝步驟和啟動步驟就不贅述了,網路上隨便搜一下就有了。
單機在許多場景也是有使用的,例如在一個並非必須保證高可用的情況下。
咳咳,其實我們的服務使用的就是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叢集出現了問題,例如剛剛說的主節點掛了,從節點會頂上來。但是主節點位址變了,這時候應用服務無感知,也不用更改存取位址,因為哨兵才是和應用程式服務做互動的。
Sentinel 很好的解決了故障轉移,在高可用方面又上升了一個台階,當然Sentinel還有其他功能。
例如
主節點存活偵測、主從運行情況偵測、主從切換。 Redis的Sentinel最小配置是
一主一從。 說下哨兵模式監控的原理
的主伺服器、從伺服器 以及其他Sentinel實例 傳送一個PING 指令。
如果一個實例(instance)距離最後一次有效回覆PING指令的時間超過down-after-milliseconds 所指定的值,那麼這個實例會被Sentinel標記為
主觀下線。 如果一個
主伺服器被標記為主觀下線,那麼正在監視這個主伺服器的所有 Sentinel 節點,要以每秒一次 的頻率確認該主伺服器是否的確進入了主觀下線 狀態。 如果一個主伺服器被標記為主觀下線,並且有
足夠數量的Sentinel(至少要達到設定檔指定的數量)在指定的時間範圍內同意這個判斷,那麼這個該主伺服器被標記為客觀下線。 在一般情況下, 每個 Sentinel 會以每 10秒一次的頻率,向它已知的所有 主伺服器 和 從伺服器 發送 INFO 命令。
當一個
主伺服器被Sentinel標記為客觀下線 時,Sentinel 向下線主伺服器的所有從伺服器發送INFO 指令的頻率,會從10秒一次改為每秒一次。 Sentinel和其他Sentinel 協商
主節點的狀態,如果主節點處於SDOWN`狀態,則投票自動選出新的主節點。將剩餘的 從節點 指向 新的主節點 進行 資料複製。 當沒有足夠數量的 Sentinel 同意 主伺服器 下線時, 主伺服器 的
客觀下線狀態就會被移除。當 主伺服器 重新向 Sentinel的PING指令傳回 有效回覆 時,主伺服器 的 主觀下線狀態 就會被移除。
哨兵模式的優缺點我部署的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 集群模式具有 高可用、可扩展性、分布式、容错 等特性。
通过数据分片的方式来进行数据共享问题,同时提供数据复制和故障转移功能。
之前的两种模式数据都是在一个节点上的,单个节点存储是存在上限的。集群模式就是把数据进行分片存储,当一个分片数据达到上限的时候,就分成多个分片。
集群的键空间被分割为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中文網其他相關文章!