搭建分片集群

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

  • 海量數據存儲問題

  • 高并發寫的問題

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

分片集群特征:

  • 集群中有多個master,每個master保存不同數據

  • 每個master都可以有多個slave節點

  • master之間通過ping監測彼此健康狀態

  • 客戶端請求可以訪問集群任意節點,最終都會被轉發到正確節點

1、集群結構

分片集群需要的節點數量較多,這里我們搭建一個最小的分片集群,包含3個master節點,每個master包含一個slave節點,結構如下:

這里我們會在同一臺虛擬機中開啟6個redis實例,模擬分片集群,信息如下:

IPPORT角色
192.168.150.1017001master
192.168.150.1017002master
192.168.150.1017003master
192.168.150.1018001slave
192.168.150.1018002slave
192.168.150.1018003slave

2、準備實例和配置

刪除之前的7001、7002、7003這幾個目錄,重新創建出7001、7002、7003、8001、8002、8003目錄:

# 進入/tmp目錄
cd /tmp
# 刪除舊的,避免配置干擾
rm -rf 7001 7002 7003
# 創建目錄
mkdir 7001 7002 7003 8001 8002 8003

在/tmp下準備一個新的redis.conf文件,內容如下:

port 6379
# 開啟集群功能
cluster-enabled yes
# 集群的配置文件名稱,不需要我們創建,由redis自己維護
cluster-config-file /tmp/6379/nodes.conf
# 節點心跳失敗的超時時間
cluster-node-timeout 5000
# 持久化文件存放目錄
dir /tmp/6379
# 綁定地址
bind 0.0.0.0
# 讓redis后臺運行
daemonize yes
# 注冊的實例ip
replica-announce-ip 192.168.150.101
# 保護模式
protected-mode no
# 數據庫數量
databases 1
# 日志
logfile /tmp/6379/run.log

將這個文件拷貝到每個目錄下:

# 進入/tmp目錄
cd /tmp
# 執行拷貝
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf

修改每個目錄下的redis.conf,將其中的6379修改為與所在目錄一致:

# 進入/tmp目錄
cd /tmp
# 修改配置文件
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

3、啟動

因為已經配置了后臺啟動模式,所以可以直接啟動服務:

# 進入/tmp目錄
cd /tmp
# 一鍵啟動所有服務
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf

通過ps查看狀態:

ps -ef | grep redis

發現服務都已經正常啟動:

如果要關閉所有進程,可以執行命令:

ps -ef | grep redis | awk '{print $2}' | xargs kill

或者(推薦這種方式):

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown

4、創建集群

雖然服務啟動了,但是目前每個服務之間都是獨立的,沒有任何關聯。

我們需要執行命令來創建集群,在Redis5.0之前創建集群比較麻煩,5.0之后集群管理命令都集成到了redis-cli中。

1)Redis5.0之前

Redis5.0之前集群命令都是用redis安裝包下的src/redis-trib.rb來實現的。因為redis-trib.rb是有ruby語言編寫的所以需要安裝ruby環境。

# 安裝依賴
yum -y install zlib ruby rubygems
gem install redis

然后通過命令來管理集群:

# 進入redis的src目錄
cd /tmp/redis-6.2.4/src
# 創建集群
./redis-trib.rb create --replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003

2)Redis5.0以后

我們使用的是Redis6.2.4版本,集群管理以及集成到了redis-cli中,格式如下:

redis-cli --cluster create --cluster-replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003

命令說明:

  • redis-cli --cluster或者./redis-trib.rb:代表集群操作命令

  • create:代表是創建集群

  • --replicas 1或者--cluster-replicas 1 :指定集群中每個master的副本個數為1,此時節點總數 ÷ (replicas + 1) 得到的就是master的數量。因此節點列表中的前n個就是master,其它節點都是slave節點,隨機分配到不同master

運行后的樣子:

這里輸入yes,則集群開始創建:

通過命令可以查看集群狀態:

x?redis-cli -p 7001 cluster nodes

5、測試

嘗試連接7001節點,存儲一個數據:

# 連接
redis-cli -p 7001
# 存儲數據
set num 123
# 讀取數據
get num
# 再次存儲
set a 1

結果悲劇了:

集群操作時,需要給redis-cli加上-c參數才可以:

redis-cli -c -p 7001

這次可以了:

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

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

相關文章

在ubuntu系統中如何將docker安裝在指定目錄

在 Ubuntu 系統中,Docker 默認安裝路徑(程序文件)通常在/usr/bin等系統目錄,而核心數據(鏡像、容器、卷等)默認存儲在/var/lib/docker。若需將數據目錄指定到其他位置(這是更常見的需求&#xf…

服務器都是用的iis, 前端部署后報跨域,不是用同一個服務器 是前端項目的服務器做Nginx轉發,還是后端項目的服務器做Nginx轉發?

當服務器環境為 IIS(而非 Nginx),且前端、后端部署在不同服務器導致跨域時,核心思路與 Nginx 場景一致,但實現工具從「Nginx」替換為「IIS 配置」。此時依然存在 “后端服務器配置跨域頭” 和 “前端服務器配置反向代理…

【大前端】前端生成二維碼

前端生成二維碼有很多方法,常見的做法是使用 JavaScript 庫 來生成二維碼。下面整理幾種常用方案,并附示例代碼。1?? 使用 qrcode 庫(推薦)qrcode 是一個非常流行的前端 JS 庫,可以生成 Canvas 或者 SVG 的二維碼。安…

LeetCode 刷題【71. 簡化路徑】

71. 簡化路徑 自己做 解&#xff1a;遍歷檢查 class Solution { public:string simplifyPath(string path) {int p 0;string res;while(p < (int)path.size()){//情況1&#xff1a;遇到"/./" 》p跳過"/."if(p < (int)path.size() - 2 && p…

《算法闖關指南:優選算法-雙指針》--01移動零,02復寫零

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a;《C知識分享》《Linux 入門到實踐&#xff1a;零基礎也能懂》《數據結構與算法》《測試開發實戰指南》《算法題闖關指南》 ??人生格言&am…

【小白筆記】命令不對系統:無法將‘head’項識別為 cmdlet、函數、腳本文件或可運行程序的名稱

head : 無法將“head”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫&#xff0c;如果包括路徑&#xff0c;請確保路徑正確&#xff0c;然后再試一次。所在位置 行:1 字符: 1 head -5 train_data.csv ~~~~ CategoryInfo : ObjectNotFound: (h…

宋紅康 JVM 筆記 Day15|垃圾回收相關算法

一、今日視頻區間 P138-P153 二、一句話總結 標記階段&#xff1a;引用計數算法&#xff1b;標記階段&#xff1a;可達性分析算法&#xff1b;對象的finalization機制&#xff1b;MAT與JProfiler的GC Roots溯源&#xff1b;清除階段&#xff1a;標記-清除算法&#xff1b;清除階…

Go基礎(③Cobra)

Cobra 是幫你快速開發命令行工具的框架 假設你想做一個叫 todo 的命令行工具&#xff0c;實現這些功能&#xff1a; todo add "買牛奶" → 添加待辦 todo list → 查看所有待辦 todo done 1 → 標記第 1 個待辦為已完成 沒有 Cobra 的話&#xff0c;你需要自己寫代…

從 scheduler_tick 到上下文切換:深入解析 Linux 內核的 TIF_NEED_RESCHED 標志設置流程

Linux 是如何決定何時進行上下文切換的&#xff1f; 在Linux中&#xff0c;CPU 上下文切換是指當操作系統將 CPU 從一個進程切換到另一個進程時&#xff0c;保存當前進程的執行狀態&#xff0c;并加載新進程的執行狀態的過程就稱為上下文切換。 但在 Linux 內核中&#xff0c…

Redis 深度解析:數據結構、持久化與集群

Redis (Remote Dictionary Server) 是一種高性能的鍵值&#xff08;Key-Value&#xff09;內存數據庫&#xff0c;以其豐富的數據結構、極低的延遲、出色的穩定性和強大的集群能力&#xff0c;在現代應用程序的開發中扮演著至關重要的角色。無論是作為緩存、消息隊列、會話存儲…

HTTPS優化簡單總結

性能損耗選擇橢圓曲線&#xff0c;并生成橢圓曲線的計算耗時CA證書驗證的耗時計算pre-master的耗時硬件優化HTTPS是計算密集型任務&#xff0c;不是IO密集型任務所以硬件最好買更高級的CPU&#xff0c;而不是網卡&#xff0c;磁盤協議優化ECDHE代替RSA&#xff0c;因為ECDHE可以…

從IFA再出發:中國制造與海信三筒洗衣機的“答案”

當全球消費電子行業的目光再次聚焦柏林&#xff0c;柏林國際電子消費品展覽會(IFA2025)不僅成為創新產品的秀場&#xff0c;更悄然變身為中國企業講述全球化進階故事的重要舞臺。近日&#xff0c;海信旗下三筒洗衣機——棉花糖Ultra全家筒迎來它的國際首秀&#xff0c;首次海外…

c++工程如何提供http服務接口

在 C 工程里給類似 /index/api/ 的服務&#xff0c;基本步驟如下&#xff1a; 選一個HTTP服務框架&#xff1b;起一條監聽線程&#xff08;或線程池&#xff09;&#xff1b;把路徑-處理函數注冊進去&#xff1b; 下面是 2 種簡單的方案。方案 A&#xff1a;Crow&#xff08;He…

cfshow-web入門-php特性

web89 <?php ? include("flag.php"); highlight_file(__FILE__); ? if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("no no no!");}if(intval($num)){echo $flag;} } 正則匹配檢查不能是數字&#xff0c;但…

ctfshow - web - 命令執行漏洞總結(二)

web73該題目沒有開啟web72的open_basedir&#xff0c;所以可以使用var_export(scandir(/));exit();進行目錄掃描。讀取文件函數&#xff1a;require_once()web74scandir()函數被禁用&#xff0c;使用glob://偽協議進行讀取根目錄文件。cvar_export(glob(../../../*));exit(); c…

如何將視頻從安卓手機傳輸到電腦?

無論你是否是視頻愛好者&#xff0c;你可能都希望知道如何將視頻從安卓手機傳輸到電腦&#xff0c;以釋放存儲空間并防止性能問題。這也有助于同步視頻或防止意外刪除。在本文中&#xff0c;我們將探索七種高效的傳輸方法。方法 1&#xff1a;僅通過 USB 將手機視頻發送到電腦許…

Pico 4 Enterprise(企業版)與Unity的交互-有線串流調試篇

入手了Pico 4 E做VR開發&#xff0c;誰知入了天坑...根據官方文檔&#xff0c;嘗試了串流助手、企業串流、PICO Developer Center&#xff0c;陷入了各種版本問題、環境問題的陷阱。而且Pico4E的OS自24年12開始就不再更新&#xff0c;頭盔中預裝的企業串流版本也較低&#xff0…

redis里多線程的應用具體在哪些場景

Redis 6.0 引入的多線程I/O&#xff0c;?特指用于處理網絡數據的讀取&#xff08;read&#xff09;和寫入&#xff08;write&#xff09;/解析&#xff08;parse&#xff09;的并行化&#xff0c;而絕非將命令的執行&#xff08;真正的數據操作&#xff09;變成多線程。這是一…

DI-GAN:基于深度學習的動態形變多模光纖透反射光控制

DI-GAN:基于深度學習的動態形變多模光纖透反射光控制 1 論文核心概念 本文提出了一種名為 DI-GAN(Deep Imaging Generative Adversarial Network) 的持續深度學習框架,用于動態形變多模光纖(MMF) 的光場控制。該框架能夠同時利用透射和反射信息,實現對光纖末端光場的實…

【深度學習新浪潮】具身智能中使用到的世界模型是什么?

在具身智能中,世界模型(World Model) 是智能體對物理環境的內在“認知地圖”,它通過學習環境的動態規律(如物體運動、物理交互、因果關系等),實現對未來狀態的預測、對過去狀態的反推,以及對未觀測狀態的補全。其核心價值在于:讓智能體無需頻繁與真實環境交互,就能在…