本文是redis學習系列的第四篇,前面我們學習了redis的數據結構和一些高級特性,點擊下麵鏈接可回看 《詳細講解redis數據結構(記憶體模型)以及常用命令》 《redis高級應用(主從、事務與鎖、持久化)》 本文我們繼續學習redis的高級特性——集群。本文主要內容包括集群搭建、集群分區原理和集群 ...
本文是redis學習系列的第四篇,前面我們學習了redis的數據結構和一些高級特性,點擊下麵鏈接可回看
本文我們繼續學習redis的高級特性——集群。本文主要內容包括集群搭建、集群分區原理和集群操作的學習。
Redis集群簡介
Redis 集群是3.0之後才引入的,在3.0之前,使用哨兵(sentinel)機制(本文將不做介紹,大家可另行查閱)來監控各個節點之間的狀態。Redis 集群可謂是讓很多人久等了。
Redis 集群是一組能進行數據共用的Redis 實例(服務或者節點)的設施,集群可以使用的功能是普通單機 Redis 所能使用的功能的一個子集;Redis 集群通常具有高可用、可擴展性、分散式、容錯等特性。瞭解redis的集群後,這些晦澀的概念可結合redis的主從、集群分區和集群運維等角度理解體會。
Redis集群搭建
創建集群文件夾
在/usr/local/下新建redis-cluster目錄併在redis-cluster下新建7031~7036共6個文件夾,這6個文件夾代表創建redis集群的6個節點。如下
[root@localhost local]# mkdir -p /usr/local/redis-cluster
[root@localhost redis-cluster]# mkdir 7031 7032 7033 7034 7035 7036
拷貝修改配置文件
將已有的/usr/local/redis/etc/下的redis.conf拷貝到新創建的7031目錄中
[root@localhost etc]# cp redis.conf /usr/local/redis-cluster/7031
[root@localhost 7031]# vi redis.conf
修改項如下:
(1)綁定埠,port 7031
(2)綁定IP,bind 192.168.2.128
(3)指定數據存放路徑,dir /usr/local/redis-cluster/7031
(4)啟動集群模式,cluster-enabled yes
(5)指定集群節點配置文件,cluster-config-file nodes-7031.conf
(6)後臺啟動,daemonize yes
(7)指定集群節點超時時間,cluster-node-timeout 5000
(8)指定持久化方式,appendonly yes
上面紅色項目最好全部設置,不然會出意想不到的錯誤,703x最好與節點文件夾保持一致。
將7031的redis.conf改完後再拷貝到剩下的5個目錄中,然後只要全局替換redis.conf中的7031為相應的節點即可。
安裝ruby
由於Redis 集群客戶端實現很少,redis集群的啟動需要用到ruby實現的redis-trib.rb,所以我們需要先安裝ruby。
[root@localhost redis-cluster]# yum install ruby
[root@localhost redis-cluster]# yum install rubygems
[root@localhost redis-cluster]# gem install redis
啟動redis實例
[root@localhost redis-cluster]#
/usr/local/redis/bin/redis-server /usr/local/redis-cluster/7031/redis.conf
分別啟動6個redis實例。也可以用腳本迴圈啟動,這樣更方便省時
[root@localhost redis-cluster]#
for((i=1;i<=6;i++)); do /usr/local/redis/bin/redis-server /usr/local/redis-cluster/703$i/redis.conf; done
查看redis實例是否啟動成功
[root@localhost redis-cluster]# netstat -tunpl | grep redis-server
#或者
[root@localhost redis-cluster]# ps -ef | grep redis-server
創建並啟動集群
進入redis安裝目錄的bin目錄下
[root@localhost ~]# cd /usr/local/redis/bin/
[root@localhost bin]#./redis-trib.rb create --replicas 1 192.168.2.128:7031 192.168.2.128:7032 192.168.2.128:7033 192.168.2.128:7034 192.168.2.128:7035 192.168.2.128:7036
命令的意義如下:
給定 redis-trib.rb 程式的命令是 create,表示創建一個新的集群。選項 --replicas 1 表示為集群中的每個主節點創建一個從節點。之後跟著的其他參數則是實例的地址列表, 指定使用這些地址所指示的實例來創建新集群。
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.2.128:7031
192.168.2.128:7032
192.168.2.128:7033
Adding replica 192.168.2.128:7034 to 192.168.2.128:7031
Adding replica 192.168.2.128:7035 to 192.168.2.128:7032
Adding replica 192.168.2.128:7036 to 192.168.2.128:7033
......
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
“All 16384 slots covered.”表示集群中的 16384 個槽都有至少一個主節點在處理, 集群運作正常。從列印出來的信息也可以看出,7031,7032,7033是主節點,其它三個是從節點。
客戶端連接集群
集群啟動成功後,我們就可以用任意一個客戶端連接集群了,如下
[root@localhost bin]# /usr/local/redis/bin/redis-cli -c -h 192.168.2.128 -p 7031
192.168.2.128:7031> info
# Server
redis_version:3.2.0
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:f8fcffd133fe3364
redis_mode:cluster
os:Linux 2.6.32-504.el6.x86_64 x86_64
arch_bits:64
可以使用 cluster info命令查看集群信息,cluster nodes命令查看集群節點信息。
集群關閉
關閉集群需要逐個關閉
[root@localhost redis-cluster]#
for((i=1;i<=6;i++)); do /usr/local/redis/bin/redis-cli -c -h 192.168.2.128 -p 703$i shutdown; done
如果重新啟動集群報以下錯誤
[ERR] Node 192.168.2.128:7031 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
需要清除殺掉redis實例,然後刪除每個節點下的臨時數據文件appendonly.aof,dump.rdb,nodes-703x.conf,然後再重新啟動redis實例即可啟動集群。
[root@localhost redis-cluster]#for((i=1;i<=6;i++)); do cd 703$i; rm -rf appendonly.aof; rm -rf dump.rdb; rm -rf nodes-703$i.conf; cd ..; done
集群測試
下麵我們先來體驗一下集群的set,get簡單操作,後面我們會進一步學習集群的更多操作。
192.168.2.128:7031> set name "zhangsan"
-> Redirected to slot [5798] located at 192.168.2.128:7032
OK
192.168.2.128:7032> set age 20
-> Redirected to slot [741] located at 192.168.2.128:7031
OK