超詳細,多圖文介紹redis集群方式并搭建redis偽集群

超詳細,多圖文介紹redis集群方式并搭建redis偽集群

超多圖文,對新手友好度極好。敲命令的過程中,難免會敲錯,但為了截好一張合適的圖,一旦出現一點問題,為了好的演示效果,就要從頭開始敲。且看且珍惜。

再認識redis集群前,若想先知道redis單機版的可查看,springboot整合redis。好了,下面開始了。

每個redis實例可稱為一個節點,安裝redis并以默認端口啟動是節點,不關閉,以另一個端口啟動,是一個新節點。在另一臺機器安裝redis并啟動,也是一個新節點。

節點分為主節點 (master) ,從節點 (slave) ,數據從主節點向多個從節點上同步 。

redis3.0開始支持集群,redis集群是沒有統一的入口的,客戶端(client)連接集群的時候連接集群中的任意節點(node)即可,集群內部的節點是相互通信的(PING-PONG機制)。

@[toc]

一,集群方式

1,主從模式

一個master可以擁有多個slave,但是一個slave只能對應一個master。這樣,當某個slave掛了不影響其他slave的讀和master的讀和寫,重新啟動后會,數據會從master上同步過來。

在主從模式下,因為只有一個主節點可以寫,而主,從節點都可以讀,所以通常主節點負責寫,從節點負責讀。

redis主從模式_lgx211

但是,當唯一的master掛了以后,雖然這樣并不影響slave的讀,但redis也不再提供寫服務,需要將master重啟后,redis才重新對外提供寫服務。

2,Sentinel模式

sentinel模式是建立在主從模式的基礎上,避免單個master掛了以后,redis不能提供寫服務。因為從節點上備份了主節點的所有數據,那么當master掛了以后,sentinel會在slave中選擇一個做為master,并修改它們的配置文件,其他slave的配置文件也會被修改,比如slaveof屬性會指向新的master,比如之前配置的密碼。此時,客戶端就不是直接連接Redis,而是連接sentinel的ip和port,由sentinel來提供具體Redis服務。


Sentinel模式_lgx211

把之前掛了的master重新啟動后,它將不再是master而是做為slave接收新的master的同步數據。

3,Cluster模式

Cluster模式是建立在Sentinel模式的基礎上的,當數據多到需要動態擴容的時候,前面兩種就不行了,需要對數據進行分片,根據一定的規則把redis數據分配到多臺機器。


Cluster模式_lgx211

該模式就支持動態擴容,可以在線增加或刪除節點,而且客戶端可以連接任何一個主節點進行讀寫,不過此時的從節點僅僅只是備份的作用。至于為何能做到動態擴容,主要是因為Redis 集群沒有使用一致性hash, 而是使用的哈希槽。Redis 集群會有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽,而集群的每個節點負責一部分hash槽。

那么這樣就很容易添加或者刪除節點, 比如如果我想新添加個新節點, 我只需要從已有的節點中得部分槽到過來;如果我想移除某個節點,就只需要將該節點的槽移到其它節點上,然后將沒有任何槽的A節點從集群中移除即可。由于從一個節點將哈希槽移動到另一個節點并不會停止服務,所以無論添加刪除或者改變某個節點的哈希槽的數量都不會造成集群不可用的狀態。

需要注意的是,該模式下不支持同時處理多個key(如MSET/MGET),因為redis需要把key均勻分布在各個節點上,并發量很高的情況下同時創建key-value會降低性能并導致不可預測的行為。

二,搭建集群

這里就直接搭建較為復雜的Cluster模式集群,也是企業級開發過程中使用最多的。

1,準備工作

Linux可以連接外網,有wget(用于在線下載redis),系統安裝好gcc環境,(不然編譯redis會報錯)。

2,下載、解壓、移到指定目錄,編譯Redis
wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar xzf redis-5.0.4.tar.gz
mv redis-5.0.4  /usr/local/redis
cd /usr/local/redis/redis-5.0.4
make
make install

安裝完成,在/usr/local/bin/目錄下就會看見

在這里插入圖片描述

3,建redis各節點目錄
mkdir /usr/local/redis-cluster
cd /usr/local/redis-cluster
mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data
mkdir bin

最終目錄結構如下


在這里插入圖片描述
4,redis集群的運行腳本

把之前安裝好的redis的src目錄下運行腳本拷貝過來,每個redis版本的運行腳本有細微差異,請以你自己的版本為準,就是下圖綠色部分。

cd /usr/local/redis/redis-5.0.4/src
cp  mkreleasehdr.sh redis-benchmark redis-check-aof  redis-check-rdb redis-cli redis-sentinel redis-server redis-trib.rb /usr/local/redis-cluster/bin
在這里插入圖片描述

最終效果如下圖所示


在這里插入圖片描述
5,批量復制redis實例
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9001
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9002
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9003
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9004
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9005
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9006

最終效果圖如下所示


在這里插入圖片描述
6,逐個修改redis配置

以 9001 的為例子,其余五個類似。

cd /usr/local/redis-cluster/9001
vi redis.conf

在這里插入圖片描述

打開配置文件,按 i 進入編輯模式,按照出現的順序,主要需要修改的地方是

  • bind 192.168.119.128(綁定當前電腦的 IP,這是我虛擬機的,你綁定成你虛擬機的ip)
  • port 9001(因為我這是一臺機器運行6個redis實例,所以要啟動6個實例,得為它配置6個不同的端口,若你是6臺機器,默認的端口就行,無需更改)
  • daemonize yes(這是設置是否后臺啟動 Redis,默認 no ,但是生產環境肯定要默認就開啟 Redis,所以這里設置為 yes 。)
  • pidfile /var/run/redis_9001.pid(_9001這個一定要和第一個配置的端口一樣)
  • dir /usr/local/redis-cluster/9001/data/(數據文件存放位置,我換成指定目錄下存放)
  • appendonly yes
  • cluster-enabled yes(啟動集群模式)
  • cluster-config-file nodes9001.conf(9001這個也要和之前的端口對應)
  • cluster-node-timeout 15000(超時時間)
    在這里插入圖片描述

    完成以上修改,Esc退出編輯模式,輸入:wq 保存并退出。 類似同樣的操作操作再來五次。

若是對redis的配置文件有興趣,我在學習的過程中找到個詳細的翻譯版,可點擊鏈接進去學習。

redis配置中文翻譯

7,逐個啟動redis節點
cd /usr/local/redis-cluster
/usr/local/bin/redis-server /usr/local/redis-cluster/9001/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9002/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9003/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9004/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9005/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9006/redis.conf

運行效果如圖所示


在這里插入圖片描述

現在檢查一下是否成功開啟,如下圖所示,都開啟成功。

ps -el | grep redis
在這里插入圖片描述
8,搭建集群

此時的節點雖然都啟動成功了,但他們還不在一個集群里面,不能互相發現,測試會報錯:(error) CLUSTERDOWN Hash slot not served

/usr/local/redis-cluster/bin/redis-cli -h 192.168.119.128 -p 9001
keys *
set name mafly

如下圖所示


在這里插入圖片描述

解決報錯,如果你是redis5.0以前的,你需要安裝集群所需的ruby相關依賴

yum install ruby
yum install rubygems
cd /usr/local/redis-cluster/
gem install redis

這步若安裝報錯,請查看Could not find a valid gem 'redis'

如果你是redis5.0及之后的,無需安裝ruby依賴,redis安裝目錄里內置了集群命令行工具 redis-trib ,它是一個 Ruby 程序, 這個程序通過向實例發送特殊命令來完成創建新集群, 檢查集群, 或者對集群進行重新分片工作。

redis-cli --cluster create 192.168.119.128:9001 192.168.119.128:9002 192.168.119.128:9003 192.168.119.128:9004 192.168.119.128:9005 192.168.119.128:9006 --cluster-replicas 1

--cluster-replicas 1 這個指的是從機的數量,表示我們希望為集群中的每個主節點創建一個從節點。

紅色選框是給三個主節點分配的共16384個槽點。

黃色選框是主從節點的分配情況。

藍色選框是各個節點的詳情。


在這里插入圖片描述
9,測試

現在通過客戶端命令連接上,通過集群命令看一下狀態和節點信息等

/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.128 -p 9001
cluster info
cluster nodes

效果圖如下,集群搭建成功。


在這里插入圖片描述

現在往9001這個主節點寫入一條信息,我們可以在9002這個主節點取到信息,集群間各個節點可以通信。

現在往9001這個主節點寫入一條信息,我們可以在9002這個主節點取到信息,集群間各個節點可以通信。

 set name lgxget name
在這里插入圖片描述

三,故障轉移

1,故障轉移機制詳解
  1. 集群中的節點會向其它節點發送PING消息(該PING消息會帶著當前集群和節點的信息),如果在規定時間內,沒有收到對應的PONG消息,就把此節點標記為疑似下線。

  2. 當被分配了slot槽位的主節點中有超過一半的節點都認為此節點疑似下線(就是其它節點以更高的頻次,更頻繁的與該節點PING-PONG),那么該節點就真的下線。

  3. 其它節點收到某節點已經下線的廣播后,把自己內部的集群維護信息也修改為該節點已事實下線。

  4. 節點資格審查:然后對從節點進行資格審查,每個從節點檢查最后與主節點的斷線時間,如果該值超過配置文件的設置,那么取消該從節點的資格。

  5. 準備選舉時間:這里使用了延遲觸發機制,主要是給那些延遲低的更高的優先級,延遲低的讓它提前參與被選舉,延遲高的讓它靠后參與被選舉。(延遲的高低是依據之前與主節點的最后斷線時間確定的)

  6. 選舉投票:當從節點獲取選舉資格后,會向其他帶有slot槽位的主節點發起選舉請求,由它們進行投票,優先級越高的從節點就越有可能成為主節點,當從節點獲取的票數到達一定數值時(如集群內有N個主節點,那么只要有一個從節點獲得了N/2+1的選票即認為勝出),就會替換成為主節點。

  7. 替換主節點:被選舉出來的從節點會執行slaveof no one把自己的狀態從slave變成master,然后執行clusterDelSlot操作撤銷故障主節點負責的槽,并執行 clusterAddSlot把這些槽分配給自己,之后向集群廣播自己的pong消息,通知集群內所有的節點,當前從節點已變為主節點。

  8. 接管相關操作:新的主節點接管了之前故障的主節點的槽信息,接收和處理與自己槽位相關的命令請求。

2,故障轉移測試

這是之前集群中具體節點的情況,我簡化成如下,可以向上回看圖片中的集群信息。


原先集群_lgx211

這里關閉該9001端口的進程,即模擬該主節點掛掉。

 netstat -tunlp | grep 9001kill 15705
在這里插入圖片描述

登錄掛掉的redis節點,會被拒絕服務,通過還在正常運行的某個主節點進入,然后再次查看集群中的信息

/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.128 -p 9001/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.128 -p 9002cluster nodes
在這里插入圖片描述

簡而言之,就是之前的集群信息變成了如下所示


故障轉移后集群_lgx211

現在,我重啟剛才掛掉的主節點,重新查看集群內部的節點情況,具體情況如下圖所示。

cd /usr/local/redis-cluster//usr/local/bin/redis-server /usr/local/redis-cluster/9001/redis.conf/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.128 -p 9002cluster nodes
在這里插入圖片描述

簡而言之,現在集群內的節點情況如下

恢復后集群_lgx211


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

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

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

相關文章

Hue Load Balance配置

個人博客地址:Hue Load Balance配置 | 一張假鈔的真實世界 直接上配置: server {server_name 192.168.72.31;listen 8001;charset utf-8;proxy_connect_timeout 600s;proxy_read_timeout 600s;proxy_send_timeout 600s;location / {proxy_set_header H…

992. K 個不同整數的子數組

目錄 一、題目二、思路2.1 解題思路2.2 代碼嘗試2.3 疑難問題 三、解法四、收獲4.1 心得4.2 舉一反三 一、題目 二、思路 2.1 解題思路 2.2 代碼嘗試 class Solution { public:int subarraysWithKDistinct(vector<int>& nums, int k) {//需要有數據結構來存儲數組…

領域驅動設計:事件溯源架構簡介

概述 事件溯源架構通常由3種應用設計模式組成,分別是:事件驅動(Event Driven),事件溯源(Event Source)、CQRS(讀寫分離)。這三種應用設計模式常見于領域驅動設計(DDD)中,但它們本身是一種應用設計的思想,不僅僅局限于DDD,每一種模式都可以單獨拿出來使用。 E…

PT2035 TWS 藍牙耳機雙觸控雙輸出 IC

1. 產品概述 PT2035 是一款支持入耳檢測的藍牙耳機專用觸摸芯片&#xff0c;該芯片具有寬工作電壓、低功耗、高抗 干擾能力的特性。 2. 主要特性 工作電壓范圍&#xff1a; 2.4~5.5V 待機電流約 2.5uAV DD3V/CMOD5nF 入耳有效&#xff0c;無觸摸時工作電流約 8uAV DD3…

AI編程界的集大成者——通義靈碼AI程序員

一、引言 隨著軟件行業的快速發展和技術的進步&#xff0c;人工智能&#xff08;AI&#xff09;正在成為軟件開發領域的一個重要組成部分。近年來&#xff0c;越來越多的AI輔助工具被引入到開發流程中&#xff0c;旨在提高效率、減少錯誤并加速創新。在這樣的背景下&#xff0…

Rocky Linux 8.5 6G內存 靜默模式(沒圖形界面)安裝Oracle 19C

Oracle19c 下載地址 Database Software Downloads | Oraclehttps://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_ee 目錄 一、準備服務器 1、服務器可以克隆、自己裝 2、修改主機名 3、重啟 4、關閉selinux 5、關閉防火墻 5.1、…

另辟蹊徑:多維度解析 STM32 微控制器

開篇&#xff1a;STM32 的廣泛影響力 在嵌入式系統的廣闊天地中&#xff0c;STM32 系列微控制器宛如一顆璀璨的明星&#xff0c;散發著耀眼的光芒。它憑借出色的性能、豐富的資源以及高性價比&#xff0c;在工業、醫療、消費電子等眾多領域廣泛應用&#xff0c;成為無數開發者…

DeepSeek 使用竅門與提示詞寫法指南

一、通用提示詞技巧 竅門分類技巧說明示例提示詞明確需求用“角色任務要求”明確目標作為健身教練&#xff0c;為30歲上班族設計一周減脂計劃&#xff0c;需包含飲食和15分鐘居家訓練結構化提問分步驟、分模塊提問第一步&#xff1a;列出Python爬蟲必備的5個庫&#xff1b;第二…

全監督、半監督、弱監督、無監督

全監督、半監督、弱監督、無監督 全監督學習&#xff08;Fully Supervised Learning&#xff09; 數據標注&#xff1a;使用的數據集包含大量的輸入數據&#xff08;特征&#xff09;以及與之對應的準確標注信息&#xff08;標簽&#xff09;。學習目標&#xff1a;通過學習輸…

c#實現485協議

在C#中實現RS-485協議通信,需要結合串口(SerialPort)操作和硬件收發控制(如RTS信號切換)。以下是詳細的步驟和示例代碼: 1. RS-485通信原理 物理層:RS-485是差分信號標準,支持多點通信(半雙工)。 收發控制:通過控制RTS(Request to Send)或DTR引腳切換發送/接收模式…

刪除變慢問題

問題&#xff1a; 有一個場景&#xff0c;每天都會刪除數據&#xff0c;SQL為delete from xxx where record_date < DATE_SUB(now(), INTERVAL ? DAY) limit 1000 &#xff0c;一直循環執行&#xff0c;當執行到最后一次滿足條件的時候&#xff0c;就會很慢 原理分析 索引與…

lua基礎語法學習

lua基礎語法學習 文章目錄 lua基礎語法學習1. 基礎2. 輸入輸出3. 分支結構與循環結構4. 函數5. 元表與元方法6. 面向對象 1. 基礎 注釋 --單行注釋--[[ 多行注釋 --]]標識符 標識符以一個字母 A 到 Z 或 a 到 z 或下劃線 _ 開頭后加上 0 個或多個字母&#xff0c;下劃線&…

使用DeepSeek實現自動化編程:類的自動生成

目錄 簡述 1. 通過注釋生成C類 1.1 模糊生成 1.2 把控細節&#xff0c;讓結果更精準 1.3 讓DeepSeek自動生成代碼 2. 驗證DeepSeek自動生成的代碼 2.1 安裝SQLite命令行工具 2.2 驗證DeepSeek代碼 3. 測試代碼下載 簡述 在現代軟件開發中&#xff0c;自動化編程工具如…

【SpringBoot】數據訪問技術spring Data、 JDBC、MyBatis、JSR-303校驗

Spring Boot 數據訪問技術及特性 目錄標題 Spring Boot 數據訪問技術及特性摘要1. 引言2. Spring Data架構與原理2.1 Spring Data概述2.2 Spring Data核心組件2.3 Spring Boot與Spring Data的集成機制 3. Spring Boot與JDBC的整合3.1 JDBC整合流程3.2 數據源自動配置3.3 JdbcTe…

【時序預測】深度時序預測算法的對比與核心創新點分析

時間序列預測是機器學習和深度學習領域的重要研究方向&#xff0c;廣泛應用于金融、交通、能源、醫療等領域。近年來&#xff0c;隨著深度學習技術的發展&#xff0c;各種基于深度學習的時間序列預測算法層出不窮。這些算法在模型架構、訓練方式和應用場景上各有特色。本文將對…

JVM線程分析詳解

java線程狀態&#xff1a; 初始(NEW)&#xff1a;新創建了一個線程對象&#xff0c;但還沒有調用start()方法。運行(RUNNABLE)&#xff1a;Java線程中將就緒&#xff08;ready&#xff09;和運行中&#xff08;running&#xff09;兩種狀態籠統的稱為“運行”。 線程對象創建…

android智能指針android::sp使用介紹

android::sp 是 Android 中的智能指針&#xff08;Smart Pointer&#xff09;的實現&#xff0c;用于管理對象的生命周期&#xff0c;避免手動管理內存泄漏等問題。它是 Android libutils 庫中重要的一部分&#xff0c;常用于管理繼承自 android::RefBase 的對象。 與標準庫中…

spring整合mybatis詳細步驟

spring整合mybatis的全部過程(整合方式一 &#xff1a;簡單版) 1.在pom.xml中導入mybatis相應的jar包&#xff1a; (2) < dependency > < groupId >org.mybatis</ groupId > < artifactId >mybatis</ artifactId > < version >3.5.3&…

2025年Linux主力系統選擇指南:基于最新生態的深度解析(附2025年發行版對比速查表)

Linux發行版生態在2025年持續演進&#xff0c;既有經典系統的迭代升級&#xff0c;也有新興項目的崛起。本文結合最新行業動態&#xff0c;從個人用戶到企業場景&#xff0c;梳理主力系統選擇策略&#xff0c;助你找到最適合的Linux發行版。 一、新手友好型&#xff1a;平滑過渡…

ai-2、機器學習之線性回歸

機器學習之線性回歸 1、機器學習2、線性回歸2.1、梯度下降法 3、python下調用scikit-learn 1、機器學習 2、線性回歸 ####所以y可以當成我們需要的結果&#xff0c;根據公式可以求的y一撇的值更小&#xff0c;所以更接近需要的結果&#xff0c;所以y一撇擬合性更好 2.1、梯度下…