轉載請出自出處:http://www.cnblogs.com/hd3013779515/ 一、基本概念 1、redis集群是一個可以在多個節點之間進行數據共用的設施。redis集群提供了以下兩個好處1.1 將數據自動切分(split)到多個節點1.2 當集群中的某一個節點故障時,redis還可以繼續 ...
轉載請出自出處: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:分別啟動這6個redis 實例
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一直在接受寫請求,而造成很長時間數據不一致。