1. 程式人生 > >2.Redis集群環境搭建

2.Redis集群環境搭建

lin nal all 添加 cli .tar.gz 嘗試 工作 require

轉載請出自出處: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文件。

技術分享

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

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

技術分享

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步的命令,正常執行

技術分享

輸入 yes,然後配置完成。

技術分享

至此 redis集群即搭建成功!

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

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

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

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

技術分享

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

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

技術分享

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

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

技術分享

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一直在接受寫請求,而造成很長時間數據不一致。

2.Redis集群環境搭建