redis 集群搭建: redis-cluster

来源:https://www.cnblogs.com/elvinle/archive/2018/01/29/8371690.html
-Advertisement-
Play Games

前言 redis數據存儲在記憶體中, 就會受到記憶體的限制, 大家都知道, 一臺電腦, 硬碟可以有1T, 但是記憶體, 沒有聽說有1T的記憶體吧. 那如果數據非常多, 超過一臺電腦的記憶體空間, 怎麼辦呢? 正常思維, 都是, 一臺電腦不夠, 那我再加一臺電腦嘛, 不就夠了. redis集群架構圖 每一臺re ...


前言

  redis數據存儲在記憶體中, 就會受到記憶體的限制, 大家都知道, 一臺電腦, 硬碟可以有1T, 但是記憶體, 沒有聽說有1T的記憶體吧.

  那如果數據非常多, 超過一臺電腦的記憶體空間, 怎麼辦呢?

  正常思維, 都是, 一臺電腦不夠, 那我再加一臺電腦嘛, 不就夠了.

redis集群架構圖

  

每一臺redis server之間都是保持通訊的. 也就是說, 如果 server1 上面沒有要查找的值, 會跳轉到別的伺服器上查找.

註: 

  如果其中有一個伺服器掛了, 如 server4 掛了. redis是怎麼處理的呢?

  redis集群中, 有一個投票機制, 當server4掛了之後, 會由server1, server2, server3 共同投票, 因為他們都與server4有通訊關係, 當大家都認定server4 確實掛了之後, 大家的投票結果就是, 大家可以休息了, 下班了.

  那很明顯, 這裡有不合理性. 那怎麼解決呢?

  在集群中, 為了保證一臺機子掛了之後, 系統任然正常運行, 一個常用的方法是加備份機.(備胎)

  redis中也是這樣, 如果給每一臺機子上加一臺備份機, 那麼大家投票認為server4掛了之後, 備胎就有福了. 可以取而代之. 這樣就可以保證, 系統還可以正常運行.

 

搭建集群

 根據上面的架構圖, 以及投票機制和備胎機制, 一個合格的redis集群, 應該是要6臺電腦. 作為我個人來講, 我去哪裡弄6臺電腦啊, 裝6台虛擬機還差不多. 但是同時跑6台虛擬機, 你累不累啊?

 既然沒有那麼多電腦, 也不想裝那麼多虛擬機, 那麼久來個偽集群吧. 到生產環境中, 需要多臺電腦來搭建集群的時候, 步驟是一樣的. 結果其實也是一樣的, 沒差, 甚至更簡單點.

一. 搭建多個redis

  接著前面的篇幅中的redis文件. 

1. 拷貝創建redis-cluster文件夾

  

2. 進入redis-cluster, 將bin文件重命名

  

3. 對redis1下的redis.conf文件進行埠和集群配置

vim ./redis1/redis.conf

  3.1 埠修改

  

  3.2 允許集成開關

  

  這裡預設是被註釋掉的. 只要打開註釋就可以了

4. 將redis1複製5份出來, 分別命名為redis2,redis3, redis4, redis5, redis6

   

5. 修改redis2~redis6的埠號, 分別為7002~7006. 修改方式與3.1一樣的.

6. 創建一把啟動腳本. vim start-all.sh 

cd /usr/local/redis-cluster/redis1
./redis-server redis.conf
cd ../redis2
./redis-server redis.conf
cd ../redis3
./redis-server redis.conf
cd ../redis4
./redis-server redis.conf
cd ../redis5
./redis-server redis.conf
cd ../redis6
./redis-server redis.conf

7. 修改start-all.sh的許可權

  如果不改許可權, 直接運行, 是跑不起來的

[root@localhost redis-cluster]# chmod u+x start-all.sh

  修改完之後, 就可以牽出來溜一下, 看看是否都能跑起來

  

  通過ps看一下

  

8. 創建一把結束腳本 vim shutdown-all.sh

  有始有終, 一把開始, 當然也需要一把結束, 總不能一個一個去結束吧, 太麻煩了

cd /usr/local/redis-cluster/redis1
./redis-cli -p 7001 shutdown
cd ../redis2
./redis-cli -p 7002 shutdown
cd ../redis3
./redis-cli -p 7003 shutdown
cd ../redis4
./redis-cli -p 7004 shutdown
cd ../redis5
./redis-cli -p 7005 shutdown
cd ../redis6
./redis-cli -p 7006 shutdown

  同樣的, 這個腳本也需要修改訪問許可權, 與上面是一樣的.

chmod u+x shutdown-all.sh

  跑一下這個腳本看看

[root@localhost redis-cluster]# ./shutdown-all.sh 

  這時候, 再通過ps看看

  

  都關掉了.

 

二. 集群

註:

  在開始搭建之前, 有一些概念, 要搞清楚.

  在redis-cluster中, 吧所有的物理節點都映射到[0-16383]個slot(槽)上, 由cluster負責維護.

  那具體是怎麼分配這些槽的呢?

  當有一個數據進來需要進行緩存時, redis會先對key使用crc16演算法, 計算出一個結果, 然後對16384進行取餘, 這樣, 每個key都會得到一個在0-16383之間的數, 這個數, 就是他的槽值. 根據這個數, 將數據存入槽所在的電腦裡面.

  也就是說, 如果有3臺電腦A,B,C, A->[0, 5000], B->[5001, 10000], C->[10001, 16383]. 進來一個值, key計算最後結果是5005, 則會將這個值存入B電腦裡面. 再進來一個值, key計算是10010, 則會存入C電腦中.

  這個槽點, 並不是key的個數, 這裡需要註意以下. 理論來說, 可以進行16284臺電腦的集群, 每臺電腦分一個槽. 但是每個電腦, 肯定會存一堆值. 

1. 拷貝redis-trib.rb文件到redis-cluster中

[root@localhost redis-cluster]# cd /usr/java/redis-4.0.6/src/
[root@localhost src]# cp redis-trib.rb /usr/local/redis-cluster/

  

2. 安裝ruby

  上面拷貝的文件, 是rb尾碼的, 從這個尾碼, 應該能看出為啥要安裝ruby吧

yum install ruby
yum install rubygems

   安裝完成之後, 還需要安裝一個 gem

gem install redis --version 3.0.0

3. 使用ruby腳本搭建集群

./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

  在搭建集群的時候, 有可能會報一個錯誤

  

  這個是為啥呢?

  在集群的時候, 需要保證各redis都是空的, 裡面不存數據的. 所以, 這裡就需要我們手動來清一下數據.

  在將 各 redis 啟動之後, 執行flushdb命令

[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7001
127.0.0.1:7001> flushdb
OK
127.0.0.1:7001> 
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7002
127.0.0.1:7002> flushdb
OK
127.0.0.1:7002> 
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7003
127.0.0.1:7003> flushdb
OK
127.0.0.1:7003> 
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7004
127.0.0.1:7004> flushdb
OK
127.0.0.1:7004> 
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7005
127.0.0.1:7005> flushdb
OK
127.0.0.1:7005> 
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7006
127.0.0.1:7006> flushdb
OK
127.0.0.1:7006> 

  如果清除之後還不行, 則刪除 

  目錄中的dum.rdb, nodes.conf, appendonly.aof 文件, 每一個redis都要刪.

  做完了這些, 一件很重要的事情別忘了:  重啟以下redis , 否則, 在集群的時候, 還是會報錯的

   

4. 使用

  通過以上的步驟, 就將redis集群搭建好了, 接下來, 就是來驗證一番.

  連接集群的時候和連接單機的時候, 稍有不同, 需要在連接指令後面加上 -c

[root@localhost redis-cluster]# ./redis1/redis-cli -p 7001 -c

  

  在存儲的時候, 會根據key計算, 找到存放的電腦, 跳轉過去存放

  那現在我存放了三個值, 分別在7002, 7003裡面, 7001裡面沒有存值, 還是看的出來的. 現在我通過7001來取一下, 看看可能取出來

  

  在我取的時候, 也是會跳轉到相應的存儲伺服器取數據. 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 空間配置器(allocator)這個概念在閱讀源碼之前我根本沒有聽過,原以為記憶體分配都是使用new和delete運算符(註意和operator new、placement new、operator delete以及placement delete不同)。在實際使用STL編程時也很少會遇到自己去實現一 ...
  • 如何用腳本判斷用戶輸入的的字元串是下麵的時間格式2004-11-21 必須要保證用戶的輸入是此格式,並且是時間,比如說月份不大於12等等,另外我需要用戶輸入兩個,並且後一個要比前一個晚,只允許用JAVASCRIPT,請詳細幫助作答, 提示:可用正則表達式提前判斷一下格式,然後提取各時間欄位內容 寫出 ...
  • 1、dict() 字典 字典是python里唯一的映射類型 2、字典由key和value組成的項組成 如何創建一個字典: 3、字典的內置函數 keys values items copy clear get fromkeys update pop popitems setdefault 4、設計一個 ...
  • ``` import re import urllib import urllib.request headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} ... ...
  • 1。藍圖 要用藍圖管理項目,需要導入的包是:from flask import Buleprint 具體大致分為三步: 1.先在子模塊中導入藍圖包,然後再創建藍圖對象。 2.然後將子模塊中的視圖函數存儲在藍圖對象中。 3.最後在主模塊的文件夾里註冊藍圖。 下麵分別展示以上三步在項目中的具體操作: 第 ...
  • 1 載入matplotli的繪圖模塊,並重命名為pltimport matplotlib.pyplot as plt2 折線圖import matplotlib.pyplot as pltimport numpy as npx = np.arange(9)y = np.sin(x)z = np.co... ...
  • ———————————————————————————————————————————————————————————————————————————————————————— 本篇開始進行真槍實彈的調試,本文的最後會附上完整的源碼包,方便各位在自己的機器上演練。 如果安裝了 Windows Dri ...
  • 前言 前面學會了單機, 學會了集群, 但是redis咋用啊? 或者說, redis支持哪些數據類型呢? 常用的有五種: String , Hash, List, Set, zset(SortedSet) 一、String String 類型, 在前面也是使用過的. 直接來看一下 可以使用del na ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...