【redis】集群 如何搭建集群詳解

文章目錄

  • 集群搭建
  • 1. 創建目錄和配置
  • 2. 編寫 docker-compose.yml
    • 完整配置文件
  • 3. 啟動容器
  • 4. 構建集群
      • 超時

集群搭建

基于 docker 在我們云服務器上搭建出一個 redis 集群出來image.png|486

當前節點,主要是因為我們只有一個云服務器,搞分布式系統,就比較麻煩。實際工作中,一般是通過多個主機的方式,來搭建集群

  • 此處我們使用 9docker 容器,來模擬 9 臺服務器

此處我們創建 11redis 節點,其中前 9 個用來演示集群的搭建,后 2 個用來演示集群擴容


一定要記得,把以前啟動的 redis 容器給停掉

切換到對應目錄下后,輸入:

# 查看有哪些容器正在運行
docker ps -a  # 關閉此目錄下的容器
docker-compose down

1. 創建目錄和配置

切換到 Cluster 目錄后

touch docker-compose.ymltouch generate.sh

image.png|422

  • Linux 上,以 .sh 后綴結尾的文件,稱為“shell 腳本
    • 使用 Linux 的時候,都是通過一些命令來進行操作的。使用命令操作,就非常適合把命令給寫到一個文件中,批量化執行
    • 同時,還能加入:條件、循環、函數等機制。 因此,就可以基于這些來完成更復雜的工作了
  • 此處我們需要創建 11redis 節點,這些 redis 的配置文件內容,大同小異,此時就可以使用腳本來批量生成(也可以不使用腳本,手動一個一個改)

shell 腳本:

for port in $(seq 1 9); \
do \
mkdir -p redis${port}/
touch redis${port}/redis.conf
cat << EOF > redis${port}/redis.conf
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.30.0.10${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
EOF
done# 注意 cluster-announce-ip 的值有變化.
for port in $(seq 10 11); \
do \
mkdir -p redis${port}/
touch redis${port}/redis.conf
cat << EOF > redis${port}/redis.conf
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.30.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
EOF
done
  • for port in $(seq 1 9); \:基于范圍的循環。類似與 Javafor each
    • seq 就是一個 Linux 命令,后面倆參數就是從哪到哪,能生成 [1, 9] 這個區間image.png|240
  • dodone:在 shell 腳本里面,{} 用來表示變量,不是表示代碼塊。對于 for 來說,就是使用 dodone 來表示代碼塊開始和結束
  • \:是續行符,把下一行的內容和當前行,合并成一行。shell 默認情況下,要求把所有的代碼都寫到一行里,所以可以使用續行符來換行
  • 循環體里面:
    1. mkdir -p redis${port}/:創建目錄,名字為 redis1 -> redis9shell 中拼接字符串是直接寫到一起,而不需要使用 +
      • ${} 是取變量的值操作image.png|360
    2. touch redis${port}/redis. conf :創建文件。在剛才的目錄基礎下,創建 redis.conf
    3. cat:進行寫內容。將下面的內容,寫到剛剛創建的文件中去
      • 文件里面大多是一樣的,cluster-announce-ip 172.30.0.10${port} 有點變化。我們通過變量來構造不同的 ip
      • cluster-enabled yes:開啟集群
      • cluster-config-file nodes.conf:里面包含了一些集群的配置信息,不用我們手動寫,而是 redis 自動生成的(后續啟動這些節點之后,會配置一些 redis 集群信息)
      • cluster-node-timeout 5000:多個節點之間進行交互,保持聯絡
      • cluster-announce-ip 172.30.0.10${port}:該 redis 節點(自己)所在主機的 ip 地址(當前是使用 docker 容器模擬的主機,所以此處寫的是 docker 容器的 ip
      • cluster-announce-port 6379redis 節點自身綁定的端口(容器內的端口),不同容器內部可以有相同端口,后續進行端口映射,再把這些容器內的端口映射到容器外的不同端口即可
      • cluster-announce-bus-port 16379
        • 業務端口:用來進行業務數據通信。響應 redis 客戶端的請求
        • 管理端口:為了完成一些管理上的任務來進行通信。如果某個分片中的 redis 主節點掛了,就需要讓從節點成為主節點,就需要通過剛才管理端口來完成對應的操作(Tomcat 里面,8080 是業務端口,8005 是管理端口)
  • 這些配置項都不用記,用到時候去查即可

預期效果:得到 11 個目錄,每個目錄里面都有一個配置文件,配置文件中,ip 地址各不相同


執行命令
通過命令:

bash generate.sh

image.png

隨后可以看到目錄里面:image.png|213

2. 編寫 docker-compose.yml

version: '3.7'
networks:mynet:ipam:config:- subnet: 172.30.0.0/24services:redis1:image: 'redis:5.0.9'container_name: redis1restart: alwaysvolumes:- ./redis1/:/etc/redis/ports:- 6371:6379- 16371:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.101// 剩余10個容器,格式和這個一樣,將名字、端口號、ip地址遞增即可
  • networks:此處為了后續創建靜態 ip,此時要先手動創建出網絡,同時給這個網段也分配 ip
    • ip 地址 = 網絡號 + 主機號。使用子網掩碼的方式來區分網絡號和主機號
    • 這里的 /24 就代表子網掩碼左邊 24 位都是 1 ,右邊 8 位是 0255.255.255.0,網絡號就是 172.30.0
      • ip 是內網 ip
      • 配置的網絡號不能和當前主機上現有的其他網段沖突(每個人的主機上已有的網段,具體不一定一樣,ifconfig
  • 后面就是常規操作,配置容器
    • ports:此處不進行端口映射,也是可以的,映射一下目的是為了在容器外面通過客戶端直接進行訪問
    • 靜態 ip 配置,網絡號部分要和前面的網段一致,主機號部分,可以隨便配置(1-255,保證不重復),按照之前在配置文件中寫的 101-11111 臺主機

進行上述配置的時候,一定要保證前后一致性(第一步和第二部相關部分,端口號、ip 地址)

完整配置文件

version: '3.7'
networks:mynet:ipam:config:- subnet: 172.30.0.0/24services:redis1:image: 'redis:5.0.9'container_name: redis1restart: alwaysvolumes:- ./redis1/:/etc/redis/ports:- 6371:6379- 16371:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.101redis2:image: 'redis:5.0.9'container_name: redis2restart: alwaysvolumes:- ./redis2/:/etc/redis/ports:- 6372:6379- 16372:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.102redis3:image: 'redis:5.0.9'container_name: redis3restart: alwaysvolumes:- ./redis3/:/etc/redis/ports:- 6373:6379- 16373:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.103redis4:image: 'redis:5.0.9'container_name: redis4restart: alwaysvolumes:- ./redis4/:/etc/redis/ports:- 6374:6379- 16374:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.104redis5:image: 'redis:5.0.9'container_name: redis5restart: alwaysvolumes:- ./redis5/:/etc/redis/ports:- 6375:6379- 16375:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.105redis6:image: 'redis:5.0.9'container_name: redis6restart: alwaysvolumes:- ./redis6/:/etc/redis/ports:- 6376:6379- 16376:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.106redis7:image: 'redis:5.0.9'container_name: redis7restart: alwaysvolumes:- ./redis7/:/etc/redis/ports:- 6377:6379- 16377:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.107redis8:image: 'redis:5.0.9'container_name: redis8restart: alwaysvolumes:- ./redis8/:/etc/redis/ports:- 6378:6379- 16378:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.108redis9:image: 'redis:5.0.9'container_name: redis9restart: alwaysvolumes:- ./redis9/:/etc/redis/ports:- 6379:6379- 16379:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.109redis10:image: 'redis:5.0.9'container_name: redis10restart: alwaysvolumes:- ./redis10/:/etc/redis/ports:- 6380:6379- 16380:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.110redis11:image: 'redis:5.0.9'container_name: redis11restart: alwaysvolumes:- ./redis11/:/etc/redis/ports:- 6381:6379- 16381:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.111

3. 啟動容器

啟動之前,一定要把之前已經運行的 redis 相關東西都干掉!否則就可能因為端口沖突等原因,導致現在的啟動失敗image.png

通過下面命令啟動

docker-compose up -d

image.png
image.png

4. 構建集群

此處把前 9 個主機構建成集群,36 從,后 2 個主機暫時不用

相關命令:

redis-cli --cluster create 172.30.0.101:6379 172.30.0.102:6379 172.30.0.103:6379 172.30.0.104:6379 172.30.0.105:6379 172.30.0.106:6379 172.30.0.107:6379 172.30.0.108:6379 172.30.0.109:6379 --cluster-replicas 2
  • --cluster create:建立集群,后面填寫每個節點的 ip 和地址
  • --cluster-replicas 2:表示每個主節點要兩個從節點備份
    • 這個配置設置之后,redis 就知道了,3 個節點是一伙的,一共 3 個分片

redis 在構建集群的時候,誰是主節點,誰是從節點,誰和誰是一個分片,都是不固定的

  • 本身從集群的角度來看,提供的這些節點之間本來就應該是等價的

命令執行完之后image.png

  • 分片信息、槽位信息、主從節點信息… 都給出了
  • 最后需要手動輸入“yes”進行構建

超時

如果在輸入構建命令連接不上,超時,就需要進行一步處理

在進行構建集群操作之前,需要先讓這個命令在任意一個 redis 容器中進行

  • 所有的 redis 容器都是在同一個局域網內,但是此時這個宿主機卻不在,想要進行后續操作,就必須要保證都在同一個局域網內
  • 在容器內進行構建集群的操作,就能保證都是在同一個局域網內了

執行命令

docker exec -it ce /bin/bash
  • docker exec:在一個已經運行中的 docker 容器內執行命令
  • -it
    • -i:表示以交互模式運行,讓能夠保持輸入流打開
    • -t:分配一個“偽終端”(TTY),這樣你可以像在普通終端中一樣與容器交互
  • ce:容器的名字或容器 ID,表示要進入的容器
  • bin/bash:表示在容器內部啟動一個 Bash shell,通常用于容器內操作

在集群構建完畢之后,輸入 exit 就可以退出容器


  1. 生成每個 redis 節點的配置文件
  2. 使用 docker 創建出 11redis 節點,并且啟動容器
  3. 使用 redis-cli 執行構建集群命令

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

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

相關文章

[langchain教程]langchain03——用langchain構建RAG應用

RAG RAG過程 離線過程&#xff1a; 加載文檔將文檔按一定條件切割成片段將切割的文本片段轉為向量&#xff0c;存入檢索引擎&#xff08;向量庫&#xff09; 在線過程&#xff1a; 用戶輸入Query&#xff0c;將Query轉為向量從向量庫檢索&#xff0c;獲得相似度TopN信息將…

C語言復習筆記--字符函數和字符串函數(下)

在上篇我們了解了部分字符函數及字符串函數,下面我們來看剩下的字符串函數. strstr 的使用和模擬實現 老規矩,我們先了解一下strstr這個函數,下面看下這個函數的函數原型. char * strstr ( const char * str1, const char * str2); 如果沒找到就返回NULL指針. 下面我們看下它的…

FreeRTOS中的優先級翻轉問題及其解決方案:互斥信號量詳解

FreeRTOS中的優先級翻轉問題及其解決方案&#xff1a;互斥信號量詳解 在實時操作系統中&#xff0c;任務調度是基于優先級的&#xff0c;高優先級任務應該優先于低優先級任務執行。但在實際應用中&#xff0c;有時會出現"優先級翻轉"的現象&#xff0c;嚴重影響系統…

深度學習-全連接神經網絡

四、參數初始化 神經網絡的參數初始化是訓練深度學習模型的關鍵步驟之一。初始化參數&#xff08;通常是權重和偏置&#xff09;會對模型的訓練速度、收斂性以及最終的性能產生重要影響。下面是關于神經網絡參數初始化的一些常見方法及其相關知識點。 官方文檔參考&#xff1…

GIS開發筆記(9)結合osg及osgEarth實現三維球經緯網格繪制及顯隱

一、實現效果 二、實現原理 按照5的間隔分別創建經緯線的節點,掛在到組合節點,組合節點掛接到根節點。可以根據需要設置間隔度數和線寬、線的顏色。 三、參考代碼 //創建經緯線的節點 osg::Node *GlobeWidget::createGraticuleGeometry(float interval, const osg::Vec4 …

《Relay IR的基石:expr.h 中的表達式類型系統剖析》

TVM Relay源碼深度解讀 文章目錄 TVM Relay源碼深度解讀一 、從Constant看Relay表達式的設計哲學1. 類定義概述2. ConstantNode 詳解1. 核心成員2. 關鍵方法3. 類型系統注冊 3. Constant 詳解1. 核心功能 二. 核心內容概述(1) Relay表達式基類1. RelayExprNode 和 RelayExpr 的…

自動駕駛地圖數據傳輸協議ADASIS v2

ADASIS&#xff08;Advanced Driver Assistance Systems Interface Specification&#xff09;直譯過來就是 ADAS 接口規格&#xff0c;它要負責的東西其實很簡單&#xff0c;就是為自動駕駛車輛提供前方道路交通相關的數據&#xff0c;這些數據被抽象成一個標準化的概念&#…

Flutter 狀態管理 Riverpod

Android Studio版本 Flutter SDK 版本 將依賴項添加到您的應用 flutter pub add flutter_riverpod flutter pub add riverpod_annotation flutter pub add dev:riverpod_generator flutter pub add dev:build_runner flutter pub add dev:custom_lint flutter pub add dev:riv…

【EasyPan】MySQL主鍵與索引核心作用解析

【EasyPan】項目常見問題解答&#xff08;自用&持續更新中…&#xff09;匯總版 MySQL主鍵與索引核心作用解析 一、主鍵&#xff08;PRIMARY KEY&#xff09;核心作用 1. 數據唯一標識 -- 創建表時定義主鍵 CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,use…

IcePlayer音樂播放器項目分析及學習指南

IcePlayer音樂播放器項目分析及學習指南 項目概述 IcePlayer是一個基于Qt5框架開發的音樂播放器應用程序&#xff0c;使用Visual Studio 2013作為開發環境。該項目實現了音樂播放、歌詞顯示、專輯圖片獲取等功能&#xff0c;展現了桌面應用程序開發的核心技術和設計思想。 技…

vscode 打開新頁簽

目錄 vscode 打開新頁簽 完整settings.json內容&#xff1a; vscode 打開新頁簽 .vscode目錄中 新建settings.json 在 settings.json 文件中&#xff0c;添加或修改以下行&#xff1a; json "workbench.editor.enablePreview": false 這將禁用預覽模式&#xff0…

C語言高頻面試題——常量指針與指針常量區別

1. 常量指針&#xff08;Pointer to Constant&#xff09; 定義&#xff1a; 常量指針是指向一個常量數據的指針&#xff0c;即指針指向的內容不能通過該指針被修改。 語法&#xff1a; const int* ptr;或者&#xff1a; int const* ptr;解釋&#xff1a; const修飾的是指…

c++基礎·列表初始化

目錄 一、列表初始化的核心優勢 二、基礎數據類型與數組初始化 1. 基礎類型初始化 2. 數組初始化 三、類與結構體初始化 1. 構造函數匹配規則 2. 注意事項 四、標準容器初始化 五、聚合類型&#xff08;Aggregate Types&#xff09;初始化 1. 聚合類型定義 2. 初始化…

數據分析與產品、運營、市場之間如何有效對齊

數據分析的重要性在于它能夠將海量的原始信息轉化為可操作的洞察。以產品開發為例,通過用戶行為數據的分析,產品經理可以清晰了解哪些功能被頻繁使用,哪些設計導致用戶流失,從而優化迭代方向。運營團隊則依靠數據分析來監控供應鏈效率、預測需求波動,甚至通過實時數據調整…

[C]基礎11.深入理解指針(3)

博客主頁&#xff1a;向不悔本篇專欄&#xff1a;[C]您的支持&#xff0c;是我的創作動力。 文章目錄 0、總結1、字符指針變量2、數組指針變量2.1 數組指針變量是什么&#xff1f;2.2 數組指針變量怎么初始化&#xff1f; 3、二維數組傳參的本質4、函數指針變量4.1 函數指針變量…

【漏洞復現】CVE-2024-38856(ApacheOfbiz RCE)

【漏洞復現】CVE-2024-38856&#xff08;ApacheOfbiz RCE&#xff09; 1. 漏洞描述 Apache OFBiz 是一個開源的企業資源規劃&#xff08;ERP&#xff09;系統。它提供了一套企業應用程序&#xff0c;用于集成和自動化企業的許多業務流程。 這個漏洞是由于對 CVE-2023-51467 的…

C++入門小館: 深入string類(二)

嘿&#xff0c;各位技術潮人&#xff01;好久不見甚是想念。生活就像一場奇妙冒險&#xff0c;而編程就是那把超酷的萬能鑰匙。此刻&#xff0c;陽光灑在鍵盤上&#xff0c;靈感在指尖跳躍&#xff0c;讓我們拋開一切束縛&#xff0c;給平淡日子加點料&#xff0c;注入滿滿的pa…

【nginx】服務的信號控制

目錄 1. 說明2. 常用信號及作用3. 信號控制的具體操作3.1 獲取 Nginx 主進程 PID3.2 發送信號 4. 應用場景4.1 重新加載配置文件4.2 日志切割 5. 平滑升級 Nginx6. 注意事項 1. 說明 1.Nginx 的信號控制是其管理服務的重要機制&#xff0c;通過向主進程發送特定信號&#xff0…

Ubuntu下展銳刷機工具spd_dump使用說明

spd_dump使用說明 源碼地址&#xff1a;https://github.com/ilyakurdyukov/spreadtrum_flash 編譯環境準備&#xff1a; sudo apt update sudo apt install git sudo apt install build-essential sudo apt install libusb-1.0-0-devIf you create /etc/udev/rules.d/80-spd…

鴻蒙NEXT開發LRUCache緩存工具類(單例模式)(ArkTs)

import { util } from kit.ArkTS;/*** LRUCache緩存工具類&#xff08;單例模式&#xff09;* author 鴻蒙布道師* since 2025/04/21*/ export class LRUCacheUtil {private static instance: LRUCacheUtil;private lruCache: util.LRUCache<string, any>;/*** 私有構造函…