Redis集羣配置

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# 客戶端,支持集羣功能;

相關文章
相關標籤/搜索