Redis集群機制及一個Redis架構演進實例

Replication(主從復制)

Redis的replication機制允許slave從master那里通過網絡傳輸拷貝到完整的數據備份,從而達到主從機制。為了實現主從復制,我們準備三個redis服務,依次命名為master,slave1,slave2。

配置主服務器

為了測試效果,我們先修改主服務器的配置文件redis.conf的端口信息

  1. port 6300

配置從服務器

replication相關的配置比較簡單,只需要把下面一行加到slave的配置文件中。你只需要把ip地址和端口號改一下。

  1. slaveof 192.168.1.1 6379

我們先修改從服務器1的配置文件redis.conf的端口信息和從服務器配置。

  1. port 6301
  2. slaveof 127.0.0.1 6300

我們再修改從服務器2的配置文件redis.conf的端口信息和從服務器配置。

  1. port 6302
  2. slaveof 127.0.0.1 6300

值得注意的是,從redis2.6版本開始,slave支持只讀模式,而且是默認的。可以通過配置項slave-read-only來進行配置。
此外,如果master通過requirepass配置項設置了密碼,slave每次同步操作都需要驗證密碼,可以通過在slave的配置文件中添加以下配置項

  1. masterauth <password>

測試

分別啟動主服務器,從服務器,我們來驗證下主從復制。我們在主服務器寫入一條消息,然后再其他從服務器查看是否成功復制了。

Sentinel(哨兵)

主從機制,上面的方案中主服務器可能存在單點故障,萬一主服務器宕機,這是個麻煩事情,所以Redis提供了Redis-Sentinel,以此來實現主從切換的功能,類似與zookeeper。

Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當用Redis做master-slave的高可用方案時,假如master宕機了,Redis本身(包括它的很多客戶端)都沒有實現自動進行主備切換,而Redis-Sentinel本身也是一個獨立運行的進程,它能監控多個master-slave集群,發現master宕機后能進行自動切換。

它的主要功能有以下幾點

  • 監控(Monitoring):不斷地檢查redis的主服務器和從服務器是否運作正常。
  • 提醒(Notification):如果發現某個redis服務器運行出現狀況,可以通過 API 向管理員或者其他應用程序發送通知。
  • 自動故障遷移(Automatic failover):能夠進行自動切換。當一個主服務器不能正常工作時,會將失效主服務器的其中一個從服務器升級為新的主服務器,并讓失效主服務器的其他從服務器改為復制新的主服務器; 當客戶端試圖連接失效的主服務器時, 集群也會向客戶端返回新主服務器的地址, 使得集群可以使用新主服務器代替失效服務器。

Redis Sentinel 兼容 Redis 2.4.16 或以上版本, 推薦使用 Redis 2.8.0 或以上的版本。

配置Sentinel

必須指定一個sentinel的配置文件sentinel.conf,如果不指定將無法啟動sentinel。首先,我們先創建一個配置文件sentinel.conf


port 26379
sentinel monitor mymaster 127.0.0.1  6300  2

官方典型的配置如下


sentinel monitor mymaster 127.0.0.1  6379  2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1sentinel monitor resque 192.168.1.3  6380  4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5

配置文件只需要配置master的信息就好啦,不用配置slave的信息,因為slave能夠被自動檢測到(master節點會有關于slave的消息)。

需要注意的是,配置文件在sentinel運行期間是會被動態修改的,例如當發生主備切換時候,配置文件中的master會被修改為另外一個slave。這樣,之后sentinel如果重啟時,就可以根據這個配置來恢復其之前所監控的redis集群的狀態。

接下來我們將一行一行地解釋上面的配置項:


sentinel monitor mymaster 127.0.0.1  6379  2

這行配置指示 Sentinel 去監視一個名為 mymaster 的主服務器, 這個主服務器的 IP 地址為 127.0.0.1 , 端口號為 6300, 而將這個主服務器判斷為失效至少需要 2 個 Sentinel 同意,只要同意 Sentinel 的數量不達標,自動故障遷移就不會執行。

不過要注意, 無論你設置要多少個 Sentinel 同意才能判斷一個服務器失效, 一個 Sentinel 都需要獲得系統中多數(majority) Sentinel 的支持, 才能發起一次自動故障遷移, 并預留一個給定的配置紀元 (configuration Epoch ,一個配置紀元就是一個新主服務器配置的版本號)。換句話說, 在只有少數(minority) Sentinel 進程正常運作的情況下, Sentinel 是不能執行自動故障遷移的。sentinel集群中各個sentinel也有互相通信,通過gossip協議。

除了第一行配置,我們發現剩下的配置都有一個統一的格式:

sentinel <option_name>  <master_name>  <option_value>

接下來我們根據上面格式中的option_name一個一個來解釋這些配置項:

  • down-after-milliseconds 選項指定了 Sentinel 認為服務器已經斷線所需的毫秒數。
  • parallel-syncs 選項指定了在執行故障轉移時, 最多可以有多少個從服務器同時對新的主服務器進行同步, 這個數字越小, 完成故障轉移所需的時間就越長。

啟動 Sentinel

對于 redis-sentinel 程序, 你可以用以下命令來啟動 Sentinel 系統


redis-sentinel sentinel.conf

對于 redis-server 程序, 你可以用以下命令來啟動一個運行在 Sentinel 模式下的 Redis 服務器

redis-server sentinel.conf --sentinel

以上兩種方式,都必須指定一個sentinel的配置文件sentinel.conf, 如果不指定將無法啟動sentinel。sentinel默認監聽26379端口,所以運行前必須確定該端口沒有被別的進程占用。


測試

此時,我們開啟兩個Sentinel,關閉主服務器,我們來驗證下Sentinel。發現,服務器發生切換了。



當6300端口的這個服務重啟的時候,他會變成6301端口服務的slave。

Twemproxy

Twemproxy是由Twitter開源的Redis代理, Redis客戶端把請求發送到Twemproxy,Twemproxy根據路由規則發送到正確的Redis實例,最后Twemproxy把結果匯集返回給客戶端。

Twemproxy通過引入一個代理層,將多個Redis實例進行統一管理,使Redis客戶端只需要在Twemproxy上進行操作,而不需要關心后面有多少個Redis實例,從而實現了Redis集群。



Twemproxy本身也是單點,需要用Keepalived做高可用方案。

這么些年來,Twenproxy作為應用范圍最廣、穩定性最高、最久經考驗的分布式中間件,在業界廣泛使用。

但是,Twemproxy存在諸多不方便之處,最主要的是,Twemproxy無法平滑地增加Redis實例,業務量突增,需增加Redis服務器;業務量萎縮,需要減少Redis服務器。但對Twemproxy而言,基本上都很難操作。其次,沒有友好的監控管理后臺界面,不利于運維監控。

Codis

Codis解決了Twemproxy的這兩大痛點,由豌豆莢于2014年11月開源,基于Go和C開發、現已廣泛用于豌豆莢的各種Redis業務場景。

Codis 3.x 由以下組件組成:

  • Codis Server:基于 redis-2.8.21 分支開發。增加了額外的數據結構,以支持 slot 有關的操作以及數據遷移指令。具體的修改可以參考文檔 redis 的修改。
  • Codis Proxy:客戶端連接的 Redis 代理服務, 實現了 Redis 協議。 除部分命令不支持以外(不支持的命令列表),表現的和原生的 Redis 沒有區別(就像 Twemproxy)。對于同一個業務集群而言,可以同時部署多個 codis-proxy 實例;不同 codis-proxy 之間由 codis-dashboard 保證狀態同步。
  • Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、刪除,以及據遷移等操作。在集群狀態發生改變時,codis-dashboard 維護集群下所有 codis-proxy 的狀態的一致性。對于同一個業務集群而言,同一個時刻 codis-dashboard 只能有 0個或者1個;所有對集群的修改都必須通過 codis-dashboard 完成。
  • Codis Admin:集群管理的命令行工具。可用于控制 codis-proxy、codis-dashboard 狀態以及訪問外部存儲。
  • Codis FE:集群管理界面。多個集群實例共享可以共享同一個前端展示頁面;通過配置文件管理后端 codis-dashboard 列表,配置文件可自動更新。
  • Codis HA:為集群提供高可用。依賴 codis-dashboard 實例,自動抓取集群各個組件的狀態;會根據當前集群狀態自動生成主從切換策略,并在需要時通過 codis-dashboard 完成主從切換。
  • Storage:為集群狀態提供外部存儲。提供 Namespace 概念,不同集群的會按照不同 product name 進行組織;目前僅提供了 Zookeeper 和 Etcd 兩種實現,但是提供了抽象的 interface 可自行擴展。

Codis引入了Group的概念,每個Group包括1個Redis Master及一個或多個Redis Slave,這是和Twemproxy的區別之一,實現了Redis集群的高可用。當1個Redis Master掛掉時,Codis不會自動把一個Slave提升為Master,這涉及數據的一致性問題,Redis本身的數據同步是采用主從異步復制,當數據在Maste寫入成功時,Slave是否已讀入這個數據是沒法保證的,需要管理員在管理界面上手動把Slave提升為Master。

Codis使用,可以參考官方文檔https://github.com/CodisLabs/codis/blob/release3.0/doc/tutorial_zh.md

Redis 3.0集群

Redis 3.0集群采用了P2P的模式,完全去中心化。支持多節點數據集自動分片,提供一定程度的分區可用性,部分節點掛掉或者無法連接其他節點后,服務可以正常運行。Redis 3.0集群采用Hash Slot方案,而不是一致性哈希。Redis把所有的Key分成了16384個slot,每個Redis實例負責其中一部分slot。集群中的所有信息(節點、端口、slot等),都通過節點之間定期的數據交換而更新。

Redis客戶端在任意一個Redis實例發出請求,如果所需數據不在該實例中,通過重定向命令引導客戶端訪問所需的實例。

Redis 3.0集群,目前支持的cluster特性

  • 節點自動發現

  • slave->master 選舉,集群容錯

  • Hot resharding:在線分片

  • 集群管理:cluster xxx

  • 基于配置(nodes-port.conf)的集群管理

  • ASK 轉向/MOVED 轉向機制

如上圖所示,所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬。節點的fail是通過集群中超過半數的節點檢測失效時才生效。客戶端與redis節點直連,不需要中間proxy層。客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可。redis-cluster把所有的物理節點映射到[0-16383]slot上cluster負責維護node<->slot<->value。

選舉過程是集群中所有master參與,如果半數以上master節點與master節點通信超時,認為當前master節點掛掉。

當集群不可用時,所有對集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤。如果集群任意master掛掉,且當前master沒有slave,集群進入fail狀態,也可以理解成進群的slot映射[0-16383]不完成時進入fail狀態。如果進群超過半數以上master掛掉,無論是否有slave集群進入fail狀態。

環境搭建

現在,我們進行集群環境搭建。集群環境至少需要3個主服務器節點。本次測試,使用另外3個節點作為從服務器的節點,即3個主服務器,3個從服務器。

修改配置文件,其它的保持默認即可。

# 根據實際情況修改port 7000  # 允許redis支持集群模式cluster-enabled yes # 節點配置文件,由redis自動維護cluster-config-file nodes.conf # 節點超時毫秒cluster-node-timeout 5000  # 開啟AOF同步模式appendonly yes

創建集群

目前這些實例雖然都開啟了cluster模式,但是彼此還不認識對方,接下來可以通過Redis集群的命令行工具redis-trib.rb來完成集群創建。
首先,下載 https://raw.githubusercontent.com/antirez/redis/unstable/src/redis-trib.rb。

然后,搭建Redis 的 Ruby 支持環境。這里,不進行擴展,參考相關文檔。

現在,接下來運行以下命令。這個命令在這里用于創建一個新的集群, 選項–replicas 1 表示我們希望為集群中的每個主節點創建一個從節點。

  1. redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

5.3、測試


  • 版權聲明:本文由 梁桂釗 發表于 梁桂釗的博客

本文由博客一文多發平臺 OpenWrite 發布!



喜歡的朋友記得點贊、收藏、關注哦!!!

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

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

相關文章

Qt QScrollArea 總結

Qt QScrollArea 總結 1. 功能概述 滾動容器&#xff1a;用于顯示超出視口&#xff08;Viewport&#xff09;范圍的內容&#xff0c;自動提供滾動條。子部件管理&#xff1a;可包裹單個子部件&#xff08;通過 setWidget()&#xff09;&#xff0c;當子部件尺寸 > 視口時&a…

Windows系統編程項目(一)進程管理器

本項目將通過MFC實現一個進程管理器&#xff0c;如下圖詳細信息頁所示&#xff1a; 一.首先創建一個基于對話框的MFC項目&#xff0c;在靜態庫中使用MFC 二.在項目默認的對話框中添加一個列表 三.列表添加變量 四.初始化列表 1.設置列表風格和表頭 2.填充列表內容 我們需要在…

RAG-202502

目錄 RAG場景的坑知識等級金字塔 初級RAG存在的問題高級RAG索前優化檢索優化檢索后優化 優化經驗總結參考 RAG場景的坑 晦澀的專業術語 誤區&#xff1a;在專業領域中。許多文獻和資料中充滿了專業術語&#xff0c;這些術語對于非專業人士&#xff08;甚至是大模型&#xff0…

CDN與群聯云防護的技術差異在哪?

CDN&#xff08;內容分發網絡&#xff09;與群聯云防護是兩種常用于提升網站性能和安全的解決方案&#xff0c;但兩者的核心目標和技術實現存在顯著差異。本文將從防御機制、技術架構、適用場景和代碼實現等方面詳細對比兩者的區別&#xff0c;并提供可直接運行的代碼示例。 一…

STM32-智能小車項目

項目框圖 ST-link接線 實物圖&#xff1a; 正面&#xff1a; 反面&#xff1a; 相關內容 使用L9110S電機模塊 電機驅動模塊L9110S詳解 | 良許嵌入式 測速模塊 語音模塊SU-03T 網站&#xff1a;智能公元/AI產品零代碼平臺 一、讓小車動起來 新建文件夾智能小車項目 在里面…

【Linux】vim 設置

【Linux】vim 設置 零、起因 剛學Linux&#xff0c;有時候會重裝Linux系統&#xff0c;然后默認的vi不太好用&#xff0c;需要進行一些設置&#xff0c;本文簡述如何配置一個好用的vim。 壹、軟件安裝 sudo apt-get install vim貳、配置路徑 對所有用戶生效&#xff1a; …

【Python爬蟲(90)】以Python爬蟲為眼,洞察金融科技監管風云

【Python爬蟲】專欄簡介&#xff1a;本專欄是 Python 爬蟲領域的集大成之作&#xff0c;共 100 章節。從 Python 基礎語法、爬蟲入門知識講起&#xff0c;深入探討反爬蟲、多線程、分布式等進階技術。以大量實例為支撐&#xff0c;覆蓋網頁、圖片、音頻等各類數據爬取&#xff…

【java進階】java多態深入探討

前言 在Java的編程宇宙中,多態是極為關鍵的概念,它宛如一條靈動的紐帶,串聯起面向對象編程的諸多特性,賦予程序宛如生命般的動態活力與高度靈活性。透徹理解多態,不僅是提升代碼質量的關鍵,更是開啟高效編程大門的鑰匙。 一、多態的定義與本質 多態,從概念層面來講,…

17164字符遷移

17164字符遷移 ??難度&#xff1a;中等 &#x1f4d6; &#x1f4da; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int q scanner.nextInt();scanner.next…

強化學習概覽

強化學習的目標 智能體&#xff08;Agent&#xff09;通過與環境&#xff08;Environment&#xff09;交互&#xff0c;學習最大化累積獎勵&#xff08;Cumulative Reward&#xff09;?的策略。 數學抽象 馬爾科夫決策過程&#xff08;MDP&#xff09; 收益 由于馬爾科夫決…

IDEA關閉SpringBoot程序后仍然占用端口的排查與解決

IDEA關閉SpringBoot程序后仍然占用端口的排查與解決 問題描述 在使用 IntelliJ IDEA 開發 Spring Boot 應用時&#xff0c;有時即使關閉了應用&#xff0c;程序仍然占用端口&#xff08;例如&#xff1a;4001 端口&#xff09;。這會導致重新啟動應用時出現端口被占用的錯誤&a…

QT:QPen、QBrush、與圖形抗鋸齒的關聯

QPen QPen 是 Qt 框架中用于定義繪圖時使用的畫筆屬性的類。在使用 QPainter 進行 2D 繪圖時&#xff0c;QPen 可以控制線條的外觀&#xff0c;比如線條的顏色、寬度、樣式&#xff08;如實線、虛線等&#xff09;、端點樣式&#xff08;如方形端點、圓形端點等&#xff09;和…

論文筆記(七十二)Reward Centering(三)

Reward Centering&#xff08;三&#xff09; 文章概括摘要3 基于值的獎勵中心化4 案例研究&#xff1a; 以獎勵為中心的 Q-learning5 討論、局限性與未來工作致謝 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan…

單例模式——c++

一個類&#xff0c;只能有1個對象 (對象在堆空間) 再次創建該對象&#xff0c;直接引用之前的對象 so構造函數不能隨意調用 so構造函數私有 so對象不能構造 如何調用私有化的構造函數: 公開接口調用構造函數 調用構造函數&#xff1a;singleTon instance&#xff1b; 但…

ReentrantLock 底層實現

一、核心概念 1 - CAS CAS&#xff08;Compare-And-Swap&#xff0c;比較并交換&#xff09;操作是一種無鎖的原子操作&#xff0c;它在多線程環境下能夠保證線程安全&#xff0c;主要是通過硬件級別的原子性以及樂觀鎖的思想來實現的。以下詳細介紹 CAS 操作保證線程安全的原…

NLP學習記錄十:多頭注意力

一、單頭注意力 單頭注意力的大致流程如下&#xff1a; ① 查詢編碼向量、鍵編碼向量和值編碼向量分別經過自己的全連接層&#xff08;Wq、Wk、Wv&#xff09;后得到查詢Q、鍵K和值V&#xff1b; ② 查詢Q和鍵K經過注意力評分函數&#xff08;如&#xff1a;縮放點積運算&am…

算法-二叉樹篇08-完全二叉樹的節點個數

完全二叉樹的節點個數 力扣題目鏈接 題目描述 給你一棵 完全二叉樹 的根節點 root &#xff0c;求出該樹的節點個數。 完全二叉樹 的定義如下&#xff1a;在完全二叉樹中&#xff0c;除了最底層節點可能沒填滿外&#xff0c;其余每層節點數都達到最大值&#xff0c;并且最下…

【原創工具】同文件夾PDF文件合并 By憐渠客

【原創工具】同文件夾PDF文件合并 By憐渠客 原貼&#xff1a;可批量合并多個文件夾內的pdf工具 - 吾愛破解 - 52pojie.cn 他這個存在一些問題&#xff0c;并非是軟件內自主實現的PDF合并&#xff0c;而是調用的pdftk這一工具&#xff0c;但樓主并沒有提供pdftk&#xff0c;而…

微軟云和金山云和k8有什么區別

Kubernetes&#xff08;K8s&#xff09;和微軟云&#xff08;Microsoft Cloud&#xff09;是兩種不同的技術&#xff0c;分別用于不同的目的。Kubernetes是一個開源的容器編排系統&#xff0c;用于自動化部署、擴展和管理容器化應用程序&#xff0c;而微軟云是一個提供多種云服…

libGL.so.1: cannot open shared object file: No such file or directory-linux022

in <module> from PyQt5.QtGui import QPixmap, QFont, QIcon ImportError: libGL.so.1: cannot open shared object file: No such file or directory 這個錯誤信息表示XXXX 在啟動時遇到問題&#xff0c;缺少 libGL.so.1 文件。libGL.so.1 是與 OpenGL 圖形庫相關的共…