redis集羣&主從部署

redis集羣&主從部署


1.安裝redis,並把src目錄中對應的可執行文件建立軟連接到/bin目錄下


2.新建目錄:
mkdir redis_slave_2004
3.修改配置:
將redis.conf文件拷貝一份到redis_slave_2004,修改文件內容爲:
daemonize yes
port 2004 #端口配置爲對應目錄的端口
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

4.啓動集羣
由於在上一篇中已經配置好了集羣,故先啓動集羣,參考上篇
啓動2004端口的redis
進入目錄redis_slave_2004,執行 redis-server redis.conf

5.加入集羣
實例加入到集羣,我們只需要執行 redis-trib.rb 命令:
第一個參數是我們剛纔啓動的新實例,第二個參數是集羣中已有的節點。
[root@localhost redis_slave_2003]# redis-trib.rb add-node 127.0.0.1:2004 127.0.0.1:2003
>>> Adding node 127.0.0.1:2004 to cluster 127.0.0.1:2003
Connecting to node 127.0.0.1:2003: OK
Connecting to node 127.0.0.1:2001: OK
Connecting to node 127.0.0.1:2002: OK
Connecting to node 127.0.0.1:6379: OK
>>> Performing Cluster Check (using node 127.0.0.1:2003)
M: da4c546799f99b7f5654a47d5b3de5f8ba048173 127.0.0.1:2003
  slots:12288-16383 (4096 slots) master
  0 additional replica(s)
M: e24883fc78bcd42913320946e30d9f2f7052897c 127.0.0.1:2001
  slots:4096-8191 (4096 slots) master
  0 additional replica(s)
M: 0fd7e8a748886c5eca030c71679bdd718ffc7a3f 127.0.0.1:2002
  slots:8192-12287 (4096 slots) master
  0 additional replica(s)
M: ce808a08a1a85a1108c3c683142b10a09bf2416a 127.0.0.1:6379
  slots:0-4095 (4096 slots) master
  0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Connecting to node 127.0.0.1:2004: OK
>>> Send CLUSTER MEET to node 127.0.0.1:2004 to make it join the cluster.
[OK] New node added correctly.
打印加入成功,測試一下:
[root@localhost redis_slave_2003]# redis-cli -c -p 2004
127.0.0.1:2004> get 001
-> Redirected to slot [9794] located at 127.0.0.1:2002
(nil)
127.0.0.1:2002> 
連接2004端口的redis,可以獲取到在2002端口的redis的001鍵值,表示2004端口已經加入redis集羣
設置也是可以的,但是由於使用一致性hash分佈鍵值,所以,測試時不一定重定向到2004,此處省略(試了五六個鍵都不是插入2004--/汗)

5.爲集羣中的主節點配置主從:
6379 2001 2003 2003 2004 任意一個節點加入主從配置,用於讀寫分離
此處選取2002,從上面的打印可以看出2002是有值的,方便後面測試

1.創建目錄,拷貝redis.conf文件,修改配置,然後啓動實例:[root@localhost redis_slave_2005]# redis-server redis.conf 
2.2002端口的redis主節點,2005端口redis配置爲其從節點:
實例加入到集羣,我們只需要執行 redis-trib.rb 命令:
第一個參數是我們5.1啓動的新實例,--slave參數表示配置第二個參數實例的從節點,第二個參數是集羣中已有的節點,併爲slave的主節點
[root@localhost redis_slave_2005]# redis-trib.rb add-node --slave 127.0.0.1:2005 127.0.0.1:2002
>>> Adding node 127.0.0.1:2005 to cluster 127.0.0.1:2002
Connecting to node 127.0.0.1:2002: OK
Connecting to node 127.0.0.1:2004: OK
Connecting to node 127.0.0.1:2001: OK
Connecting to node 127.0.0.1:6379: OK
Connecting to node 127.0.0.1:2003: OK
>>> Performing Cluster Check (using node 127.0.0.1:2002)
M: 0fd7e8a748886c5eca030c71679bdd718ffc7a3f 127.0.0.1:2002
  slots:8192-12287 (4096 slots) master
  0 additional replica(s)
M: 3c8a3d017ff66642a130738a4d7bb71f383707c8 127.0.0.1:2004
  slots: (0 slots) master
  0 additional replica(s)
M: e24883fc78bcd42913320946e30d9f2f7052897c 127.0.0.1:2001
  slots:4096-8191 (4096 slots) master
  0 additional replica(s)
M: ce808a08a1a85a1108c3c683142b10a09bf2416a 127.0.0.1:6379
  slots:0-4095 (4096 slots) master
  0 additional replica(s)
M: da4c546799f99b7f5654a47d5b3de5f8ba048173 127.0.0.1:2003
  slots:12288-16383 (4096 slots) master
  0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Automatically selected master 127.0.0.1:2002
Connecting to node 127.0.0.1:2005: OK
>>> Send CLUSTER MEET to node 127.0.0.1:2005 to make it join the cluster.
Waiting for the cluster to join.
>>> Configure node as replica of 127.0.0.1:2002.
[OK] New node added correctly.
打印如上表示成功
3.測試集羣主節點中的主從:

首先查看2002, 2003端口節點有些什麼鍵
2002:
[root@localhost redis_slave_2004]# redis-cli -c -p 2002
127.0.0.1:2002> keys *
1) "01053511"
2) "009"
3) "005"
4) "01053"
127.0.0.1:2002> 

2003:
127.0.0.1:2003> keys *
1) "5002304033"
2) "301053511"
3) "004"
4) "008"
5) "0101"
6) "0105"
7) "010535"
127.0.0.1:2003> 
可以看到2002中沒有008,有009的鍵,2003中有008,沒有009的鍵

查看2005的鍵:
[root@localhost redis_slave_2005]# redis-cli -c -p 2005
127.0.0.1:2005> keys *
1) "009"
2) "01053511"
3) "005"
4) "01053"
127.0.0.1:2005> 
發現跟2002的鍵是一樣的,但是我們並沒有對2005進行寫入的操作,說明已經從2002的主節點中同步過來了,主從模式已經生效
然後看一下里面的值是否正確:
redis-cli -c -p 2005, 連接2005節點(2002的從節點)
127.0.0.1:2005> get 009
-> Redirected to slot [10058] located at 127.0.0.1:2002
"008"
127.0.0.1:2002> 
可以獲取成功,但我們可能懷疑,是不是集羣重定向讓他獲取回來的,如果是的話,那麼我們獲取2003的鍵009,也應該是可以的得到值得
試一下:
[root@localhost redis_slave_2005]# redis-cli -c -p 2005
127.0.0.1:2005> get 008
-> Redirected to slot [14187] located at 127.0.0.1:2003
"008"
確實如此,我們一樣可以通過2005節點,獲取集羣中的其他的主節點的值,但是2005節點只會保存2002主節點的鍵值
說明2005節點redis以2002從節點的身份,加入到redis的集羣

整個集羣關係和節點信息如下:
[root@localhost redis_slave_2005]# redis-cli -c -p 6379
127.0.0.1:6379> cluster nodes
3c8a3d017ff66642a130738a4d7bb71f383707c8 127.0.0.1:2004 master - 0 1433056761140 0 connected
e24883fc78bcd42913320946e30d9f2f7052897c 127.0.0.1:2001 master - 0 1433056759629 2 connected 4096-8191
88072bd673ff98e424336e36c6c5c687b6b35dfb 127.0.0.1:2005 slave 0fd7e8a748886c5eca030c71679bdd718ffc7a3f 0 1433056759629 3 connected
da4c546799f99b7f5654a47d5b3de5f8ba048173 127.0.0.1:2003 master - 0 1433056759629 4 connected 12288-16383
ce808a08a1a85a1108c3c683142b10a09bf2416a 127.0.0.1:6379 myself,master - 0 0 1 connected 0-4095
0fd7e8a748886c5eca030c71679bdd718ffc7a3f 127.0.0.1:2002 master - 0 1433056760635 3 connected 8192-12287
127.0.0.1:6379> 

ps:這裏發現一個問題是:通過2005(從)節點,可以修改2002(主)節點的鍵的值,此時的從節點只讀屬性,因爲集羣的關係,已經不存在了
個人認爲這是一個潛在的bug,或許這樣設計可能成爲需求也不一定,希望有高手解答
[root@localhost redis_slave_2005]# redis-cli -c -p 2005
127.0.0.1:2005> set 2001 2002
-> Redirected to slot [10179] located at 127.0.0.1:2002
OK
127.0.0.1:2002> get 2002
-> Redirected to slot [6048] located at 127.0.0.1:2001
"20022"
127.0.0.1:2001> 

6.刪除節點
1:如果刪除的節點是主節點,如刪除127.0.0.1:2001節點
首先要把節點中的哈希槽轉移到其他節點中,執行下面的命令
redis-trib.rb reshard 127.0.0.1:2001

Connecting to node 127.0.0.1:2001: OK
Connecting to node 127.0.0.1:2002: OK
Connecting to node 127.0.0.1:2004: OK
Connecting to node 127.0.0.1:2005: OK
Connecting to node 127.0.0.1:6379: OK
Connecting to node 127.0.0.1:2003: OK
>>> Performing Cluster Check (using node 127.0.0.1:2001)
M: e24883fc78bcd42913320946e30d9f2f7052897c 127.0.0.1:2001
  slots: (0 slots) master
  0 additional replica(s)
M: 0fd7e8a748886c5eca030c71679bdd718ffc7a3f 127.0.0.1:2002
  slots: (0 slots) master
  1 additional replica(s)
M: 3c8a3d017ff66642a130738a4d7bb71f383707c8 127.0.0.1:2004
  slots: (0 slots) master
  0 additional replica(s)
S: 88072bd673ff98e424336e36c6c5c687b6b35dfb 127.0.0.1:2005
  slots: (0 slots) slave
  replicates 0fd7e8a748886c5eca030c71679bdd718ffc7a3f
M: ce808a08a1a85a1108c3c683142b10a09bf2416a 127.0.0.1:6379
  slots: (0 slots) master
  0 additional replica(s)
M: da4c546799f99b7f5654a47d5b3de5f8ba048173 127.0.0.1:2003
  slots:0-16383 (16384 slots) master
  0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 16384  回車
What is the receiving node ID? da4c546799f99b7f5654a47d5b3de5f8ba048173 回車
系統會提示要移動多少哈希槽,這裏移動16384個,因爲127.0.0.1:2001節點有16384個哈希槽
接着系統提示輸入要接收這些哈希槽的節點的ID,這裏使用127.0.0.1:2003的節點ID  da4c546799f99b7f5654a47d5b3de5f8ba048173
然後要我們選擇從那些節點中轉出哈希槽,輸入127.0.0.1:2001這個節點的ID e24883fc78bcd42913320946e30d9f2f7052897c,最後輸入 done  表示輸入完畢
然後把這個節點刪除:
第一個參數爲節點的ip端口,第二個參數爲節點的ID
redis-trib.rb del-node 127.0.0.1:2001 e24883fc78bcd42913320946e30d9f2f7052897c
2:如果節點是從節點的,直接使用下面的命令刪除即可,無需移動哈希槽
redis-trib.rb del-node 127.0.0.1:2001 e24883fc78bcd42913320946e30d9f2f7052897c

ps:文章爲本人一步一步親測,可能存在錯誤,歡迎指正,轉載請註明出處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章