1. 程式人生 > >Redis叢集,重要!重要!!重要!!!

Redis叢集,重要!重要!!重要!!!

redis-cluster架構圖

架構細節:

  1. 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬;
  2. 節點的fail是通過叢集中超過半數的節點檢查失效時才生效;
  3. 客戶端與redis節點直連,不需要中間proxy層,客戶端不需要連線叢集所有的節點,連線叢集中任何一個可用節點即可;
  4. redis-cluster把所有的物理節點對映到[0-16383]slot,cluster 負責維護

node<->slot<->value

redis-cluster投票:容錯

  1. 叢集中所有master參與投票,如果半數以上master節點與其中一個master節點通訊超過(cluster-node-timeout),認為該master節點掛掉.
  2. 什麼時候整個叢集不可用(cluster_state:fail)? 
  • 如果叢集任意master掛掉,且當前master沒有slave,則叢集進入fail狀態。也可以理解成叢集的[0-16383]slot對映不完全時進入fail狀態。
  • 如果叢集超過半數以上master掛掉,無論是否有slave,叢集進入fail狀態。

安裝ruby

  1. 叢集管理工具(redis-trib.rb)是使用ruby指令碼語言編寫的。

第一步:安裝ruby

[[email protected] bin2]# yum install ruby

[[email protected] bin2]# yum install rubygems

第二步:將以下檔案上傳到linux系統

第三步:安裝ruby和redis介面

[[email protected] ~]# gem install redis-3.0.0.gem

第四步:將redis-3.0.0包下src目錄中的以下檔案拷貝到redis19/redis-cluster/

[[email protected] src]# cd /usr/local/redis19/

[[email protected] redis19]# mkdir redis-cluster

[[email protected] redis19]# cd /root/redis-3.0.0/src/

[[email protected] src]# cp redis-trib.rb  /usr/local/redis19/redis-cluster

第五步:檢視是否拷貝成功

搭建叢集

  1. 搭建叢集最少也得需要3臺主機,如果每臺主機再配置一臺從機的話,則最少需要6臺機器。

埠設計如下:7001-7006

第一步:複製出一個7001機器

[[email protected] redis19]# cp bin ./redis-cluster/7001 –r

第二步:如果存在持久化檔案,則刪除

[[email protected] 7001]# rm -rf appendonly.aof dump.rdb

第三步:設定叢集引數

第四步:修改埠

第五步:複製出7002-7006機器

[[email protected] redis-cluster]# cp 7001/ 7002 -r

[[email protected] redis-cluster]# cp 7001/ 7003 -r

[[email protected] redis-cluster]# cp 7001/ 7004 -r

[[email protected] redis-cluster]# cp 7001/ 7005 -r

[[email protected] redis-cluster]# cp 7001/ 7006 –r

第六步:修改7002-7006機器的埠

第七步:啟動7001-7006這六臺機器

第八步:修改start-all.sh檔案的許可權

[[email protected] redis-cluster]# chmod u+x start-all.sh

[[email protected] redis-cluster]# ./start-all.sh

第九步:建立叢集

[[email protected] redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.242.137:7001 192.168.242.137:7002 192.168.242.137:7003 192.168.242.137:7004 192.168.242.137:7005  192.168.242.137:7006

>>> Creating cluster

Connecting to node 192.168.242.137:7001: OK

Connecting to node 192.168.242.137:7002: OK

Connecting to node 192.168.242.137:7003: OK

Connecting to node 192.168.242.137:7004: OK

Connecting to node 192.168.242.137:7005: OK

Connecting to node 192.168.242.137:7006: OK

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

192.168.242.137:7001

192.168.242.137:7002

192.168.242.137:7003

Adding replica 192.168.242.137:7004 to 192.168.242.137:7001

Adding replica 192.168.242.137:7005 to 192.168.242.137:7002

Adding replica 192.168.242.137:7006 to 192.168.242.137:7003

M: 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24 192.168.242.137:7001

   slots:0-5460 (5461 slots) master

M: 4f52a974f64343fd9f1ee0388490b3c0647a4db7 192.168.242.137:7002

   slots:5461-10922 (5462 slots) master

M: cb7c5def8f61df2016b38972396a8d1f349208c2 192.168.242.137:7003

   slots:10923-16383 (5461 slots) master

S: 66adf006fed43b3b5e499ce2ff1949a756504a16 192.168.242.137:7004

   replicates 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24

S: cbb0c9bc4b27dd85511a7ef2d01bec90e692793b 192.168.242.137:7005

   replicates 4f52a974f64343fd9f1ee0388490b3c0647a4db7

S: a908736eadd1cd06e86fdff8b2749a6f46b38c00 192.168.242.137:7006

   replicates cb7c5def8f61df2016b38972396a8d1f349208c2

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.242.137:7001)

M: 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24 192.168.242.137:7001

   slots:0-5460 (5461 slots) master

M: 4f52a974f64343fd9f1ee0388490b3c0647a4db7 192.168.242.137:7002

   slots:5461-10922 (5462 slots) master

M: cb7c5def8f61df2016b38972396a8d1f349208c2 192.168.242.137:7003

   slots:10923-16383 (5461 slots) master

M: 66adf006fed43b3b5e499ce2ff1949a756504a16 192.168.242.137:7004

   slots: (0 slots) master

   replicates 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24

M: cbb0c9bc4b27dd85511a7ef2d01bec90e692793b 192.168.242.137:7005

   slots: (0 slots) master

   replicates 4f52a974f64343fd9f1ee0388490b3c0647a4db7

M: a908736eadd1cd06e86fdff8b2749a6f46b38c00 192.168.242.137:7006

   slots: (0 slots) master

   replicates cb7c5def8f61df2016b38972396a8d1f349208c2

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

[[email protected] redis-cluster]#

連線叢集

[[email protected] 7001]# ./redis-cli -h 192.168.242.137 -p 7001 –c

-c:指定是叢集連線

  1. 檢視叢集資訊
  2. 檢視叢集資訊
  1. 192.168.242.137:7002> cluster info
  2. cluster_state:ok
  3. cluster_slots_assigned:16384
  4. cluster_slots_ok:16384
  5. cluster_slots_pfail:0
  6. cluster_slots_fail:0
  7. cluster_known_nodes:6
  8. cluster_size:3
  9. cluster_current_epoch:6
  10. cluster_my_epoch:2
  11. cluster_stats_messages_sent:2372
  12. cluster_stats_messages_received:2372
  13. 192.168.242.137:7002>

      3.檢視叢集節點

  1. 192.168.242.137:7002> cluster nodes
  2. 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24 192.168.242.137:7001 master - 0 1451581348093 1 connected 0-5460
  3. cb7c5def8f61df2016b38972396a8d1f349208c2 192.168.242.137:7003 master - 0 1451581344062 3 connected 10923-16383
  4. 66adf006fed43b3b5e499ce2ff1949a756504a16 192.168.242.137:7004 slave 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24 0 1451581351115 1 connected
  5. a908736eadd1cd06e86fdff8b2749a6f46b38c00 192.168.242.137:7006 slave cb7c5def8f61df2016b38972396a8d1f349208c2 0 1451581349101 3 connected
  6. 4f52a974f64343fd9f1ee0388490b3c0647a4db7 192.168.242.137:7002 myself,master - 0 0 2 connected 5461-10922
  7. cbb0c9bc4b27dd85511a7ef2d01bec90e692793b 192.168.242.137:7005 slave 4f52a974f64343fd9f1ee0388490b3c0647a4db7 0 1451581350108 5 connected