1. 程式人生 > >Redis的集群(搭建)

Redis的集群(搭建)

所在 分配 nec last ef7 a20 過程 分享圖片 ren

分布式數據庫是把整個數據集按照分區規則映射到多個節點,每個節點負責一部分數據。


Redis Cluster采用虛擬槽分區(引入虛擬槽改進的一致性哈希算法),所有的鍵根據哈希函數映射到0~16383整數槽內,計算公式:slot=CRC16(key)&16383,找到槽,再找到槽所在的節點。槽是集群內數據管理和遷移的基本單位。



Redis Cluster搭建需要3個步驟


1. 準備節點

Redis Cluster節點數量至少6個才能保證組成完整高可用的集群,每個節點需開啟集群模式,配置如下:


# cluster

cluster-enabled yes

cluster-node-timeout 15000

cluster-config-file "nodes-${port}.conf"

cluster-slave-validity-factor 10

cluster-migration-barrier 1

cluster-require-full-coverage yes


啟動6個節點,集群模式的Redis除了原有的配置文件redis.conf,又加了一份集群配置文件nodes-${port}.conf,該文件記錄了集群內節點信息的變化,如添加/下線節點,故障轉移等,由Redis自動維護。


~/6879/data $ cat nodes-6879.conf

51a3c0a30f397cf28d9f36330cb21df1edda25af :0 myself,master - 0 0 0 connected

vars currentEpoch 0 lastVoteEpoch 0


127.0.0.1:6879> info cluster

# Cluster

cluster_enabled:1


127.0.0.1:6879> cluster info

cluster_state:fail

cluster_slots_assigned:0

cluster_slots_ok:0

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:1

cluster_size:0

cluster_current_epoch:0

cluster_my_epoch:0

cluster_stats_messages_sent:0

cluster_stats_messages_received:0


127.0.0.1:6879> cluster nodes

51a3c0a30f397cf28d9f36330cb21df1edda25af :6879 myself,master - 0 0 0 connected


目前每個節點只能識別出自己的信息,並不知道對方的存在,下面通過握手讓6個節點彼此建立聯系組成一個集群。


2. 節點握手

節點握手是指一批運行在集群模式下的節點通過Gossip協議彼此通信,達到感知對方的過程。在集群內任意節點上執行cluster meet命令加入新節點,握手狀態會通過消息在集群內傳播,這樣其它節點會自動發現新節點並發起握手流程。


127.0.0.1:6879> cluster meet 127.0.0.1 6880

127.0.0.1:6879> cluster meet 127.0.0.1 6881

127.0.0.1:6879> cluster meet 127.0.0.1 6882

127.0.0.1:6879> cluster meet 127.0.0.1 6883

127.0.0.1:6879> cluster meet 127.0.0.1 6884


127.0.0.1:6879> cluster nodes

51a3c0a30f397cf28d9f36330cb21df1edda25af 127.0.0.1:6879 myself,master - 0 0 1 connected

aa94bcbe1f7ebcf850e1d75cad712a0bbc044d97 127.0.0.1:6884 master - 0 1532681718583 5 connected

8c0e31b4cadc12c784eaa63a200fbb9b86e49a72 127.0.0.1:6880 master - 0 1532681713007 2 connected

ae5c6df67610f399491c174a6ee97345e03fd610 127.0.0.1:6882 master - 0 1532681716555 3 connected

b298f797f42b2fe1269f83e9fadd6cbb2af2fd04 127.0.0.1:6881 master - 0 1532681717567 4 connected

ff0092bfdd407ea73f036564e48b277898494ac1 127.0.0.1:6883 master - 0 1532681719596 0 connected


節點握手後還不能正常工作,這時集群處於下線狀態,是由於槽沒有分配到節點,集群無法完成槽到節點的映射。


127.0.0.1:6879> set hello redis

(error) CLUSTERDOWN Hash slot not served


3. 分配槽

Redis cluster把所有數據映射到16384個槽中,每個key會映射為一個固定的槽,只有當節點分配了槽,才能響應和這些槽關聯的鍵命令,下面通過cluster addslots命令為節點分配槽。


$ redis-cli -p 6879 cluster addslots {0..5641}

$ redis-cli -p 6880 cluster addslots {5642..10922}

$ redis-cli -p 6881 cluster addslots {10923..16383}


當前集群狀態是ok,進入在線狀態,所有槽都已經分配給節點,cluster nodes命令可看到槽和節點的對應關系。


127.0.0.1:6879> cluster info

cluster_state:ok

cluster_slots_assigned:16384

cluster_slots_ok:16384

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:6

cluster_size:3

cluster_current_epoch:5

cluster_my_epoch:1

cluster_stats_messages_sent:2864

cluster_stats_messages_received:2864


127.0.0.1:6879> cluster nodes

51a3c0a30f397cf28d9f36330cb21df1edda25af 127.0.0.1:6879 myself,master - 0 0 1 connected 0-5641

aa94bcbe1f7ebcf850e1d75cad712a0bbc044d97 127.0.0.1:6884 master - 0 1532683047361 5 connected

8c0e31b4cadc12c784eaa63a200fbb9b86e49a72 127.0.0.1:6880 master - 0 1532683048374 2 connected 5642-10922

ae5c6df67610f399491c174a6ee97345e03fd610 127.0.0.1:6882 master - 0 1532683046350 3 connected

b298f797f42b2fe1269f83e9fadd6cbb2af2fd04 127.0.0.1:6881 master - 0 1532683044329 4 connected 10923-16383

ff0092bfdd407ea73f036564e48b277898494ac1 127.0.0.1:6883 master - 0 1532683045341 0 connected


目前還有3個節點沒有使用,作為一個完整的集群,每個負責處理槽的節點應該具有從節點,保證出現故障時,可以進行自動故障轉移,使用cluster replicate命令讓一個節點成為從節點。


127.0.0.1:6882> cluster replicate 51a3c0a30f397cf28d9f36330cb21df1edda25af

127.0.0.1:6883> cluster replicate 8c0e31b4cadc12c784eaa63a200fbb9b86e49a72

127.0.0.1:6884> cluster replicate b298f797f42b2fe1269f83e9fadd6cbb2af2fd04


127.0.0.1:6884> cluster nodes

8c0e31b4cadc12c784eaa63a200fbb9b86e49a72 127.0.0.1:6880 master - 0 1532683770612 2 connected 5642-10922

ae5c6df67610f399491c174a6ee97345e03fd610 127.0.0.1:6882 slave 51a3c0a30f397cf28d9f36330cb21df1edda25af 0 1532683773646 3 connected

b298f797f42b2fe1269f83e9fadd6cbb2af2fd04 127.0.0.1:6881 master - 0 1532683772637 4 connected 10923-16383

ff0092bfdd407ea73f036564e48b277898494ac1 127.0.0.1:6883 slave 8c0e31b4cadc12c784eaa63a200fbb9b86e49a72 0 1532683774150 2 connected

51a3c0a30f397cf28d9f36330cb21df1edda25af 127.0.0.1:6879 master - 0 1532683769602 1 connected 0-5641

aa94bcbe1f7ebcf850e1d75cad712a0bbc044d97 127.0.0.1:6884 myself,slave b298f797f42b2fe1269f83e9fadd6cbb2af2fd04 0 0 5 connected


目前為止,手動建立了一個6個節點的集群,3個主節點負責處理槽和相關數據,3個從節點負責故障轉移。



手動搭建集群,步驟比較繁瑣,Redis官方提供了redis-trib.rb工具方便快速搭建,該工具采用Ruby實現,使用需先準備Ruby環境。


準備Ruby環境


# wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz


# tar zxf ruby-2.3.1.tar.gz

# ./configure --prefix=/usr/local/ruby

# make

# make install


# wget http://rubygems.org/downloads/redis-3.3.0.gem


# gem install --local redis-3.3.0.gem

Successfully installed redis-3.3.0

Parsing documentation for redis-3.3.0

Installing ri documentation for redis-3.3.0

Done installing documentation for redis after 0 seconds

1 gem installed


安裝Ruby環境後,執行redis-trib.rb命令確認環境是否正確。


$ redis-trib.rb

Usage: redis-trib <command> <options> <arguments ...>

...


創建集群


$ redis-trib.rb create --replicas 1 127.0.0.1:6879 127.0.0.1:6880 127.0.0.1:6881 127.0.0.1:6882 127.0.0.1:6883 127.0.0.1:6884

>>> Creating cluster

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

Using 3 masters:

127.0.0.1:6879

127.0.0.1:6880

127.0.0.1:6881

Adding replica 127.0.0.1:6882 to 127.0.0.1:6879

Adding replica 127.0.0.1:6883 to 127.0.0.1:6880

Adding replica 127.0.0.1:6884 to 127.0.0.1:6881

M: 93aec643effa795f33ab2b151c6a2b273eeb5462 127.0.0.1:6879

slots:0-5460 (5461 slots) master

M: 22b6e422aed074e42d295c061f0b4c102304b5bb 127.0.0.1:6880

slots:5461-10922 (5462 slots) master

M: 1835a6b9b3e0c0c08b09a6798c0359996be7ba7b 127.0.0.1:6881

slots:10923-16383 (5461 slots) master

S: 3ae8e6622d37e15701a757139a51c0006a6df664 127.0.0.1:6882

replicates 93aec643effa795f33ab2b151c6a2b273eeb5462

S: 324228642e6fc87a0c367a6b8e7a47e2879aa7d5 127.0.0.1:6883

replicates 22b6e422aed074e42d295c061f0b4c102304b5bb

S: 178525484b9e865522a0cfa2fef7f207413272d3 127.0.0.1:6884

replicates 1835a6b9b3e0c0c08b09a6798c0359996be7ba7b

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 127.0.0.1:6879)

M: 93aec643effa795f33ab2b151c6a2b273eeb5462 127.0.0.1:6879

slots:0-5460 (5461 slots) master

1 additional replica(s)

M: 22b6e422aed074e42d295c061f0b4c102304b5bb 127.0.0.1:6880

slots:5461-10922 (5462 slots) master

1 additional replica(s)

S: 3ae8e6622d37e15701a757139a51c0006a6df664 127.0.0.1:6882

slots: (0 slots) slave

replicates 93aec643effa795f33ab2b151c6a2b273eeb5462

M: 1835a6b9b3e0c0c08b09a6798c0359996be7ba7b 127.0.0.1:6881

slots:10923-16383 (5461 slots) master

1 additional replica(s)

S: 324228642e6fc87a0c367a6b8e7a47e2879aa7d5 127.0.0.1:6883

slots: (0 slots) slave

replicates 22b6e422aed074e42d295c061f0b4c102304b5bb

S: 178525484b9e865522a0cfa2fef7f207413272d3 127.0.0.1:6884

slots: (0 slots) slave

replicates 1835a6b9b3e0c0c08b09a6798c0359996be7ba7b

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.


查看集群信息


$ redis-trib.rb info 127.0.0.1:6879

127.0.0.1:6879 (93aec643...) -> 0 keys | 5461 slots | 1 slaves.

127.0.0.1:6880 (22b6e422...) -> 0 keys | 5462 slots | 1 slaves.

127.0.0.1:6881 (1835a6b9...) -> 0 keys | 5461 slots | 1 slaves.

[OK] 0 keys in 3 masters.

0.00 keys per slot on average.


檢查集群完整性


redis-trib.rb check 127.0.0.1:6879

>>> Performing Cluster Check (using node 127.0.0.1:6879)

M: 93aec643effa795f33ab2b151c6a2b273eeb5462 127.0.0.1:6879

slots:0-5460 (5461 slots) master

1 additional replica(s)

M: 22b6e422aed074e42d295c061f0b4c102304b5bb 127.0.0.1:6880

slots:5461-10922 (5462 slots) master

1 additional replica(s)

S: 3ae8e6622d37e15701a757139a51c0006a6df664 127.0.0.1:6882

slots: (0 slots) slave

replicates 93aec643effa795f33ab2b151c6a2b273eeb5462

M: 1835a6b9b3e0c0c08b09a6798c0359996be7ba7b 127.0.0.1:6881

slots:10923-16383 (5461 slots) master

1 additional replica(s)

S: 324228642e6fc87a0c367a6b8e7a47e2879aa7d5 127.0.0.1:6883

slots: (0 slots) slave

replicates 22b6e422aed074e42d295c061f0b4c102304b5bb

S: 178525484b9e865522a0cfa2fef7f207413272d3 127.0.0.1:6884

slots: (0 slots) slave

replicates 1835a6b9b3e0c0c08b09a6798c0359996be7ba7b

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.


若感興趣可關註訂閱號”數據庫最佳實踐”(DBBestPractice).

技術分享圖片

Redis的集群(搭建)