1. 程式人生 > >redis叢集策略-叢集

redis叢集策略-叢集

本次搭建需要六臺redis伺服器,我通過在一臺虛擬機器上模擬6臺機器。

一,準備工作

1. 在/usr/local目錄下新建一個redis-cluster資料夾,並在redis-cluster資料夾下新建6個子資料夾,7001,7002,7003,7004,7005,7006。

2.

cd /usr/local/redis-4.0.0/
cp redis.conf /usr/local/redis-cluster/7001
cp redis.conf /usr/local/redis-cluster/7002
cp redis.conf /usr/local/redis-cluster/7003
cp redis.conf /usr/local/redis-cluster/7004
cp redis.conf /usr/local/redis-cluster/7005
cp redis.conf /usr/local/redis-cluster/7006

 

進入redis目錄將redis.conf檔案複製到7001,7002,7003,7004,7005,7006,各一份。

二,配置檔案(7001,7002,7003,7004,7005,7006每個資料夾都需要做以下配置)

vim redis.conf

做一下修改這裡以7001為例,其他幾個步驟一樣

1. daemonize yes      將redis設定為後臺啟動 

2. port 7001               設定埠(因為在一臺機器上模擬必須為不同的埠,如果在6臺機器不需要配置)

3. bind 127.0.0.1  ---》bind 192.168.159.140        (綁定當前機器的ip地址,比如當前埠為192.168.159.140)

4. dir /usr/local/redis-sluster/7001               指定資料檔案的存放位置,必須指定不同的存放位置,不然會丟失資料

5. cluster-enable yes         開啟叢集模式

6. cluster-config-file nodes7001.conf    

7.cluster-node-timeout  5000      5000也可以是別的值

8.appendonly yes                 開啟aof持久化  也可以不開啟  預設使用rdb

三,由於redis叢集用到ruby命令,所以需要安裝ruby

1.yum install ruby

2.yum install rubygem

3.gem install redis (安裝redis和ruby的介面)

以上(7001,7002,7003,7004,7005,7006)每個資料夾下的redis.conf都需要配置。

四,啟動6個redis例項

/usr/local/redis-4.0.0/src/redis-server /usr/local/redis-cluster/7001/redis.conf
/usr/local/redis-4.0.0/src/redis-server /usr/local/redis-cluster/7002/redis.conf
/usr/local/redis-4.0.0/src/redis-server /usr/local/redis-cluster/7003/redis.conf
/usr/local/redis-4.0.0/src/redis-server /usr/local/redis-cluster/7004/redis.conf
/usr/local/redis-4.0.0/src/redis-server /usr/local/redis-cluster/7005/redis.conf
/usr/local/redis-4.0.0/src/redis-server /usr/local/redis-cluster/7006/redis.conf

檢視狀態

ps -ef | grep redis

出現

root      13809      1  0 12:12 ?        00:00:00 usr/local/redis-4.0.0/src/redis-server 192.168.159.140:7001 [cluster]          
root      13820      1  0 12:12 ?        00:00:00 usr/local/redis-4.0.0/src/redis-server 192.168.159.140:7002 [cluster]          
root      13825      1  0 12:12 ?        00:00:00 usr/local/redis-4.0.0/src/redis-server 192.168.159.140:7003 [cluster]          
root      13830      1  0 12:12 ?        00:00:00 usr/local/redis-4.0.0/src/redis-server 192.168.159.140:7004 [cluster]          
root      13835      1  0 12:12 ?        00:00:00 usr/local/redis-4.0.0/src/redis-server 192.168.159.140:7005 [cluster]          
root      13840      1  0 12:12 ?        00:00:00 usr/local/redis-4.0.0/src/redis-server 192.168.159.140:7006 [cluster]          
root      13868  10883  0 12:14 pts/0    00:00:00 grep redis

啟動成功。

五, 進入redis/src下

cd /usr/local/redis-4.0.0/src

執行

./redis-trib.rb create --replicas 1 192.168.159.140:7001 192.168.159.140:7002 192.168.159.140:7003 192.168.159.140:7004 192.168.159.140:7005 192.168.159.140:7006

1    表示  master:slave=1 ,意味著主從關係是一一對應的7001-7003,7002-7005,7003-7006,設立這種主從關係主要是為了資料的備份,防止伺服器壞掉資料丟失。

會出現 

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.159.140:7001
192.168.159.140:7002
192.168.159.140:7003
Adding replica 192.168.159.140:7004 to 192.168.159.140:7001
Adding replica 192.168.159.140:7005 to 192.168.159.140:7002
Adding replica 192.168.159.140:7006 to 192.168.159.140:7003
M: daf29b7d0f4177c7572f8c9d189eddae3f0c2a42 192.168.159.140:7001
   slots:0-5460 (5461 slots) master
M: a52bc186d7415803ed3afb0f8437f787895a7b41 192.168.159.140:7002
   slots:5461-10922 (5462 slots) master
M: 4b698e721c6e41a21caa1a76ed594252e1be8745 192.168.159.140:7003
   slots:10923-16383 (5461 slots) master
S: 9840ed409fc40f12c03c559aaaeffa7e67780d8f 192.168.159.140:7004
   replicates daf29b7d0f4177c7572f8c9d189eddae3f0c2a42
S: f73a885380ee584e99a1be81c5b0a7f3dfc6c074 192.168.159.140:7005
   replicates a52bc186d7415803ed3afb0f8437f787895a7b41
S: a9d5642c4abe6b85511148e8226a7e7017a56dca 192.168.159.140:7006
   replicates 4b698e721c6e41a21caa1a76ed594252e1be8745
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 192.168.159.140:7001)
M: daf29b7d0f4177c7572f8c9d189eddae3f0c2a42 192.168.159.140:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 9840ed409fc40f12c03c559aaaeffa7e67780d8f 192.168.159.140:7004
   slots: (0 slots) slave
   replicates daf29b7d0f4177c7572f8c9d189eddae3f0c2a42
M: 4b698e721c6e41a21caa1a76ed594252e1be8745 192.168.159.140:7003
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: f73a885380ee584e99a1be81c5b0a7f3dfc6c074 192.168.159.140:7005
   slots: (0 slots) slave
   replicates a52bc186d7415803ed3afb0f8437f787895a7b41
S: a9d5642c4abe6b85511148e8226a7e7017a56dca 192.168.159.140:7006
   slots: (0 slots) slave
   replicates 4b698e721c6e41a21caa1a76ed594252e1be8745
M: a52bc186d7415803ed3afb0f8437f787895a7b41 192.168.159.140:7002
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

此時叢集已經搭建成功。可以看到redis是分槽儲存一共16387個槽,現在顯示7001:0-5460,7002:5461-10922,7003:10923-16387。從這我們也可以看到主從的身影。

我們來測試是怎麼分的

 

/usr/local/redis-4.0.0/src/redis-cli -c -h 192.168.159.140 -p 7001

-c 表示叢集 -h ip地址  -p 埠號

192.168.159.140:7001> set name cluster
-> Redirected to slot [5798] located at 192.168.159.140:7002
OK

Redirected to slot [5798] located at 192.168.159.140:7002 就是說資料被儲存到了第6798個槽裡 ,這個槽在7002上。

我們來測試7001有沒有資料。

192.168.159.140:7001> keys *
(empty list or set)

空的,測試7002和7005 

192.168.159.140:7002> keys *
1) "name"
192.168.159.140:7005> keys *
1) "name"

7002和7005都有資料。

取資料在7001測試:

192.168.159.140:7001> get name
-> Redirected to slot [5798] located at 192.168.159.140:7002
"cluster"

雖然7001沒有資料但因為叢集了,會定位到7002然後取出資料。

其實是這樣儲存資料的,當拿到key時,利用hash演算法target = hash(key)\%N,這裡N=16387 為槽的數量,根據每個主伺服器的所擁有槽的範圍和target,就得到了在哪臺伺服器的哪個槽上,進而將資料儲存進去。