1. 程式人生 > >NoSQL之redis(分散式叢集)

NoSQL之redis(分散式叢集)

1.叢集架構:

image

解釋:

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

Redis 叢集中內建了 16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,

redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,

這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點

image

 

誤區解釋:這裡的叢集和主從複製不同,這裡的叢集中所有的都是mater,都有單節點顧長官問題,而主從複製只是解決單點故障問題,

如果想讓叢集模式下午單點故障問題,需要給每一個master進行主從複製。

 

2.redis-cluster 投票容錯

image

  • 叢集中所有master參與投票,如果半數以上master節點與其中一個master節點通訊超過(cluster-node-timeout),認為該master節點掛掉。

叢集不可用狀態的判斷:

  • 如果叢集任意master掛掉,且當前master沒有slave,則叢集進入fail狀態。也可以理解成叢集的[0-16383]slot對映不完全時進入fail狀態。
  • 如果叢集超過半數以上master掛掉,無論是否有slave,叢集進入fail狀態。

 

3.redis叢集的搭建

    ①ruby的安裝

         由於叢集管理工具(redis-trib.rb)是使用ruby指令碼語言編寫的,所以需要ruby的環境

第一步:安裝ruby

[[email protected] bin2]# yum install ruby

[[email protected] bin2]# yum install rubygems

第二步:將redis-3.0.0.gem檔案上傳到linux系統

第三步:安裝ruby和redis介面

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

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

image

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

image

 

②搭建叢集:

這裡使用3臺伺服器模擬redis叢集。
第一步:複製出redis到一個機器中
[[email protected] redis]# scp  /xxx/redis-3.0.0 -r  hostname01:~/apps

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

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

第三步:設定叢集引數

開啟叢集模式:

image

 

第五步:複製redis服務到其他機器中

[[email protected] redis]# scp  /xxx/redis-3.0.0 -r  hostname02:~/apps
[[email protected] redis]# scp  /xxx/redis-3.0.0 -r  hostname03:~/apps

第七步:啟動三臺機器
[[email protected] redis]#redis-server redis.conf(三臺機器中都開啟)

第九步:建立叢集
[[email protected] redis-cluster]# ./redis-trib.rb create --replicas 1\
192.168.130.128:6379 \
192.168.130.129:6379 \
192.168.130.130:6379 \

>>> 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] 7001]# ./redis-cli -h 192.168.130.130-p 6379 –c #連線叢集

      相關命令介紹:

192.168.130.130:6379> cluster info  #檢視叢集資訊
192.168.130.130:6379> cluster nodes  #檢視叢集節點