Redis Cluster搭建方法简介22211111
生活随笔
收集整理的這篇文章主要介紹了
Redis Cluster搭建方法简介22211111
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Redis?Cluster搭建方法簡介
?(2013-05-29 17:08:57) 轉載▼ Redis Cluster即Redis的分布式版本,將是Redis繼支持Lua腳本之后的又一重磅功能,官方聲明將會在今年第三季度發布Redis Cluster的beta版并在年底發布第一個穩定版本。當前,雖然Redis的穩定版本里還沒有集成分布式功能,但實際上在開發版中Redis Cluster的開發已經取得了長足的進展,我們已經可以搭建Redis集群并使用其部分功能了。今天,本博主基于最新的開發版代碼嘗試著搭建了一個三節點的Redis集群,這里不妨把過程簡單總結一下,希望能對各位看客們有所幫助!(注:本篇博文中的搭建方法是徹徹底底的野路子,Redis官方已正式發布Redis Cluster搭建方法,鏈接如下:http://redis.io/topics/cluster-tutorial。) 首先,下載最新的Redis開發版源碼包。這個再簡單不過了,大家既可以去Redis在github上的主頁下載,也可以直接運行“git clone git://github.com/antirez/redis.git”克隆整個Redis代碼庫,當然前提是你已經安裝了git。 其次,安裝Redis。因為本博主要搭建一個三節點的Redis集群,所以在這三個節點上都要安裝好Redis,我們這里姑且將這三個節點命名為Redis Cluster Node1/Node2/Node3吧,安裝目錄為/usr/local/redis/。 再次,修改Redis配置文件。因為即使是在支持分布式功能的開發版中,Redis配置文件也是默認不打開Redis Cluster的,所以在啟動Redis服務器之前,我們需要修改Redis配置文件,打開Redis Cluster。為了簡單起見,我們這里只修改與Redis Cluster相關的配置,其他無關的配置均采用默認值,具體修改內容如下: ################################ REDIS CLUSTER ?############################### # # Normal Redis instances can't be part of a Redis Cluster; only nodes that are # started as cluster nodes can. In order to start a Redis instance as a # cluster node enable the cluster support uncommenting the following: # cluster-enabled yes # Every cluster node has a cluster configuration file. This file is not # intended to be edited by hand. It is created and updated by Redis nodes. # Every Redis Cluster node requires a different cluster configuration file. # Make sure that instances running in the same system does not have # overlapping cluster configuration file names. # cluster-config-file nodes-6379.conf # Cluster node timeout is the amount of seconds a node must be unreachable # for it to be considered in failure state. # Most other internal time limits are multiplicators of the node timeout. # cluster-node-timeout 15 # In order to setup your cluster make sure to read the documentation # available at http://redis.io web site. ? 再次,啟動三個節點上的Redis服務器。此時,三個Redis服務器節點均會以Redis Cluster的方式開始運行,但并沒有自動構建集群,因為三者還處于“我不認識你,你不屬于我”的狀態,它們每個都是孤零零的Redis節點,或者是只包含了一個節點的集群。我們可以通過Redis客戶端連接到服務器查看它們的狀態,圖一給出了狀態查詢方法和查詢結果,其中cluster nodes命令用于查看當前Redis節點所屬的Redis集群中的所有節點,而cluster info則用于查看當前Redis節點所屬的Redis集群的整體狀態。由圖中我們可以看到,Redis集群中僅包含一個Redis節點,也就是當前節點,整個集群的狀態是fail。圖一 未形成集群時Redis節點狀態 再次,搭建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),之后我們再次查看集群節點和集群狀態就可以知道,三個節點已經成功合并到了同一個集群中。
圖二 搭建Redis集群 再次,為集群中的Redis節點分配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]。
圖三 Redis Cluster Node1上nodes-6379.conf的內容 但是另一個問題又出現了,對于16384個hash slot來說,我們總不能用cluster addslots一個個去分配吧?幸運的是,我們還有另外一種方法來分配hash slot,那就是通過集群配置文件,也就是我們在第三步中配置的cluster-config-file參數,來完成hash slot的分段配置。此時,我們在執行Redis服務器啟動的目錄下找到名字為nodes-6379.conf的配置文件。圖三給出了Redis Cluster Node1上nodes-6379.conf的內容,由圖可知該文件中的內容與我們執行cluster nodes命令得到的結果一樣,就是對集群中所有Redis節點的描述,而我們需要修改的就是為每個節點添加上hash slot的分配信息。針對Redis Cluster Node1上nodes-6379.conf的內容,修改內容如下: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。 保存以上修改,通過Redis客戶端將三個Redis服務器重啟,再次執行命令cluster nodes和cluster info,我們就可以看到集群的狀態已經為ok了(如圖四所示),這說明之前對于集群配置文件的修改確實起到了作用。如果經過以上步驟之后集群狀態依然是fail的話,可以重新修改一下三個節點的nodes-6379.conf,將其中所有除myself那一行以外的所有配置行都刪除,然后再保存重啟服務器即可。當然,這里需要說明的一點是,本博主并沒有看到任何關于Redis Cluster集群配置文件的官方文檔,以上配置方法盡管有效但并不一定是官方推薦的做法!
圖四 修改集群配置文件后重啟的集群狀態 最后,執行Redis命令。在集群狀態顯示為ok之后,我們就可以像在Redis單機版上一樣執行Redis命令了。圖五顯示了Redis客戶端連接到Redis Cluster Node1上執行“set foo bar”命令的執行結果,由圖可知主鍵foo所屬的hash slot存儲在Redis Cluster Node3上。我們再連接到Redis Cluster Node3,執行相同的命令,正確執行!
圖五 執行Redis命令 參考鏈接:http://redis.io/topics/cluster-spec
總結
以上是生活随笔為你收集整理的Redis Cluster搭建方法简介22211111的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 802.11学习笔记1-WIFI参数含义
- 下一篇: postgresql数据库基础