十二、Cluster集群

目錄

    • 一、集群簡介
      • 1、現狀問題
      • 2、集群作用
    • 二、集群結構設計
      • 1、集群存儲設
      • 2、消息通信設計
    • 三、Cluster集群三主三從結構搭建
      • 1、redis.conf配置文件可配置項
      • 2、配置集群
      • 3、鏈接集群
      • 4、命令客戶端連接集群并使用
    • 四、集群擴容
      • 1、添加節點
      • 2、槽位分配
      • 3、添加從節點
    • 五、集群縮容
      • 1、刪除從節點
      • 2、刪除主節點

一、集群簡介

1、現狀問題

  • redis提供的服務OPS可以達到10萬/秒,當前業務OPS已經達到20萬/秒
  • 內存單機容量達到256G,當前業務需求內存容量1T

2、集群作用

  • 分散單臺服務器的訪問壓力,實現負載均衡
  • 分散單臺服務器的存儲壓力,實現可擴展性
  • 降低單臺服務器宕機帶來的業務災難

二、集群結構設計

1、集群存儲設

  1. 讓key通過方法CRC161計算一個hash值,再繼續取余%16384,得出在Redis中存儲的位置。
  2. 將所有的存儲空間計算切割16384個槽,每臺主機保存一部分。
    • 這個槽代表一個存儲空間,不是一個key的保存空間。
  3. 將key按照計算出的計算放到對應的存儲空間。
    當增加一臺計算機,內部就會優化,其余redis把自身一些槽,分給新加的節點。如果去機器把原來的槽再返回給原來的節點。這樣可擴展性就得到增強。

2、消息通信設計

  • 各個數據庫互相通信,保存各個庫中槽的編號數據
  • 一次命中,直接返回。
  • 一次未命中,告知具體位置,直接去下一個庫中尋找,命中返回。
    這樣最多兩次命中,就可以找到數據。
    在這里插入圖片描述

三、Cluster集群三主三從結構搭建

1、redis.conf配置文件可配置項

  • 打開 cluster 集群配置
    • cluster-enabled yes|no
  • cluster配置文件名,該文件屬于自動生成,僅用于快速查找文件并查詢文件內容
    • cluster-config-file <filename>
  • 節點服務響應超時時間,用于判定該節點是否下線或切換為從節點
    • cluster-node-timeout <milliseconds>
  • master連接的slave最小數量
    • cluster-migration-barrier <count>

2、配置集群

注意redis5.0.5以后,就不需要安裝ruby了

  • 清除redis中data目錄所有數據
rm -rf ./data
  • 新建redis-端口號.conf文件
port 端口號
# Normal Redis instances can't be part of a Redis Cluster; only nodes that are
# started as cluster nodes can. In order to start a Redis instance as a
# cluster node enable the cluster support uncommenting the following:
# 打開 cluster集群配置
cluster-enabled yes# Every cluster node has a cluster configuration file. This file is not
# intended to be edited by hand. It is created and updated by Redis nodes.
# Every Redis Cluster node requires a different cluster configuration file.
# Make sure that instances running in the same system do not have
# overlapping cluster configuration file names.
# cluster集群配置文件
cluster-config-file nodes-端口號.conf# Cluster node timeout is the amount of milliseconds a node must be unreachable
# for it to be considered in failure state.
# Most other internal time limits are multiple of the node timeout.
# 當前這個節點超時時,多少秒后反饋信息
cluster-node-timeout 10000

復制六份這樣的文件,每個配置文件的參數改成端口號

  • 啟動六個cluster節點

    /usr/local/bin/redis-server /opt/module/redis-5.0.5/conf/redis-端口號.conf

3、鏈接集群

進入到一個redis,bin目錄下執行命令

./redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1

如果集群有密碼:./redis-cli 后面跟 -a password
–cluster-replicas 1 表示 一個master后有幾個slave,redis集群自行分配
注意 ip一定不能用127.0.0.1 不然外部無法重定向訪問集群 cluster-replicas后面的1表示一個主機有幾個從機 因為現在只有一個因此是1 工作中是2

4、命令客戶端連接集群并使用

  • 注意:-c 表示是以redis集群方式進行連接
    ./redis-cli -a 123456 -h 127.0.0.1 -p 6379 -c
  • 查看集群狀態
    • cluster info
  • 查看集群中的節點
    • cluster nodes
  • 查看幫助
    • cluster help
  • 新增master節點
    • cluster meet ip:port
  • 忽略一個沒有solt的節點
    • cluster forget id
  • 手動故障轉移
    • cluster failover
  • 進入從節點redis,切換其主節點
    • cluster replicate masterID
  • 當存放數據存,放的key:001根據crc16算法算出值然后對16384取余算出的值恰好落在分配到7001的槽中,所以就存放到7001中。我們去7002中進行獲取的時候。會重定向到7001中進行獲取。
    在這里插入圖片描述

四、集群擴容

新加入的節點都是master,并且不會分配任何slot槽位,我們要手動為新節點分配hash槽

1、添加節點

  • 啟動6385節點 進入bin目錄進行啟動
    • ./redis-server redis-6385.conf
  • 申請加入集群
    • ./redis-cli --cluster add-node 127.0.0.1:6385 127.0.0.1:6379
    • 命令解釋:添加節點 6385 去meet6379申請加入集群
  • 啟動客戶端并查看節點信息:
    • redis-cli -a 123456 -h 127.0.0.1 -p 6379 -c
    • cluster nodes

2、槽位分配

使用redis-cli --cluster reshard命令為新加入的節點分配槽位,需要使用集群中任意一個master節點對其進行重新分片
redis-cli -a 123456 --cluster reshard 127.0.0.1:6385

How many slots do you want to move (from 1 to 16384)? 600
(ps:需要多少個槽移動到新的節點上,自己設置,比如600個hash槽)
What is the receiving node ID? 2728a594a0498e98e4b83a537e19f9a0a3790f38
(ps:把這600個hash槽移動到哪個節點上去,需要指定節點id,可通過 cluster nodes 查看當前節點id)
Please enter all the source node IDs.
Type ‘all’ to use all the nodes as source nodes for the hash slots.Type ‘done’ once you entered all the source nodes IDs.
Source node 1:all(ps:輸入all為從所有主節點(8001,8002,8003)中分別抽取相應的槽數指定到新節點中,抽取的總槽數為600)
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:輸入yes確認開始執行分片任務)

3、添加從節點

  • 添加節點(這時候的節點是master節點,并不會分配槽位)

    • redis-cli -a 123456 --cluster add-node 192.168.0.61:6386 192.168.0.61:6379
  • 先登錄從節點,然后在replicate命令中指定主節點的id

    • redis-cli -a 123456-c -h 192.168.0.61 -p 6379
  • 將當前節點分配給指定的master節點作為slave節點

    • cluster replicate 2728a594a0498e98e4b83a537e19f9a0a3790f38 *#后面這串id為要添加slave節點的master的節點id*

五、集群縮容

接下來將上面新增加的兩個節點刪除

1、刪除從節點

  • redis-cli --cluster del-node 刪除從節點6386,指定刪除節點ip和端口,以及節點id
    • redis-cli -a hs --cluster del-node 127.0.0.1:6386 a1cfe35722d151cf70585cee21275565393c0956

2、刪除主節點

主節點的里面是有分配了hash槽的,所以我們這里必須先把6385里的hash槽放入到其他的可用主節點中去,然后再進行移除節點操作,不然會出現數據丟失問題

只能把master的數據遷移到一個節點上,暫時做不了平均分配功能

  • 任選一個主節點進行重新分片*
    • redis-cli -a 123456 --cluster reshard 127.0.0.1:6385
    • How many slots do you want to move (from 1 to 16384)? 600
      (ps:需要多少個槽移動到新的節點上)
      What is the receiving node ID? 2728a594a0498e98e4b83a537e19f9a0a3790f38
      (ps:把這600個hash槽移動到哪個節點上去,這里使用6379的主節點id)
      Please enter all the source node IDs.
      Type ‘all’ to use all the nodes as source nodes for the hash slots.
      Type ‘done’ once you entered all the source nodes IDs.
      Source node 1:2728a594a0498e98e4b83a537e19f9a0a3790f38
      (ps:這里是需要數據源,也就是我們的6385節點id。這里這次就不寫all了)
      Source node 2:done
      (ps:這里直接輸入done 開始生成遷移計劃)
      Do you want to proceed with the proposed reshard plan (yes/no)? yes
      (ps:這里輸入yes開始遷移)
      
  • 查看節點信息,發現沒有插槽數了
    • cluster info
  • 開始刪除節點
    這次就不寫all了)
    Source node 2:done
    (ps:這里直接輸入done 開始生成遷移計劃)
    Do you want to proceed with the proposed reshard plan (yes/no)? yes
    (ps:這里輸入yes開始遷移)
  • 查看節點信息,發現沒有插槽數了
    • cluster info
  • 開始刪除節點
    • redis-cli -a 123456 --cluster del-node 192.168.0.61:6385 2728a594a0498e98e4b83a537e19f9a0a3790f38

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

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

相關文章

Java基礎 3.29

1.數組的相關注意事項 錯誤示范一 String strs[] new String[2]{"a", "b"}; 正確示范一 String strs[] new String[]{"a", "b"}; 讓JVM自己判斷有幾個數據&#xff0c;無需再其中寫明有幾組數據 錯誤示范二 String strs[] new…

從入門到精通:HTML 項目實戰中的學習進度(一)

一、基礎夯實階段 1.1 HTML 文檔結構與核心語法 在 HTML5 的世界里&#xff0c;構建一個文檔就像是搭建一座大廈&#xff0c;堅實的基礎至關重要。HTML5 文檔的基礎框架以<!DOCTYPE html>聲明開場&#xff0c;這就好比是給瀏覽器下達的一份 “指令書”&#xff0c;明確…

FFmpeg —— 實時繪制音頻波形圖(附源碼)

?? FFmpeg 相關音視頻技術、疑難雜癥文章合集(掌握后可自封大俠 ?_?)(記得收藏,持續更新中…) 實時繪制音頻波形圖 步驟 ????? ??????????FFmpeg打開媒體文件,讀取每一包數據,將音頻數據包進行緩沖,一包一包處理音頻緩沖,對音頻緩沖包進行解碼,讀…

大數據學習(88)-zookeeper實現的高可用(HA)

&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一…

基于MFC按鈕邏輯

void CSUCCES1Dlg::SetDlgItemState()//IDC_BTN_INIT初始化按鈕 { GigeState state = GigeState::ARV_NONE;//GigeState是一個枚舉類型,stat狀態為ARV_NONE int idx = ((CListBox*)GetDlgItem(IDC_LIST_GIGE))->GetCurSel();//GetDlgItem 是 MFC 框架提供的一個成員…

EF Core 樂觀并發控制(并發令牌)

文章目錄 前言一、樂觀并發的核心思想二、實現方法1&#xff09;使用并發令牌&#xff08;Concurrency Token&#xff09;2&#xff09;處理并發沖突 三、工作原理四、適用場景五、與悲觀并發的對比六、最佳實踐總結 前言 Entity Framework (EF) Core 默認支持 樂觀并發控制&a…

解決 FFmpeg 使用 C/C++ 接口時,解碼沒有 shell 快的問題(使用多線程)

一、問題 硬件設備為香橙派 5Plus&#xff0c;最近需要使用硬件視頻解碼來加速 YOLO 的檢測&#xff0c;shell 窗口的FFmpeg已經調通&#xff0c;詳見文章&#xff1a; 編譯支持 RKmpp 和 RGA 的 ffmpeg 源碼_rk3588 ffmpeg mpp-CSDN博客https://blog.csdn.net/plmm__/article…

工業控制網絡中常用的通信協議

1. 現場總線協議 Modbus 概述&#xff1a;Modbus 是最廣泛使用的工業協議之一&#xff0c;主要用于串行通信&#xff0c;支持主/從架構&#xff0c;通過 RS-232 或 RS-485 傳輸&#xff0c;也有基于以太網的 Modbus TCP 版本。特點&#xff1a;簡單易用&#xff0c;易于實現&am…

【Mac】npm error Error: EACCES: permission denied, mkdir‘/Users/...

問題描述&#xff1a;Mac電腦中的 vscode 下載依賴的時候提示沒有權限&#xff1a; 故障分析 首先賬號是有權限的&#xff0c;電腦就建了一個賬號是管理員&#xff1b;在桌面用shell直接執行命令npm init 命令可以執行成功&#xff0c;那么問題就出在vscodes上面了&#xff0…

Ruby 簡介

Ruby 簡介 引言 Ruby 是一種廣泛使用的動態、開源的編程語言,自 1995 年由日本程序員 Yukihiro Matsumoto(通稱 Matz)設計以來,它以其優雅的語法、強大的庫支持和跨平臺特性贏得了全球開發者的青睞。本文將詳細介紹 Ruby 的起源、特點、應用領域以及它在現代軟件開發中的…

[Qt5] QMetaObject::invokeMethod使用

&#x1f4e2;博客主頁&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01;&#x1f4e2;本文由 丶布布原創&#xff0c;首發于 CSDN&#xff0c;轉載注明出處&#x1f649;&#x1f4e2;現…

Windows10清理機器大全集

Windows10清理機器大全集 寫在前面先這么個標題&#xff0c;逐漸補充禁止Update移除Microsoft Compatibility Telemetrywindows-defender-remover其它 寫在前面 看到標題&#xff0c;讀者已經就吐了。 我是說&#xff0c;我非常認可: IT從業者&#xff0c;如果你銀子比較充足&…

【AI】NLP

不定期更新&#xff0c;建議關注收藏點贊。 目錄 transformer大語言模型Google Gemma疫情網民情緒識別 整體框架 baseline構建 模型調參、模型優化、其他模型 數據trick、指標優化、magic feature 數據增強、偽標簽、遷移學習 模型融合sklearn中TFIDF參數詳解 頻率閾值可以去掉…

如何為 Debian 和 Kali 系統更換軟件源并更新系統

在 Linux 系統中&#xff0c;軟件源&#xff08;Software Repository&#xff09;是獲取軟件包和更新的核心途徑。然而&#xff0c;默認的軟件源可能會因為地理位置、網絡狀況等原因導致下載速度緩慢&#xff0c;甚至無法訪問。為了提升系統的軟件獲取效率&#xff0c;許多用戶…

android 一步完成 aab 安裝到手機

家人們誰懂&#xff01;在 Android 系統安裝 aab 應用超麻煩。滿心期待快速體驗&#xff0c;卻發現 aab 無法直裝&#xff0c;得先轉為 apks 格式&#xff0c;這過程復雜易錯。好不容易轉好&#xff0c;還得安裝 apks&#xff0c;一番折騰&#xff0c;時間與耐心全耗盡。別愁&a…

mac部署CAT監控服務

在 Mac 上部署美團點評開源的 CAT 監控服務端&#xff0c;可以按照以下步驟操作&#xff1a; 1. 環境準備 1.1 安裝依賴 確保已安裝以下工具&#xff1a; JDK 8&#xff08;建議 OpenJDK 11&#xff09; MySQL 5.7&#xff08;存儲監控數據&#xff09;&#xff08;8.0不支持…

C語言基礎:第10天筆記

內容提要 函數 函數的概述 函數的分類 函數的定義 形參和實參 函數的返回值 函數 函數的概述 函數&#xff1a;實現一定功能的&#xff0c;獨立的代碼模塊&#xff0c;函數是c程序的核心構成模塊&#xff0c;可以說c程序就是由眾多的函數組成&#xff0c;對于函數的使用…

集成開發環境革新:IntelliJ IDEA與Cursor AI的智能演進

集成開發環境革新&#xff1a;IntelliJ IDEA 與 Cursor AI 的智能演進 集成開發環境&#xff08;IDE&#xff09; 是軟件開發者必不可少的工具。一個優秀的 IDE 不僅能夠幫助編寫和調試代碼&#xff0c;還能集成版本控制和代碼優化等多種功能。如今&#xff0c;隨著人工智能&a…

【Django】教程-1-安裝+創建項目+目錄結構介紹

歡迎關注我&#xff01;后續會更新django教程。一周2-3更&#xff0c;歡迎跟進&#xff0c;本周會更新第一個Demo的單獨一個模塊的增刪改查【Django】教程-4-一個增刪改查的Demo【Django】教程-2-前端-目錄結構介紹【Django】教程-3-數據庫相關介紹 1.項目創建 1.1 安裝 Djan…

智能儀表板DevExpress Dashboard v24.2新版亮點:支持.NET 9

使用DevExpress BI Dashboard&#xff0c;再選擇合適的UI元素&#xff08;圖表、數據透視表、數據卡、計量器、地圖和網格&#xff09;&#xff0c;刪除相應參數、值和序列的數據字段&#xff0c;就可以輕松地為執行主管和商業用戶創建有洞察力、信息豐富的、跨平臺和設備的決策…