Redis Cluster 集群伺服器設定

Redis集群提供了以下兩個好處:
#將數據自動切分(split)到多個節點的能力。
#當集群中的一部分節點失效或者無法進行通訊時,仍然可以繼續處理命令請求的能力。
 
 

Redis 架構

架構細節:
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
(2)節點的fail是通過集群中超過半數的節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可
(4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster負責維護node<->slot<->value
 
 
 
Redis 架構圖
 

Redis Cluster 搭建與使用

要讓集群正常工作至少需要3個主節點,在這裡我們要創建6個redis節點,其中三個為主節點,三個為從節點,對應的redis節點的ip和端口對應關係如下(為了簡單演示都在同一台機器上面)。
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
127.0.0.1:7004
127.0.0.1:7005
 
 
[安裝 redis]
 
創建存放多個實例的目錄
mkdir /home/pi/data/cluster -p
cd /home/pi/data/cluster
mkdir 7000 7001 7002 7003 7004 7005
 
修改配置文件
樹莓派
cp /etc/redis.conf /home/pi/data/cluster/7000/
 
Linux
cp /home/pi/redis-4.0.2/redis.conf /home/pi/data/cluster/7000/
 
修改以下選項(修改完成後,把修改完成的redis.conf複製到7001-7005目錄下,並且端口修改成和文件夾對應):

port 7000
daemonize yes —> 即默認以後台程序方式運行
cluster-enabled yes  —> 文件中的cluster-enabled選項用於開實例的集群模式
cluster-config-file nodes.conf —> cluster-conf-file 選項則設定了保存節點配置文件的路徑, 默認值為nodes.conf
cluster-node-timeout 5000
appendonly yes—> 開啟 AOF 模式

複製 redis.conf 到以下目錄並改寫 port(7001、7002、7003、7004、7005 )


cp /home/pi/data/cluster/7000/redis.conf /home/pi/data/cluster/7001/
cp /home/pi/data/cluster/7000/redis.conf /home/pi/data/cluster/7002/
cp /home/pi/data/cluster/7000/redis.conf /home/pi/data/cluster/7003/
cp /home/pi/data/cluster/7000/redis.conf /home/pi/data/cluster/7004/
cp /home/pi/data/cluster/7000/redis.conf /home/pi/data/cluster/7005/

按上述步驟重複修改以上屬性
 
分別啟動 6 個 redis 實例
 
樹莓派
cd /home/pi/data/cluster/7000
redis-server redis.conf

cd /home/pi/data/cluster/7001
redis-server redis.conf

cd /home/pi/data/cluster/7002
redis-server redis.conf

cd /home/pi/data/cluster/7003
redis-server redis.conf

cd /home/pi/data/cluster/7004 
redis-server redis.conf

cd /home/pi/data/cluster/7005 
redis-server redis.conf
 
查看進程是否存在
ps -ef | grep redis

 
檢查是否端口為進程
netstat -npl
 
[執行命令創建 cluster]
 
安裝ruby相關的環境,否則創建集群可能會失敗
sudo apt-get install rubygems
 
安裝運行需要依賴的ruby的包gem-redis

必須與 redis 安裝版本一致 
cd ~
sudo gem install -l redis-4.0.1.gem
 
異常處理

 
更新 ruby 版本
 
複製集群管理程序到/usr/local/bin
cp redis-4.0.1/src/redis-trib.rb /usr/local/bin/redis-trib
 
創建集群
redis-trib create --replicas 1 192.168.43.10:7000192.168.43.10:7001192.168.43.10:7002192.168.43.10:7003192.168.43.10:7004192.168.43.10:7005
 
命令的意義如下:
*給定redis-trib.rb程序的命令是create,這表示我們希望創建一個新的集群。
*選項–replicas 1表示我們希望為集群中的每個主節點創建一個從節點。
*之後跟著的其他參數則是實例的地址列表,我們希望程序使用這些地址所指示的實例來創建新集群。
簡單來說,以上命令的意思就是讓redis-trib程序創建一個包含三個主節點和三個從節點的集群。
接著,redis-trib會打印出一份預想中的配置給你看,如果你覺得沒問題的話,就可以輸入yes,redis-trib就會將這份配置應用到集群當中:
 
>>> Creating cluster
Connecting to node 127.0.0.1:7000: OK
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7002: OK
Connecting to node 127.0.0.1:7003: OK
Connecting to node 127.0.0.1:7004: OK
Connecting to node 127.0.0.1:7005: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: 2774f156af482b4f76a5c0bda8ec561a8a1719c2 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 2d03b862083ee1b1785dba5db2987739cf3a80eb 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: 0456869a2c2359c3e06e065a09de86df2e3135ac 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: 37b251500385929d5c54a005809377681b95ca90 127.0.0.1:7003
   replicates 2774f156af482b4f76a5c0bda8ec561a8a1719c2
S: e2e2e692c40fc34f700762d1fe3a8df94816a062 127.0.0.1:7004
   replicates 2d03b862083ee1b1785dba5db2987739cf3a80eb
S: 9923235f8f2b2587407350b1d8b887a7a59de8db 127.0.0.1:7005
   replicates 0456869a2c2359c3e06e065a09de86df2e3135ac
Can I set the above configuration? (type 'yes' to accept):
 
輸入yes並按下回車確認之後,集群就會將配置應用到各個節點,並連接起(join)各個節點——也即是,讓各個節點開始互相通訊:
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join......
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 2774f156af482b4f76a5c0bda8ec561a8a1719c2 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 2d03b862083ee1b1785dba5db2987739cf3a80eb 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: 0456869a2c2359c3e06e065a09de86df2e3135ac 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
M: 37b251500385929d5c54a005809377681b95ca90 127.0.0.1:7003
   slots: (0 slots) master
   replicates 2774f156af482b4f76a5c0bda8ec561a8a1719c2
M: e2e2e692c40fc34f700762d1fe3a8df94816a062 127.0.0.1:7004
   slots: (0 slots) master
   replicates 2d03b862083ee1b1785dba5db2987739cf3a80eb
M: 9923235f8f2b2587407350b1d8b887a7a59de8db 127.0.0.1:7005
   slots: (0 slots) master
   replicates 0456869a2c2359c3e06e065a09de86df2e3135ac
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
 
一切正常输出以下信息:
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
 
測試Redis集群比較簡單的辦法就是使用redis-rb-cluster或者redis-cli,接下來我們將使用redis-cli為例來進行演示:
 
可以查詢相關指令透過以下命令:
[root@redis-server ~]# redis-trib help
Usage: redis-trib <command> <options> <arguments ...>

  set-timeout     host:port milliseconds
  add-node        new_host:new_port existing_host:existing_port
                  --master-id <arg>
                  --slave
  fix             host:port
  help            (show this help)
  del-node        host:port node_id
  import          host:port
                  --from <arg>
  check           host:port
  call            host:port command arg arg .. arg
  create          host1:port1 ... hostN:portN
                  --replicas <arg>
  reshard         host:port
                  --yes
                  --to <arg>
                  --from <arg>
                  --slots <arg>

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
[root@redis-server ~]#
 
可以看見有add-node,不用想了,肯定是添加節點。那麼del-node就是刪除節點。還有check肯定就是檢查狀態了。
[root@redis-server ~]#  redis-cli -p 7000 cluster nodes
2d03b862083ee1b1785dba5db2987739cf3a80eb 127.0.0.1:7001 master - 0 1428293673322 2 connected 5461-10922
37b251500385929d5c54a005809377681b95ca90 127.0.0.1:7003 slave 2774f156af482b4f76a5c0bda8ec561a8a1719c2 0 1428293672305 4 connected
e2e2e692c40fc34f700762d1fe3a8df94816a062 127.0.0.1:7004 slave 2d03b862083ee1b1785dba5db2987739cf3a80eb 0 1428293674340 5 connected
0456869a2c2359c3e06e065a09de86df2e3135ac 127.0.0.1:7002 master - 0 1428293670262 3 connected 10923-16383
2774f156af482b4f76a5c0bda8ec561a8a1719c2 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
9923235f8f2b2587407350b1d8b887a7a59de8db 127.0.0.1:7005 slave 0456869a2c2359c3e06e065a09de86df2e3135ac 0 1428293675362 6 connected
[root@redis-server ~]#
 
可以看到7000-7002是master,7003-7005是slave。
故障轉移測試:
 
可以看見7001是正常的,並且獲取到了key,value,現在kill掉7000實例,再進行查詢。
[root@redis-server ~]# ps -ef | grep 7000
root      4168     1  0 11:49 ?        00:00:03 redis-server *:7000 [cluster]
root      4385  4361  0 12:39 pts/3    00:00:00 grep 7000
[root@redis-server ~]# kill 4168
[root@redis-server ~]# ps -ef | grep 7000
root      4387  4361  0 12:39 pts/3    00:00:00 grep 7000
[root@redis-server ~]# redis-cli -c -p 7001
127.0.0.1:7001> get name
"yayun"
127.0.0.1:7001>
 
可以正常獲取到value,現在看看狀態。
[root@redis-server ~]# redis-cli -c -p 7001 cluster nodes
2d03b862083ee1b1785dba5db2987739cf3a80eb 127.0.0.1:7001 myself,master - 0 0 2 connected 5461-10922
0456869a2c2359c3e06e065a09de86df2e3135ac 127.0.0.1:7002 master - 0 1428295271619 3 connected 10923-16383
37b251500385929d5c54a005809377681b95ca90 127.0.0.1:7003 master - 0 1428295270603 7 connected 0-5460
e2e2e692c40fc34f700762d1fe3a8df94816a062 127.0.0.1:7004 slave 2d03b862083ee1b1785dba5db2987739cf3a80eb 0 1428295272642 5 connected
2774f156af482b4f76a5c0bda8ec561a8a1719c2 127.0.0.1:7000 master,fail - 1428295159553 1428295157205 1 disconnected
9923235f8f2b2587407350b1d8b887a7a59de8db 127.0.0.1:7005 slave 0456869a2c2359c3e06e065a09de86df2e3135ac 0 1428295269587 6 connected
[root@redis-server ~]#
 
原來的7000端口實例已經顯示fail,原來的7003是slave,現在自動提升為master。
關於更多的在線添加節點,刪除節點,以及對集群進行重新分片請參考官方文檔。

樹莓派 安裝 Redis

安裝前先更新樹莓派
sudo apt-get update
sudo apt-get upgrade
 
下載安裝包
cd /home/pi/Downloads
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
 
 
解壓縮
tar -zxf redis-4.0.1.tar.gz
 
編譯及安裝
cd /home/pi/Downloads/redis-4.0.1
sudo make
sudo make install
 
啟動(下述指令為前台啟動模式,帳號退出登陸則程式自動結束)
sudo redis-server /etc/redis.conf
 
正式使用需要改為後台模式,按以下方法
sudo cp /home/pi/Downloads/redis-4.0.1/redis.conf /etc/
sudo nano /etc/redis.conf
修改配置文件內容
daemonize yes

Redis默認用的是本地連接,不支持遠程連接,把#bind 127.0.0.1這一行注釋掉,是為了讓所有ip都可以用來訪問,當然可以用來遠程連接,但是對於redis3.2版本以上的還需要修改一個命令才能支持遠程調用。
bind 127.0.0.1 ::1
protected-mode no
bind x.x.x.x 真實IP
 
保存退出
再次重啟服務
sudo redis-server /etc/redis.conf
 
修改密碼,不需修改配置文件
redis-cli
config set requiress 密碼
 
 
檢查是否端口為 6379 進程
netstat -nlp
 
查詢 redis pid
ps -ef | grep redis
 
客戶端連接測試
redis-cli —> default 127.0.0.1
redis-cli -h x.x.x.x