1. 程式人生 > >高效能網站架構之快取篇—Redis叢集搭建

高效能網站架構之快取篇—Redis叢集搭建

         看過高效能網站架構之快取篇--Redis安裝配置高效能網站架構之快取篇--Redis使用配置埠轉發這兩篇文章的,相信你已經對redis有一定的瞭解,並能夠安裝上,進行簡單的使用了,但是在咱們的實際應用中,使用redis肯定不會使用單機版,不光是redis不能使用單機版,其他的也不會使用,所以今天我們來說一下redis cluster的安裝。

1.  Redis Cluster的架構圖。

          

         (1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.

         (2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.

         (3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可。

         (4)redis-cluster把所有的物理節點對映到[0-16383]slot上(雜湊槽),cluster 負責維護

Redis 叢集中內建了 16384 個雜湊槽,當需要在Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點。

2.  redis-cluster投票:容錯

          

         (1)領著投票過程是叢集中所有master參與,如果半數以上master節點與其中一個master節點通訊超時(cluster-node-timeout),認為當前master節點掛掉.

         (2):什麼時候整個叢集不可用(cluster_state:fail)? 

         a:如果叢集任意master掛掉,且當前master沒有slave.叢集進入fail狀態,也可以理解成叢集的slot對映[0-16383]不完成時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage

引數,預設關閉,開啟叢集相容部分失敗.

        b:如果叢集超過半數以上master掛掉,無論是否有slave叢集進入fail狀態.

        ps:當叢集不可用時,所有對叢集的操作做都不可用,收到((error)CLUSTERDOWN The cluster is down)錯誤。

3.  安裝環境

        Redis Cluster的安裝需要的環境我們需要準備好,最重要的最難解決的就是ruby環境,在這裡,給大家一個連線,如至直接安裝ruby,安裝不上的話,大家可以參考這篇文章RubyGems映象,淘寶的ruby映象。他是沒15分鐘更新一次,所以跟國外的基本一樣。

4.  叢集搭建

        本次為實驗教程,所以在一臺虛擬機器中進行搭建,跟在多臺真機上搭建其實沒有什麼區別,只要保證網路通訊ok就可以了!

        我們在幾臺機器上通過埠號的不同,搭建一個偽叢集。在一個伺服器上建立多個redis例項。埠號如下所示

主節點:127.0.0.1:7001 127.0.0.1:7002127.0.0.1:7003

從節點:127.0.0.1:7004127.0.0.1:7005127.0.0.1:7006

在/usr/local下建立redis-cluster目錄,其下建立redis01、redis02。。redis06目錄,如下:

        

         然後我們將redis 安裝到redis01中,安裝完以後我們在將Redis編譯目錄中的redis。Conf檔案複製到redis01目錄下,就會看到在redis01目錄下會有如下的檔案。

        

         然後我們將redis01資料夾的檔案分別複製到redis02……redis06資料夾中。同時將redis原始碼目錄src下的redis-trib.rb拷貝到redis-cluster目錄下。

        修改每個資料夾下的配置檔案,有三點需要修改,每個配置檔案都要配置自己的埠號,不能重複。

        

        準備好以上工作以後,我們分別啟動每個redis進行的例項。如果麻煩的話,可以自己寫一個執行指令碼。啟動完畢以後我們輸入命令ps ax|grep redis ,檢視例項是否啟動,出現如下所以圖片,表示所有的例項都啟動了。

       

       例項啟動完以後,我們要開始建立叢集,在redis-cluter資料夾下執行如下命令。

 <span style="font-size:18px;">  ./redis-trib.rbcreate --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004127.0.0.1:7005  127.0.0.1:7006。
</span><p><span style="font-size:18px;">>>> Creating cluster</span></p><p><span style="font-size:18px;">Connecting to node 127.0.0.1:7001: OK</span></p><p><span style="font-size:18px;">Connecting to node 127.0.0.1:7002: OK</span></p><p><span style="font-size:18px;">Connecting to node 127.0.0.1:7003: OK</span></p><p><span style="font-size:18px;">Connecting to node 127.0.0.1:7004: OK</span></p><p><span style="font-size:18px;">Connecting to node 127.0.0.1:7005: OK</span></p><p><span style="font-size:18px;">Connecting to node 127.0.0.1:7006: OK</span></p><p><span style="font-size:18px;">>>> Performing hash slotsallocation on 6 nodes...</span></p><p><span style="font-size:18px;">Using 3 masters:</span></p><p><span style="font-size:18px;">127.0.0.1:7001</span></p><p><span style="font-size:18px;">127.0.0.1:7002</span></p><p><span style="font-size:18px;">127.0.0.1:7003</span></p><p><span style="font-size:18px;">Adding replica 127.0.0.1:7004 to 127.0.0.1:7001</span></p><p><span style="font-size:18px;">Adding replica 127.0.0.1:7005 to 127.0.0.1:7002</span></p><p><span style="font-size:18px;">Adding replica 127.0.0.1:7006 to 127.0.0.1:7003</span></p><p><span style="font-size:18px;">M: 5a8523db7e12ca600dc82901ced06741b3010076127.0.0.1:7001</span></p><p><span style="font-size:18px;">  slots:0-5460 (5461 slots) master</span></p><p><span style="font-size:18px;">M: bf6f0929044db485dea9b565bb51e0c917d20a53127.0.0.1:7002</span></p><p><span style="font-size:18px;">  slots:5461-10922 (5462 slots) master</span></p><p><span style="font-size:18px;">M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca127.0.0.1:7003</span></p><p><span style="font-size:18px;">  slots:10923-16383 (5461 slots) master</span></p><p><span style="font-size:18px;">S: 2a61b87b49e5b1c84092918fa2467dd70fec115f127.0.0.1:7004</span></p><p><span style="font-size:18px;">  replicates 5a8523db7e12ca600dc82901ced06741b3010076</span></p><p><span style="font-size:18px;">S: 14848b8c813766387cfd77229bd2d1ffd6ac8d65127.0.0.1:7005</span></p><p><span style="font-size:18px;">  replicates bf6f0929044db485dea9b565bb51e0c917d20a53</span></p><p><span style="font-size:18px;">S: 3192cbe437fe67bbde9062f59d5a77dabcd0d632127.0.0.1:7006</span></p><p><span style="font-size:18px;">  replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca</span></p><p><span style="font-size:18px;">Can I set the above configuration? (type'yes' to accept): <strong><span style="color:lime;">yes</span></strong></span></p><p><span style="font-size:18px;">>>> Nodes configuration updated</span></p><p><span style="font-size:18px;">>>> Assign a different configepoch to each node</span></p><p><span style="font-size:18px;">>>> Sending CLUSTER MEET messagesto join the cluster</span></p><p><span style="font-size:18px;">Waiting for the cluster to join.....</span></p><p><span style="font-size:18px;">>>> Performing Cluster Check(using node 127.0.0.1:7001)</span></p><p><span style="font-size:18px;">M: 5a8523db7e12ca600dc82901ced06741b3010076127.0.0.1:7001</span></p><p><span style="font-size:18px;">  slots:0-5460 (5461 slots) master</span></p><p><span style="font-size:18px;">M: bf6f0929044db485dea9b565bb51e0c917d20a53127.0.0.1:7002</span></p><p><span style="font-size:18px;">  slots:5461-10922 (5462 slots) master</span></p><p><span style="font-size:18px;">M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca127.0.0.1:7003</span></p><p><span style="font-size:18px;">  slots:10923-16383 (5461 slots) master</span></p><p><span style="font-size:18px;">M: 2a61b87b49e5b1c84092918fa2467dd70fec115f127.0.0.1:7004</span></p><p><span style="font-size:18px;">  slots: (0 slots) master</span></p><p><span style="font-size:18px;">  replicates 5a8523db7e12ca600dc82901ced06741b3010076</span></p><p><span style="font-size:18px;">M: 14848b8c813766387cfd77229bd2d1ffd6ac8d65127.0.0.1:7005</span></p><p><span style="font-size:18px;">  slots: (0 slots) master</span></p><p><span style="font-size:18px;">  replicates bf6f0929044db485dea9b565bb51e0c917d20a53</span></p><p><span style="font-size:18px;">M: 3192cbe437fe67bbde9062f59d5a77dabcd0d632127.0.0.1:7006</span></p><p><span style="font-size:18px;">  slots: (0 slots) master</span></p><p><span style="font-size:18px;">  replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca</span></p><p><span style="font-size:18px;">[OK] All nodes agree about slotsconfiguration.</span></p><p><span style="font-size:18px;">>>> Check for open slots...</span></p><p><span style="font-size:18px;">>>> Check slots coverage...</span></p><p><span style="font-size:18px;">[OK] All 16384 slots covered.</span></p>

         這樣就表示我們的叢集建立成功了!

5.  叢集測試

        我們輸入redis01/redis-cli -h 127.0.0.1  -p 7002–c命令後,切忌要加入-c,否則我們進入的不是叢集環境。進入客戶端以後,我們輸入set a 100 發現他會進行跳轉,這就是因為他經過計算以後,要儲存100的hash槽在7003 例項上。這樣就表示我們的叢集成功了!

        

         關閉redis叢集不能直接kill掉程序,或者關機,我們要通過命令redis01/redis-cli -p 7001 shutdown進行關閉,這樣在關閉之前,資料才能夠進行儲存。