redis集群之REDIS CLUSTER

来源:http://www.cnblogs.com/zhanchenjin/archive/2016/04/11/5379112.html
-Advertisement-
Play Games

1. Linux系統配置 1.1. vm.overcommit_memory設置 overcommit_memory文件指定了內核針對記憶體分配的策略,其值可以是0、1、2。 0, 表示內核將檢查是否有足夠的可用記憶體供應用進程使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給 ...


1. Linux系統配置

1.1. vm.overcommit_memory設置

overcommit_memory文件指定了內核針對記憶體分配的策略,其值可以是0、1、2。                               

0, 表示內核將檢查是否有足夠的可用記憶體供應用進程使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用進程。 
1, 表示內核允許分配所有的物理記憶體,而不管當前的記憶體狀態如何。
2, 表示內核允許分配超過所有物理記憶體和交換空間總和的記憶體

 

jenkins_service@jenkinsservice:~/redis-3.0.1$ sudo sysctl vm.overcommit_memory=1

vm.overcommit_memory = 1

1.2. Transparent Huge Pages開啟

THP(Transparent Huge Pages)是一個使管理Huge Pages自動化的抽象層。

目前需要註意的是,由於實現方式問題,THP會造成記憶體鎖影響性能,尤其是在程式不是專門為大內記憶體頁開發的時候,簡單介紹如下:

操作系統後臺有一個叫做khugepaged的進程,它會一直掃描所有進程占用的記憶體,在可能的情況下會把4kpage交換為Huge Pages,在這個過程中,對於操作的記憶體的各種分配活動都需要各種記憶體鎖,直接影響程式的記憶體訪問性能,並且,這個過程對於應用是透明的,在應用層面不可控制,對於專門為4k page優化的程式來說,可能會造成隨機的性能下降現象。

 

Redis Cluster 命令行

 //集群(cluster)  

  1. CLUSTER INFO 列印集群的信息  
  2. CLUSTER NODES 列出集群當前已知的所有節點(node),以及這些節點的相關信息。   
  3.   
  4. //節點(node)  
  5. CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點添加到集群當中,讓它成為集群的一份子。  
  6. CLUSTER FORGET <node_id> 從集群中移除 node_id 指定的節點。  
  7. CLUSTER REPLICATE <node_id> 將當前節點設置為 node_id 指定的節點的從節點。  
  8. CLUSTER SAVECONFIG 將節點的配置文件保存到硬碟裡面。   
  9.   
  10. //槽(slot)  
  11. CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節點。  
  12. CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節點的指派。  
  13. CLUSTER FLUSHSLOTS 移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。  
  14. CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點刪除該槽>,然後再進行指派。  
  15. CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節點的槽 slot 遷移到 node_id 指定的節點中。  
  16. CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節點中導入槽 slot 到本節點。  
  17. CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的導入(import)或者遷移(migrate)。   
  18.   
  19. //鍵 (key)  
  20. CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪個槽上。  
  21. CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。  
  22. CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。  

 


2. 配置文件

開啟cluster的redis必須是空伺服器

修改redis.conf開啟cluster

 

設置3個cluster

 

10.24.6.7:6379

10.24.6.4:6379

10.24.6.6:6379

3. 查看初始redis集群狀態

啟動三個節點上的Redis伺服器。此時,三個Redis伺服器節點均會以Redis Cluster的方式開始運行,但並沒有自動構建集群,因為三者還處於“我不認識你,你不屬於我”的狀態,它們每個都是孤零零的Redis節點,或者是只包含了一個節點的集群。我們可以通過Redis客戶端連接到伺服器查看它們的狀態,圖一給出了狀態查詢方法和查詢結果,其中cluster nodes命令用於查看當前Redis節點所屬的Redis集群中的所有節點,而cluster info則用於查看當前Redis節點所屬的Redis集群的整體狀態。由圖中我們可以看到,Redis集群中僅包含一個Redis節點,也就是當前節點,整個集群的狀態是fail。

 


4. 分配hash slot

通過上面的操作,我們已經將三個各自為政的Redis節點規划到一個相同的集群中,那麼我們現在是否就已經完成了集群搭建的所有工作了呢?非也!通過圖二中對集群狀態的查看我們可以知道,當前集群的狀態還是fail,此時的Redis集群是不工作的,無法處理任何Redis命令。那麼集群的狀態為什麼還是fail呢?本博主通過查看官方文檔說明找到了原因所在,現摘錄原文如下:

The FAIL state for the cluster happens in two cases.

1) If at least one hash slot is not served as the node serving it currently is in FAIL state.

2) If we are not able to reach the majority of masters (that is, if the majorify of masters are simply in PFAIL state, it is enough for the node to enter FAIL mode).

很明顯,導致我們的集群處於fail狀態的原因不是第二個條,也就是說至少有一個hash slot沒有被服務!稍微考慮一下,可不是!何止有一個hash slot沒有被服務,壓根兒就沒有Redis節點為任何hash slot服務!眾所周知,Redis Cluster通過hash slot將數據根據主鍵來分區,所以一條key-value數據會根據演算法自動映射到一個hash slot,但是一個hash slot存儲在哪個Redis節點上並不是自動映射的,是需要集群管理者自行分配的。那麼我們需要為多少個hash slot分配Redis節點呢?根據源碼可知是16384個,即我們要將16384個hash slot分配到集群內的三個節點上。Redis中用於分配hash slot的命令有很多,其中包括cluster addslots、cluster delslots和cluster setslot。鑒於我們現在是集群的初始化階段,所以我們可以選擇cluster addslots來分配hash slot,該命令的語法為cluster addslots slot1 [slot2] ... [slotN]。

4.1. nodes-6379.conf分配

每個redis客戶端單獨分配自己負責的部分

修改內容如下:cda76a0a094d2ce624e33bed7f3c75689a4128fd :0 myself,master - 0 0 connected 0-5000(註意是在自身節點的描述,也就是包含了myself那一行的後面追加hash slot的範圍)。類似的,Redis Cluster Node2上nodes-6379.conf文件中追加5001-10000,Redis Cluster Node3上nodes-6379.conf文件中追加10001-16383。經過這樣的配置後,Redis Cluster Node1負責存儲0至5000之間的所有hash slots,Redis Cluster Node2負責存儲5001至10000之間的所有hash slots,Redis Cluster Node3負責存儲10001至16383的所有hash slots。

 

 

4.2. Redis cluster 命令分配

 

 

5. 搭建Redis集群

這裡所謂的搭建集群,說白了就是讓之前啟動的三個Redis節點彼此連通,意識到彼此的存在,那麼如何做到這一點呢?答案就是cluster meet命令。該命令的作用就是將當前節點主動介紹給另外一個節點認識,圖二給出了cluster meet命令的執行方法和執行效果,由圖中可知我們使用cluster meet命令分別將Redis Cluster Node1介紹給了Redis Cluster Node2(節點IP地址為192.168.32.3,運行埠為6379)和Redis Cluster Node3(節點IP地址為192.168.32.4,運行埠為6379),之後我們再次查看集群節點和集群狀態就可以知道,三個節點已經成功合併到了同一個集群中。

 

這裡找到了3個節點

查看10.24.6.6客戶端

 

至此,3個結點

 

 

搭建完成標識:

 

在集群狀態顯示為ok之後,我們就可以像在Redis單機版上一樣執行Redis命令了。

 

 


6. 測試

6.1. 非集群模式

6.1.1.  Redis-cli

 

 

非集群模式客戶端在cluster跳轉時會提示MOVED錯誤

 

6.1.2.  Redis客戶端庫

from redis.sentinel import Sentinel
sentinel = Sentinel([(
'10.24.6.7', 26379)], socket_timeout=0.1)
master = sentinel.master_for(
'10.24.6.5master', socket_timeout=0.1)
print master
master.set(
'aaaaaaaaaaaaaaa', 'bar')
master.set(
'bbbbbbbbbbbbbbbb', 'bar')
print master.get('aaaaaaaaaaaaaaa')
print master.get('bbbbbbbbbbbbbbbb')

 

Traceback (most recent call last):

  File "E:/HomeInternet/server/utest_workspace/utest_utils/utest_unit/__init__.py", line 23, in <module>

    master.set('bbbbbbbbbbbbbbbb', 'bar')

  File "build\bdist.win32\egg\redis\client.py", line 1055, in set

  File "build\bdist.win32\egg\redis\client.py", line 565, in execute_command

  File "build\bdist.win32\egg\redis\client.py", line 577, in parse_response

  File "build\bdist.win32\egg\redis\sentinel.py", line 55, in read_response

  File "build\bdist.win32\egg\redis\connection.py", line 574, in read_response

redis.exceptions.ResponseError: MOVED 9577 10.24.6.6:6379

 

 

6.2. 集群模式(-C)

6.2.1.  Redis-cli

 

集群模式客戶端在跳轉時會自動進行結點轉向

6.2.2. Redis Cluster

https://github.com/Grokzen/redis-py-cluster

 

from rediscluster import StrictRedisCluster
startup_nodes = [{
"host": "10.24.6.7", "port": "6379"}]
rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
print rc.set("bbbbbbbbbbbbbbbb", "bar")
True
print rc.get("bbbbbbbbbbbbbbbb")

 

 

 

6.2.3. Redis Sentinel + Cluster

from redis.sentinel import Sentinel
from redisclusterimport StrictRedisCluster
sentinel = Sentinel([(
'10.24.6.7', 26379)], socket_timeout=0.1)
ip, port = sentinel.discover_master(
'10.24.6.5master')
rc = StrictRedisCluster(host=ip, port=port, decode_responses=True)
print rc.set("bbbbbbbbbbbbbbbb", "bar")
print rc.get("bbbbbbbbbbbbbbbb")

 


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

-Advertisement-
Play Games
更多相關文章
  • CHAR char (M) M字元,長度是M*字元編碼長度,M最大255。 驗證如下: VARCHAR VARCHAR(M),M同樣是字元,長度是M*字元編碼長度。它的限制比較特別,行的總長度不能超過65535位元組。 註意,以上表的預設字元集是latin1,字元長度是1個位元組,所以對於varchar ...
  • 一、 是否支持多線程? SQLite官網上的“Is SQLite threadsafe?”這個問答。 簡單來說,從3.3.1版本開始,它就是線程安全的了。而iOS的SQLite版本沒有低於這個版本的,當然,你也可以自己編譯最新版本。 不過這個線程安全仍然是有限制的,在這篇《Is SQLite thr ...
  • 回到目錄 redis的客戶端有很多,這次用它的pub/sub發佈與訂閱我選擇了StackExchange.Redis,發佈與訂閱大家應該很清楚了,首先一個訂閱者,訂閱一個服務,服務執行一些處理程式(可能是寫個日誌,插入個數據,發個email)然後當另一個項目的某個業務發佈這個服務後,被訂閱的程式將會 ...
  • 問題現象:使用綠色版PL/SQL工具進行登錄時報如下截圖錯誤: 問題描述:初始化失敗,無法鎖定oci.dll 解決方法:在PLSQL的菜單欄里依次選擇 工具—>首選項,在OCI庫(自動檢測為空)項中手動更改其位置,指向bin目錄中的oci.dll的位置,問題即可解決。 註意:絕對路徑,如D:\Pro... ...
  • HBase是一種資料庫:HadoopDatabase顧名思義就是Hadoop資料庫,它是一種基於hadoop文件系統HDFS的一種分散式資料庫,專門設計用來快速隨機讀寫大規模數據。本文介紹HBase的下載與安裝的整個過程。 一、HBase的下載 1.登錄HBase官網http://hbase.apa ...
  • 一、選擇Percona Server、MariaDB還是MYSQL mysql應用源碼:http://www.jinhusns.com/Products/Download/?type=xcj 1、Mysql三種存儲引擎 MySQL提供了兩種存儲引擎:MyISAM和 InnoDB,MySQL4和5使用 ...
  • 接上一篇Mysql性能優化一 建立適當的索引 說起提高資料庫性能,索引是最物美價廉的東西了。不用加記憶體,不用改程式,不用調sql,只要執行個正確的'create index',查詢速度就可能提高百倍千倍,這可真有誘惑力。可是天下沒有免費的午餐,查詢速度的提高是以插入、更新、刪除的速度為代價的,這些寫 ...
  • 在部署環境時,不同的環境可能會有一些不同步,而個人遇到的問題就是在開發環境中表中均有欄位 BestCaseId 和 RiskId 欄位,生產環境中目前只有 BestCaseId 欄位,新搭建的測試環境中暫時都不存在這兩個欄位(某些原因需要另一單獨測試環境)。 保證在生產環境中的 BestCaseId ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...