1 Redis集羣配置
1.1簡介
Redis集羣是一個由多個節點組成的分佈式服務器羣,它具備複製、高可用和分片特性;node
Redis集羣沒有中心節點,而且帶有複製和故障轉移特性,這能夠避免單個節點成爲性能瓶頸,或者由於某個節點下線而致使整個集羣下線;redis
集羣中的主節點負責處理槽(存儲數據),從節點則是主節點的複製品;數據庫
Redis集羣將整個數據庫分紅16384個槽,數據庫中的每一個鍵都屬於16384個槽中的其中一個;ruby
集羣中的每一個主節點均可以負責0到16384個槽,當16384個槽都有節點在負責時,集羣進入上線狀態,能夠執行客戶端發送的數據命令;服務器
主節點只會執行和本身負責的槽相關的命令,當節點接收到不屬於本身處理的槽的命令時,它會將處理指定槽的節點的地址返回給客戶端,而客戶端會向正確的節點從新發送命令,這個過程稱爲「轉向」;分佈式
Redis 集羣經過分區(partition)來提供必定程度的可用性(availability):即便集羣中有一部分節點失效或者沒法進行通信,集羣也能夠繼續處理命令請求。性能
Redis 集羣提供瞭如下兩個好處:測試
將數據自動切分(split)到多個節點的能力。
當集羣中的一部分節點失效或者沒法進行通信時, 仍然能夠繼續處理命令請求的能力。
es5
1.2實現機制
Redis Cluster 是Redis的集羣實現,內置數據自動分片機制,集羣內部將全部的key映射到16384個Slot中,集羣中的每一個Redis Instance負責其中的一部分的Slot的讀寫。集羣客戶端鏈接集羣中任一Redis Instance便可發送命令,當Redis Instance收到本身不負責的Slot的請求時,會將負責請求Key所在Slot的Redis Instance地址返回給客戶端,客戶端收到後自動將原請求從新發往這個地址,對外部透明。一個Key到底屬於哪一個Slot由crc16(key)% 16384 決定。.net
關於集羣成員管理,集羣的節點(Redis Instance)和節點之間兩兩按期交換集羣內節點信息而且更新,從發送節點的角度看,這些信息包括:集羣內有哪些節點,IP和PORT是什麼,節點名字是什麼,節點的狀態(好比OK,PFAIL,FAIL,後面詳述)是什麼,包括節點角色(master或者 slave)等。
關於可用性,集羣由N組主從Redis Instance組成。主能夠沒有從,可是沒有從 意味着主宕機後主負責的Slot讀寫服務不可用。一個主能夠有多個從,主宕機時,某個從會被提高爲主,具體哪一個從被提高爲主,協議相似於Raft,參見這裏。如何檢測主宕機?Redis Cluster採用quorum+心跳的機制。從節點的角度看,節點會按期給其餘全部的節點發送Ping,cluster-node-timeout(可配置,秒級)時間內沒有收到對方的回覆,則單方面認爲對端節點宕機,將該節點標爲PFAIL狀態。經過節點之間交換信息收集到quorum個節點都認爲這個節點爲PFAIL,則將該節點標記爲FAIL,而且將其發送給其餘全部節點,其餘全部節點收到後當即認爲該節點宕機。從這裏能夠看出,主宕機後,至少cluster-node-timeout時間內該主所負責的Slot的讀寫服務不可用。
1.3依賴配置
Redis集羣配置以前須要依賴一些相關庫配置,所以須要先安裝如下相關庫;
(1) 確保系統安裝zlib,不然gem install會報(no such file to load -- zlib)
# download:zlib-1.2.8.tar.gz
# tar –zxvfzlib-1.2. 8.tar.gz
# cd zlib-1.2.8
#./configure
# make
# makeinstall
(2) 安裝ruby:version(2.2.2)
# download:ruby-2.2.2.tar.gz
# tar –zxvf ruby-2.2.2.tar.gz
# cd /ruby-2.2.2
#./configure-prefix=/usr/local/ruby
# make
# makeinstall
# cp ruby/usr/local/bin
安裝完成後能夠查看相應的版本信息:
# ruby –v
(3)安裝rubygem:version(1.8.16)
# down rubygems-2.4.7.tar.gz
# tar –zxvf rubygems-2.4.7.tar.gz
# cd rubygems-2.4.7
# rubysetup.rb
# cp rubygems-2.4.7/bin/gem/usr/local/bin
安裝完成後能夠查看相應的版本信息:
# gem –v
(4)安裝redis與ruby接口gem-redis:version(3.0.6)
gem install -l /data/soft/redis-3.0.6.gem
1.4集羣配置
集羣配置案例:
一、 redis源碼下載,make安裝;
$ tar xzf redis-3.0.1.tar.gz
$ cd redis-3.0.1
$ make
The binaries that are nowcompiled are available in the src directory. Run Redis with:
二、新建6個instance,3個master,3個slave;
新建實例時須要更改每個實例redis.conf的內容,須要綁定網卡IP以及修改相應端口號,集羣配置以下:
daemonize yes #是否之後臺進程運行,默認爲no
pidfile /var/run/redis_xxxx.pid #如之後臺進程運行,則需指定一個pid文件
logfile /var/log/redis.log #日誌記錄方式,默認值爲stdout
dbfilename dump.rdb #本地數據庫文件名,默認值爲dump.rdb
dir ./ #本地數據庫存放路徑,默認值爲 ./
bind x.x.x.x #綁定主機IP,必須綁定相應的網卡IP
port xxxx #監聽端口,默認爲6379
cluster-enabledyes #是否啓用集羣
cluster-config-file/user/software/redis/nodefile/nodes-設置爲相應端口號xxxx.conf
cluster-node-timeout15
本例中的最後相應master與slave配置以下:
master:
ip port
--------------------------------------------------------
172.168.10.252 7000
172.168.10.253 7000
172.168.10.254 7000
slave
ip port
--------------------------------------------------------
172.168.10.252 7001
172.168.10.253 7001
172.168.10.254 7001
三、建立集羣節點:
建立集羣的操做能夠經過使用位於Redis安裝文件夾內的redis-trib.rb來完成,
使用redis任意一實例src下redis-trib.rb進行集羣節點配置;
其中—replicas表示設置slave節點
如不設置slave節點則 --replicas 0:
[root@node01 src]# ./redis-trib.rb create --replicas 0172.168.10.252:7000 172.168.10.253:7000 172.168.10.254:7000
若設置一個slave節點則 --replicas 1:
[root@node01 src]# ./redis-trib.rb create --replicas 1172.168.10.252:7000 172.168.10.253:7000 172.168.10.254:7000 172.168.10.252:7001172.168.10.253:7001 172.168.10.254:7001
>>> Creating cluster
Connecting to node 172.168.10.252:7000: OK
Connecting to node 172.168.10.253:7000: OK
Connecting to node 172.168.10.254:7000: OK
Connecting to node 172.168.10.252:7001: OK
Connecting to node 172.168.10.253:7001: OK
Connecting to node 172.168.10.254:7001: OK ###首先嚐試鏈接給定的六個節點,檢查它們是否存在
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
172.168.10.252:7000
172.168.10.253:7000
172.168.10.254:7000
Adding replica 172.168.10.253:7001 to 172.168.10.252:7000
Adding replica 172.168.10.252:7001 to 172.168.10.253:7000
Adding replica 172.168.10.254:7001 to 172.168.10.254: 7000 ###在肯定這些節點都是可鏈接以後,redistrib.rb 再將7000設置爲主節點,而700一、7001和7001則分別被設置爲三個主節點的從節點
M: 50a69c4c99413b86e1afbe0eee499b11d0ea4bb7 172.168.10.252:7000
slots:0-5460 (5461slots) master
M: 3c7a80e633fc9318c9adbb95d56109f11e0a5f39 172.168.10.253:7000
slots:5461-10922 (5462slots) master
###對於三個主節點,redis-trib.rb 會分別爲它們指派546一、5462和5461個槽(默認狀況下使用平均分配)
M: 4e20023a126560c39832e56456898a54816b6daa 172.168.10.254:7000
slots:10923-16383(5461 slots) master
S: 62078686a716e7ee402725fcd1853cbf8f127355 172.168.10.252:7001
replicates3c7a80e633fc9318c9adbb95d56109f11e0a5f39
S: f1409c7ec4619f6c964cf7fa413710009e55ef04 172.168.10.253:7001
replicates50a69c4c99413b86e1afbe0eee499b11d0ea4bb7
S: e16542a68d0a5b0aec0e3cf0d85ad37638677aad 172.168.10.254:7001
replicates 4e20023a126560c39832e56456898a54816b6daa
Can I set the aboveconfiguration? (type 'yes' to accept): yes
###這個配置沒問題的話,就能夠鍵入 yes 並按下回車
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
….
….
…
###redis-trib.rb 會對集羣進行測試,檢查是否每一個節點都按照原先展現的配置設置好了
…
[OK] All nodesagree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384slots covered.
至此集羣配置完成.
1.5測試驗證
[root@node01 src]# ./redis-cli -h 172.168.10.252 -p 7000
172.168.10.252:7000> get date
(nil)
172.168.10.252:7000> get aa
(nil)
172.168.10.252:7000> get name
(error) MOVED 5798 172.168.10.253:7000
172.168.10.252:7000>
2 集羣訪問
使用集羣客戶端向集羣發送命令請求
目前主要的 Redis 集羣客戶端(或者說,支持集羣功能的 Redis 客戶端)有如下這些:
一、redis-rb-cluster:antirez 使用Ruby 編寫的 Redis 集羣客戶端,集羣客戶端的官方實現;
二、predis:Redis的 PHP 客戶端,支持集羣功能;
三、jredis:Redis的 JAVA 客戶端,支持集羣功能;
四、StackExchange.Redis:Redis 的C# 客戶端,支持集羣功能;