高效能網站架構之快取篇—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進行關閉,這樣在關閉之前,資料才能夠進行儲存。