2.Redis集群環境搭建

来源:http://www.cnblogs.com/hd3013779515/archive/2017/05/28/6914824.html
-Advertisement-
Play Games

轉載請出自出處:http://www.cnblogs.com/hd3013779515/ 一、基本概念 1、redis集群是一個可以在多個節點之間進行數據共用的設施。redis集群提供了以下兩個好處1.1 將數據自動切分(split)到多個節點1.2 當集群中的某一個節點故障時,redis還可以繼續 ...


轉載請出自出處:http://www.cnblogs.com/hd3013779515/

一、基本概念

1、redis集群是一個可以在多個節點之間進行數據共用的設施。redis集群提供了以下兩個好處
1.1 將數據自動切分(split)到多個節點
1.2 當集群中的某一個節點故障時,redis還可以繼續處理客戶端的請求。

2、一個 Redis 集群包含 16384 個哈希槽(hash slot),資料庫中的每個數據都屬於這16384個哈希槽中的一個。集群使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽。集群中的每一個節點負責處理一部分哈希槽。這樣的話就可以很方便的向集群中添加或者移除節點。(假設集群中有A B C 三個節點)

2.1 添加節點:如果要添加一個D節點到集群中,首先要把這個節點添加到集群,然後還需要將節點ABC中的某些哈希槽移動到節點D。
2.2 移除節點:如果要移除節點A,那麼只需要把節點A中的所有哈希槽轉移到節點B和節點C中,然後再移除空白節點A就可以了。

3、集群中的主從複製
集群中的每個節點都有1個至N個複製品,其中一個為主節點,其餘的為從節點,如果主節點下線了,集群就會把這個主節點的一個從節點設置為新的主節點,繼續工作。這樣集群就不會因為一個主節點的下線而無法正常工作。
註意:如果某一個主節點和他所有的從節點都下線的話,redis集群就會停止工作了。

4、redis集群不保證數據的強一致性,在特定的情況下,redis集群會丟失已經被執行過的寫命令

4.1 使用非同步複製(asynchronous replication)是 Redis 集群可能會丟失寫命令的其中一個原因

4.2 網路原因,如果網路斷開時間太長,redis集群就會啟用新的主節點,之前發給主節點的數據就會丟失。

二、redis cluster 搭建

要讓集群正常工作至少需要 3個主節點,在這裡我們要創建 6個redis 節點,其中三個為主節點,三個為從節點,對應的 redis節點的ip 和埠對應關係如下

192.168.137.174:6379
192.168.137.174:6380

192.168.137.174:6381

192.168.137.174:6382

192.168.137.174:6383

192.168.137.174:6384

1:安裝redis

wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar -xzvf redis-3.2.9.tar.gz -C /usr/local
cd /usr/local/redis-3.2.9
make
如果報錯,可以參考 http://www.cnblogs.com/hd3013779515/p/6914374.html

2:創建集群需要的目錄(一臺機器上模擬6個實例)

mkdir -p /usr/local/redis-cluster

cd /usr/local/redis-cluster

mkdir 6379

mkdir 6380

mkdir 6381

mkdir 6382

mkdir 6383

mkdir 6384

備註: 要讓集群正常運作至少需要三個主節點

3:修改配置文件redis.conf

cp /usr/local/redis-3.2.9/redis.conf  /usr/local/redis-cluster

vi redis.conf

##修改配置文件中的下麵選項

port 6379

bind 192.168.137.174

daemonize yes

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

appendonly yes

##修改完redis.conf 配置文件中的這些配置項之後把這個配置文件分別拷貝到 6379~6384目錄下麵

cp /usr/local/redis-cluster/redis.conf /usr/local/redis-cluster/6379

##註意:拷貝完成之後要修改6379~6384目錄下麵redis.conf 文件中的 port參數,分別改為對應的文件夾的名稱

4:分別啟動這6redis 實例

cd /usr/local/redis-cluster/6379/

/usr/local/redis-3.2.9/src/redis-server redis.conf

cd /usr/local/redis-cluster/6380/

/usr/local/redis-3.2.9/src/redis-server redis.conf

cd /usr/local/redis-cluster/6381/

/usr/local/redis-3.2.9/src/redis-server redis.conf

cd /usr/local/redis-cluster/6382/

/usr/local/redis-3.2.9/src/redis-server redis.conf

cd /usr/local/redis-cluster/6383/

/usr/local/redis-3.2.9/src/redis-server redis.conf

cd /usr/local/redis-cluster/6384/

/usr/local/redis-3.2.9/src/redis-server redis.conf

註意:一定先進入6379~6384目錄,然後再啟動服務,服務啟動後自動生成appendonly.aof,nodes.conf文件。

image

##啟動之後使用命令查看redis的啟動情況 ps -ef|grep redis

如下圖顯示則說明啟動成功

image

5:執行redis的創建集群命令創建集群

cd /usr/local/redis-3.2.9/src

./redis-trib.rb  create --replicas 1 192.168.137.174:6379 192.168.137.174:6380 192.168.137.174:6381 192.168.137.174:6382 192.168.137.174:6383 192.168.137.174:6384

註意: replicas 是給master分配slave個數的參數,我們給的參數是1 ,那每個master就有一個從節點.

5.1執行上面的命令的時候可能會報錯,因為是執行的 ruby的腳本,需要ruby的環境

錯誤內容: /usr/bin/env: ruby: No such file or directory

所以需要安裝 ruby的環境,這裡推薦使用yum install ruby安裝

yum install ruby

5.2然後再執行第5步的創建集群命令,可能還會報錯,提示缺少 rubygems組件,使用yum安裝

錯誤內容:

./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)

       from ./redis-trib.rb:24

yum install rubygems

5.3再次執行第5步的命令,可能還會報錯,提示不能載入 redis,是因為缺少redis和 ruby的介面,使用gem 安裝

錯誤內容:

/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)

       from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'

       from ./redis-trib.rb:25

gem install redis

註意: 若公司有代理,通過gem install --http-proxy http://proxy.xxx.com:8080 redis  模式安裝,紅色部分是公司的代理

5.4 再次執行第5步的命令,正常執行

image

輸入 yes,然後配置完成。

image

至此 redis集群即搭建成功!

6:使用redis-cli 命令進入集群環境

/usr/local/redis-3.2.9/src/redis-cli -c -h 192.168.137.174 -p 6379

備註:  -c  表示 cluster模式進入,-p 指定集群某個埠號

登錄集群後,然後進行驗證:

image

7:查看集群中的所有節點信息

/usr/local/redis-3.2.9/src/redis-cli -h 192.168.137.174 -p 6379 cluster nodes [| grep master]

image

8: 通過check cluster的一個節點,就知道整個集群的狀況

/usr/local/redis-3.2.9/src/redis-trib.rb check 192.168.137.174:6379

image

9、集群配置解析

預設情況下不能從slaves讀取數據,但建立連接後,執行一次命令READONLY,該slaves即可讀取數據。

否則只能以redis-cli -c -h -p命令登錄 -c是以集群方式

cluster-enabled yes   集群開關,預設是不開啟集群模式。

cluster-config-file nodes-6379.conf  集群配置文件的名稱,每個節點都有一個集群相關的配置文件,持久化保存集群的信息。這個文件並不需要手動配置,這個配置文件有 Redis生成並更新,每個Redis集群節點需要一個單獨的配置文件,請確保與實例運行的系統中配置文件名稱不衝突。

cluster-node-timeout 15000 節點互連超時的閥值。集群節點超時毫秒數。即節點與集群其他節點斷開多長時間將被認定為超時。建議稍微大一點

cluster-slave-validity-factor 10 在進行故障轉移的時候,全部slave都會請求申請為master,但是有些slave可能與master斷開連接一段時間了,導致數據過於陳舊,這樣的slave不應該被提升為master。該參數就是用來判斷slave節點與master斷線的時間是否過長。判斷方法是:比較slave斷開連接的時間和(node-timeout * slave-validity-factor)+ repl-ping-slave-period如果節點超時時間為三十秒, 並且slave-validity-factor為10,假設預設的repl-ping-slave-period是10秒,即如果超過310秒slave將不會嘗試進行故障轉移

cluster-migration-barrier 1 master的slave數量大於該值,slave才能遷移到其他孤立master上,如這個參數若被設為2,那麼只有當一個主節點擁有2個可工作的從節點時,它的一個從節點才會嘗試遷移。

cluster-require-full-coverage yes 預設情況下,集群全部的slot有節點負責,集群狀態才為ok,才能提供服務。設置為no,可以在slot沒有全部分配的時候提供服務。不建議打開該配置,這樣會造成分區的時候,小分區的master一直在接受寫請求,而造成很長時間數據不一致。


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

-Advertisement-
Play Games
更多相關文章
  • 後臺模版來自:Ace Admin http://ace.jeka.by/form-elements.html 左側菜單,通過js根據url來判斷顯示哪塊 window.location.pathname: 代表URL 的路徑部分(就是文件地址) 本例返回值:/Company/AddOrEditCom ...
  • 特性參數 webapi 框架里有很多特性參數,為瞭解除一些新人的疑惑,寫個小例子分享下。 class Program { static void Main(string[] args) { var message = new MessageData { Header="header...", Bod ...
  • 類和對象 類是某一批對象的抽象,可以把類理解成某種概念。對象是一個具體存在的實體。類和對象是面向對象的核心。 類定義的是多個實例的特征,類不是具體存在,實例才是具體存在。 定義類(class)的語法: [修飾符] class 類名 { 零個到多個構造器定義.... 零個到多個成員變數.... 零個到 ...
  • 《lucene實戰(第2版)》基於apache的lucene3.0,從lucene核心、lucene應用、案例分析3個方面詳細系統地介紹了lucene,包括認識lucene、建立索引、為應用程式添加搜索功能、高級搜索技術、擴展搜索、使用tika提取文本、lucene的高級擴展、使用其他編程語言訪問l ...
  • 作為PythonWeb開發的微框架,Flask獨樹一幟。它不會強迫開發者遵循預置的開發規範,為開發者提供了自由度和創意空間。 《圖靈程式設計叢書·Flask Web開發:基於Python的Web應用開發實戰》作者擁有25年軟體開發經驗,而《圖靈程式設計叢書·Flask Web開發:基於Python的 ...
  • TensorFlow支持JPG、PNG圖像格式,RGB、RGBA顏色空間。圖像用與圖像尺寸相同(height*width*chnanel)張量表示。通道表示為包含每個通道顏色數量標量秩1張量。圖像所有像素存在磁碟文件,需要被載入到記憶體。 圖像載入與二進位文件相同。圖像需要解碼。輸入生成器(tf.tr ...
  • C++編程模板2 ...
  • 遞歸C++ 一、遞歸簡介 自己調用自己 二、遞歸寫法 2.1 寫法介紹 先寫出問題的遞推公式 遞歸部分的邊界條件就是遞推公式中的邊界條件 遞歸部分的主體部分就是遞推公式中的主體部分 2.2 實例 (1)題目 例如:求n!。 (2)分析 遞歸公式為 f(n)=f(n-1)*n f(1)=1; 對應的遞 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...