Redis分布式緩存超詳細總結!

文章目錄

  • 前言
  • 一、Redis持久化解決數據丟失問題
    • 1.RDB(Redis Database Backup file)持久化
      • (1)執行RDB
      • (2)RDB方式bgsave的基本流程
      • (3)RDB會在什么時候執行?save 60 1000代表什么含義
      • (4)RDB的缺點
    • 2. AOF(Append Only File)持久化
      • (1)執行AOF
      • (2)RDB與AOF的比較
  • 二、Redis主從解決并發問題
    • 1.搭建主從架構
    • 2.數據同步原理
      • (1)主從的全量同步原理![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/1d1eeea7620942a681fd2b5c7052f50f.png)
      • (2)主從的增量同步原理
  • 三、Redis哨兵解決故障恢復問題
    • 1. 哨兵的作用和原理
      • (1)哨兵的作用
      • (2)哨兵如何監控
      • (3)哨兵如何選舉新的master
      • (4)哨兵如何實現故障轉移
    • 2.搭建哨兵集群
  • 四、Redis分片集群解決存儲能力問題
    • 1. 搭建分片集群
    • 2. 散列插槽
    • 3.集群伸縮
    • 4.故障轉移


前言

單點Redis存在以下問題:

  • 數據丟失問題:Redis是內存存儲,服務重啟可能會丟失數據
  • 并發能力問題:單節點Redis并發能力雖然不錯,但也無法滿足如618這樣的高并發場景
  • 故障恢復問題:如果Redis宕機,則服務不可用,需要一種自動的故障恢復手段
  • 存儲能力問題:Redis基于內存,單節點能存儲的數據量難以滿足海量數據需求

為了解決上述問題,Redis分布式緩存提供了以下解決方案:

  • 解決數據丟失問題:實現Redis數據持久化
  • 解決并發能力問題:搭建主從集群,實現讀寫分離
  • 解決故障恢復問題:利用Redis哨兵,實現健康檢測和自動恢復
  • 解決存儲能力問題:搭建分片集群,利用插槽機制實現動態擴容

一、Redis持久化解決數據丟失問題

1.RDB(Redis Database Backup file)持久化

RDB全稱Redis Database Backup file(Redis數據備份文件),也被叫做Redis數據快照。簡單來說就是把內存中的所有數據都記錄到磁盤中。當Redis實例故障重啟后,從磁盤讀取快照文件,恢復數據。快照文件稱為RDB文件,默認是保存在當前運行目錄。

(1)執行RDB

打開Redis命令行客戶端,執行命令save即完成RDB緩存,save命令默認是由Redis主進程來執行RDB,會阻塞所有命令。而命令bgsave是開啟一個子線程執行RDB,避免主進程受到影響。

(2)RDB方式bgsave的基本流程

  • fork主進程得到一個子進程,共享內存空間
  • 子進程讀取內存數據并寫入新的RDB文件
  • 用新RDB文件替換舊的RDB文件。

(3)RDB會在什么時候執行?save 60 1000代表什么含義

  • 默認是服務停止時。
  • 代表60秒內至少執行1000次修改則觸發RDB

(4)RDB的缺點

  • RDB執行間隔時間長,兩次RDB之間寫入數據有丟失的風險
  • fork子進程、壓縮、寫出RDB文件都比較耗時

2. AOF(Append Only File)持久化

AOF全稱為Append Only File(追加文件)。Redis處理的每一個寫命令都會記錄在AOF文件,可以看做是命令日志文件。

(1)執行AOF

AOF默認是關閉的,需要修改redis.conf配置文件來開啟AOF。

# 是否開啟AOF功能,默認是no
appendonly yes
# AOF文件的名稱
appendfilename "appendonly.aof"

AOF的命令記錄的頻率也可以通過redis.conf文件來配置。

# 表示每執行一次寫命令,立即記錄到AOF文件
appendfsync always 
# 寫命令執行完先放入AOF緩沖區,然后表示每隔1秒將緩沖區數據寫到AOF文件,是默認方案
appendfsync everysec 
# 寫命令執行完先放入AOF緩沖區,由操作系統決定何時將緩沖區內容寫回磁盤
appendfsync no

因為是記錄命令,AOF文件會比RDB文件大的多。而且AOF會記錄對同一個key的多次寫操作,但只有最后一次寫操作才有意義。通過執行bgrewriteaof命令,可以讓AOF文件執行重寫功能,用最少的命令達到相同效果。
Redis也會在觸發閾值時自動去重寫AOF文件。閾值也可以在redis.conf中配置:

# AOF文件比上次文件 增長超過多少百分比則觸發重寫
auto-aof-rewrite-percentage 100
# AOF文件體積最小多大以上才觸發重寫
auto-aof-rewrite-min-size 64mb 

(2)RDB與AOF的比較

在這里插入圖片描述

二、Redis主從解決并發問題

1.搭建主從架構

單節點Redis的并發能力是有上限的,要進一步提高Redis的并發能力,就需要搭建主從集群,實現讀寫分離。
具體的搭建過程可以參考我的這篇博文,全過程一步步搭建。
https://blog.csdn.net/weixin_43378573/article/details/134787401?spm=1001.2014.3001.5502

2.數據同步原理

完成Redis主從集群搭建后,可以看到,主從節點會完成數據同步。

(1)主從的全量同步原理在這里插入圖片描述

主節點給從節點發送RDB文件,將內存形成快照整體發送給從節點。這種同步很消耗性能,因為生成RDB文件耗時且消耗性能,只有主從節點第一次連接的時候才會這樣同步。
master如何判斷slave是不是第一次來同步數據?這里會用到兩個很重要的概念:

  • Replication Id:簡稱replid,是數據集的標記,id一致則說明是同一數據集。每一個master都有唯一的replid,slave則會繼承master節點的replid
  • offset:偏移量,隨著記錄在repl_baklog中的數據增多而逐漸增大。slave完成同步時也會記錄當前同步的offset。如果slave的offset小于master的offset,說明slave數據落后于master,需要更新。

因此slave做數據同步,必須向master聲明自己的replication id 和offset,master才可以判斷到底需要同步哪些數據。master就是通過判斷Replication Id來判斷該從節點是不是第一次連接。

(2)主從的增量同步原理

主從節點第一次同步是全量同步,但如果slave重啟后同步,則執行增量同步。
在這里插入圖片描述repl_baklog大小有上限,寫滿后會覆蓋最早的數據。如果slave斷開時間過久,導致尚未備份的數據被覆蓋,則無法基于log做增量同步,只能再次全量同步。
可以從以下幾個方面來優化Redis主從集群:

  • 在master中配置repl-diskless-sync yes啟用無磁盤復制,避免全量同步時的磁盤IO。
  • Redis單節點上的內存占用不要太大,減少RDB導致的過多磁盤IO
  • 適當提高repl_baklog的大小,發現slave宕機時盡快實現故障恢復,盡可能避免全量同步
  • 限制一個master上的slave節點數量,如果實在是太多slave,則可以采用主-從-從鏈式結構,減少master壓力

三、Redis哨兵解決故障恢復問題

1. 哨兵的作用和原理

(1)哨兵的作用

Redis提供了哨兵(Sentinel)機制來實現主從集群的自動故障恢復。哨兵的作用如下:

  • 監控:Sentinel 會不斷檢查您的master和slave是否按預期工作
  • 自動故障恢復:如果master故障,Sentinel會將一個slave提升為master。當故障實例恢復后也以新的master為主
  • 通知:Sentinel充當Redis客戶端的服務發現來源,當集群發生故障轉移時,會將最新信息推送給Redis的客戶端

(2)哨兵如何監控

Sentinel基于心跳機制監測服務狀態,每隔1秒向集群的每個實例發送ping命令:

  • 主觀下線:如果某sentinel節點發現某實例未在規定時間響應,則認為該實例主觀下線。
  • 客觀下線:若超過指定數量(quorum)的sentinel都認為該實例主觀下線,則該實例客觀下線。quorum值最好超過Sentinel實例數量的一半。

(3)哨兵如何選舉新的master

一旦發現master故障,sentinel需要在salve中選擇一個作為新的master,選擇依據是這樣的:

  • 首先會判斷slave節點與master節點斷開時間長短,如果超過指定值(down-after-milliseconds * 10)則會排除該slave節點
  • 然后判斷slave節點的slave-priority值,越小優先級越高,如果是0則永不參與選舉
  • 如果slave-prority一樣,則判斷slave節點的offset值,越大說明數據越新,優先級越高
  • 最后是判斷slave節點的運行id大小,越小優先級越高。

(4)哨兵如何實現故障轉移

  • sentinel給備選的slave1節點發送slaveof no one命令,讓該節點成為master
  • sentinel給所有其它slave發送命令,讓這些slave成為新master的從節點,開始從新的master上同步數據。
  • 最后,sentinel將故障節點標記為slave,當故障節點恢復后會自動成為新的master的slave節點

2.搭建哨兵集群

具體的哨兵集群搭建過程可以參考我的這篇博文,全過程一步步搭建。
https://blog.csdn.net/weixin_43378573/article/details/134789082?spm=1001.2014.3001.5501

四、Redis分片集群解決存儲能力問題

1. 搭建分片集群

主從和哨兵可以解決高可用、高并發讀的問題。但是依然有兩個問題沒有解決:

  • 海量數據存儲問題
  • 高并發寫的問題

使用分片集群可以解決上述問題,分片集群特征:

  • 集群中有多個master,每個master保存不同數據
  • 每個master都可以有多個slave節點
  • master之間通過ping監測彼此健康狀態
  • 客戶端請求可以訪問集群任意節點,最終都會被轉發到正確節點
    具體的分片集群搭建過程可以參考我的這篇博文,全過程一步步搭建。
    https://blog.csdn.net/weixin_43378573/article/details/134812229

2. 散列插槽

Redis會把每一個master節點映射到0~16383共16384個插槽(hash slot)上,查看集群信息時就能看到:
在這里插入圖片描述
數據key不是與節點綁定,而是與插槽綁定。redis會根據key的有效部分計算插槽值,分兩種情況:

  • key中包含"{}",且“{}”中至少包含1個字符,“{}”中的部分是有效部分
  • key中不包含“{}”,整個key都是有效部分
    例如:key是num,那么就根據num計算,如果是{itcast}num,則根據itcast計算。計算方式是利用CRC16算法得到一個hash值,然后對16384取余,得到的結果就是slot值。

3.集群伸縮

Redis集群可以動態的增加或移除節點,redis-cli --cluster提供了很多操作集群的命令,可以通過下面方式查看。
在這里插入圖片描述

4.故障轉移

當集群中有一個master宕機會發生什么呢?

  • 首先是該實例與其它實例失去連接
  • 然后是疑似宕機:
    在這里插入圖片描述
  • 最后是確定下線,自動提升一個slave為新的master:
    在這里插入圖片描述
    以上屬于自動的故障轉移,有時候如果某個master節點需要維護的情況,就需要手動的故障轉移。
    利用cluster failover命令可以手動讓集群中的某個master宕機,切換到執行cluster failover命令的這個slave節點,實現無感知的數據遷移。其流程如下。
    在這里插入圖片描述
    【完結撒花~】

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214054.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214054.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214054.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VBA信息獲取與處理:在EXCEL中隨機函數的利用

《VBA信息獲取與處理》教程(版權10178984)是我推出第六套教程,目前已經是第一版修訂了。這套教程定位于最高級,是學完初級,中級后的教程。這部教程給大家講解的內容有:跨應用程序信息獲得、隨機信息的利用、電子郵件的發送、VBA互…

RabbitMQ學習

一、RabbitMQ 采用 AMQP 高級消息隊列協議的一種消息隊列技術,最大的特點就是消費并不需要確保提供方存在,實現了服務之間的高度解耦 1、在分布式系統下具備異步,削峰,負載均衡等一系列高級功能; 2、擁有持久化的機制,進程消息,隊列中的信息也可以保存下…

計算機網絡(三) | 數據鏈路層 PPP協議、廣播CSMA/CD協議、集線器、交換器、擴展and高速以太網

文章目錄 1 數據鏈路基本概念和問題1.1 基本概念1.2 基本問題(1)封裝成幀(2)透明傳輸(3)差錯控制 2.數據鏈路層協議2.1 點對點 PPP協議2.1.1 需要實現的2.1.2 PPP組成2.1.3 幀格式2.1.4 工作流程 2.2 廣播 …

內網穿透的應用-如何結合Cpolar內網穿透工具實現在IDEA中遠程訪問家里或者公司的數據庫

文章目錄 1. 本地連接測試2. Windows安裝Cpolar3. 配置Mysql公網地址4. IDEA遠程連接Mysql小結 5. 固定連接公網地址6. 固定地址連接測試 IDEA作為Java開發最主力的工具,在開發過程中需要經常用到數據庫,如Mysql數據庫,但是在IDEA中只能連接本…

配置BFD多跳檢測示例

BFD簡介 定義 雙向轉發檢測BFD(Bidirectional Forwarding Detection)是一種全網統一的檢測機制,用于快速檢測、監控網絡中鏈路或者IP路由的轉發連通狀況。 目的 為了減小設備故障對業務的影響,提高網絡的可靠性,網…

“==”和“equals”的區別

“”和“equals”的區別 Java中“”和“equals”的區別在于,它們比較的內容不同。""比較的是對象的引用是否相等,而equals比較的是對象的值是否相等。 具體來說,以下是兩個操作符之間的區別: “”比較的是對象的引用&…

【鏈表Linked List】力扣-117 填充每個節點的下一個右側節點指針II

目錄 問題描述 解題過程 官方題解 問題描述 給定一個二叉樹: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每個 next 指針,讓這個指針指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指針設置為 N…

C++中字符串詳解

在C語言中只能通過字符串數組來模擬字符串,沒有字符串類型。在C引入了string類來表示字符串類型。從而用它定義字符串。 在C語言中: char str[] "abc"; char str[] {a,b,c,\0}; char* str "abc"; //這三種形式是C語言…

因為高考考砸了,我學了計算機

2015年,是我高中的最后一年。 2023年,我已在計算機領域工作十多個年頭。 我出生在東部省份的一個不沿海小縣城,在那里度過了我高考前的17年。起點平平,沒有任何特長傍身,也可以說是毫無亮點;成績中等&#…

代碼隨想錄算法訓練營第四十五天 _ 動態規劃_ 70. 爬樓梯、322.零錢兌換、279.完全平方數、139.單詞拆分。

學習目標: 動態規劃五部曲: ① 確定dp[i]的含義 ② 求遞推公式 ③ dp數組如何初始化 ④ 確定遍歷順序 ⑤ 打印遞歸數組 ---- 調試 引用自代碼隨想錄! 60天訓練營打卡計劃! 學習內容: 70. 爬樓梯 動態規劃五步曲&…

中文語音標注工具FunASR(語音識別)

全稱 A Fundamental End-to-End Speech Recognition Toolkit(一個語音識別工具) 可能大家用過whisper(openAi),它【標注英語的確很完美】,【但中文會出現標注錯誤】或搞了個沒說的詞替換上去,所…

【Fiddler】IDEA配置Fiddler

由于遇上了個迷之請求,接口調用正常,OkHttpClient調用正常,RestTemplate調用失敗,所以想看看發送的報文是怎樣的,所以就下了個Fiddler 問題 下載安裝,以及如何安裝證書,網上太多相同文章了&…

APP備案,最新獲取安卓簽名文件中MD5等信息方法

1.通過簽名文件獲取SHA1和SHA256 直接通過cmd執行命令 keytool -list -v -keystore xxxxx/xxx/xx/xxx.keystore輸入后回車會提示輸入密碼庫口令,直接輸入Keystore密碼(輸入過程中終端上不會顯示,輸完回車就行) 2.獲取md5 由于…

redis集群(cluster)筆記

1. 定義: 由于數據量過大,單個Master復制集難以承擔,因此需要對多個復制集進行集群,形成水平擴展每個復制集只負責存儲整個數據集的一部分,這就是Redis的集群,其作用是提供在多個Redis節點間共享數據的程序…

IDEA啟動失敗報錯解決思路

IDEA啟動失敗報錯解決思路 背景:在IDEA里安裝插件失敗,重啟后直接進不去了,然后分析問題解決問題的過程記錄下來。方便下次遇到快速解決。也是一種解決問題的思路,分享出去。 啟動報錯信息 Internal error. Please refer to https…

加索引后 sql loader-951

加索引后 sql loader-951 現象解決過程最終解決 現象 之前使用sqlldr正常,加表索引后使用sqlldr時 報錯 SQL Loader-951 解決過程 百度,說可能是鎖表(或者表未提交) 查看沒有對應未commit數據,且沒有鎖表。查看對應…

【筆記 Python 01】基本數據類型、基本類型

文章目錄 類型是否可轉換基本類型匯總集合 set【創建】【添加元素】【刪除】【清空】【差集】【交集】【并集】【update 批量更新】【set → numpy】 元組 tuple ()【描述】【優點】【元組的創建】【元組的插入】【刪除元組】 字典 dict {}【創建空列表】【創建列表】【字典的獲…

ke14--10章-1數據庫JDBC介紹

注冊數據庫(兩種方式),獲取連接,通過Connection對象獲取Statement對象,使用Statement執行SQL語句。操作ResultSet結果集 ,回收數據庫資源. 需要語句: 1Class.forName("DriverName");2Connection conn DriverManager.getConnection(String url, String user, String…

抖音各加密參數說明和獲取(含代碼)

?X-Bogus:X-Bogus是一種防數據包偽造的一個參數, 又稱為x偽造,主要用于反爬蟲,這個是某節公司下面基礎服務,這個反爬蟲機制幾乎用在了它所有的產品中,不過,只要是能正常使用,這些東…

什么是Non EC

今天在填一個表單時,里面有個Non EC的選項,不解其意。原來是歐盟成員國國民的意思,因為歐盟法規各方面比較嚴厲,所以會單列出來,作為一個條件。 互聯網查詢結果如下: Non-EC是指非歐盟(EU&#…