1. 程式人生 > >Redis_cluster 集群

Redis_cluster 集群

redis集群

Redis cluster 集群

Redis-Cluster 在設計的時候,就考慮到了去中心化,去中間件,集群中的每個節點都是平等的關系,都是對等的,每個節點都保存各自的數據和整個集群的狀態。每個節點都和其他所有節點連接,而且這些連接保持活躍,這樣就保證了我們只需要連接集群中的任意一個節點,就可以獲取到其他節點的數據。

Redis 集群沒有並使用傳統的一致性哈希來分配數據,而是采用另外一種叫做哈希槽 (hash slot)的方式來分配的。redis cluster 默認分配了 16384 個slot,當我們set一個key 時,會用CRC16算法來取模得到所屬的slot,然後將這個key 分到哈希槽區間的節點上,具體算法就是:CRC16(key) % 16384。所以我們在測試的時候看到set 和 get 的時候,直接跳轉到了默認第一個配置啟動的節點。

Redis 集群會把數據存在一個 master 節點,然後在這個 master 和其對應的salve 之間進行數據同步。當讀取數據時,也根據一致性哈希算法到對應的 master 節點獲取數據。只有當一個master 掛掉之後,才會啟動一個對應的 salve 節點,充當 master 。

需要註意的是:Redis集群至少3+3,是還延續著Master-Slave的設計理念;

一、安裝依賴

yum -y install gcc gcc-c++ tcl ruby ruby-devel rubygems rpm-build

安裝完Redis再執行:gem install redis

二、redis配置實例

conf目錄:redis_cluster

data目錄: data

logs目錄:logs

端口實例;6001 6001 6002 6003 6004 6005 6006

# cat redis.conf

bind 10.10.101.100

protected-mode yes

port 6379

# 端口配置6379

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize yes

# redis後臺運行

cluster-enabled yes

# 開啟集群

cluster-config-file nodes_6379.conf

集群配置 首次啟動生成

cluster-node-timeout 5000

# 請求超時

appendonly yes

# aof 日誌開啟

supervised no

pidfile /var/run/redis_6379.pid

loglevel notice

logfile /opt/redis/logs/6379/redis.log

# 日誌目錄

databases 16

save 900 1

save 300 10

save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename dump.rdb

dir /opt/redis/data/6379

slave-serve-stale-data yes

slave-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

slave-priority 100

appendfilename "appendonly.6379.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-size -2

list-compress-depth 0

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

aof-rewrite-incremental-fsync yes

三、啟動

src/redis-server redis_cluster/6001/redis.conf

src/redis-server redis_cluster/6002/redis.conf

src/redis-server redis_cluster/6003/redis.conf

src/redis-server redis_cluster/6004/redis.conf

src/redis-server redis_cluster/6005/redis.conf

src/redis-server redis_cluster/6006/redis.conf

四、集群操作

通過使用 Redis 集群命令行工具 redis-trib , 編寫節點配置文件的工作可以非常容易地完成: redis-trib 位於 Redis 源碼的 src 文件夾中, 它是一個 Ruby 程序, 這個程序通過向實例發送特殊命令來完成創建新集群, 檢查集群, 或者對集群進行重新分片(reshared)等工作。

1、創建一個集群

redis-trib.rb create --replicas 1 10.10.101.100:6001 10.10.101.100:6002 10.10.101.100:6003 10.10.101.100:6004 10.10.101.100:6005 10.10.101.100:6006

// --replicas 1 表示 為集群中的每個主節點創建一個從節點。

技術分享

2、集群重新分片

./redis-trib.rb reshard 10.10.101.100:6003

// 需要指定移動哈希槽數 ( 1 - 16383 ) 和目標節點 ID

# src/redis-cli -h 10.10.101.100 -p 6003 cluster nodes | grep myself

[email protected]: /opt/redis# redis-cli -h 10.10.101.100 -p 6003 cluster nodes | grep myself

739f446f69739eb7f95331eec7c74a4e57d2eeac 10.10.101.100:6003 myself,master - 0 0 3 connected 10923-16383

技術分享

3、添加一個新節點

添加新的節點的基本過程就是添加一個空的節點然後移動一些數據給它,有兩種情況,添加一個主節點和添加一個從節點(添加從節點時需要將這個新的節點設置為集群中某個節點的復制).

兩種情況第一步都是要添加一個空的節點.

A、添加一個節點到現有的集群中去.

./redis-trib.rb add-node 10.10.101.100:6379 10.10.101.100:6003

// 使用addnode命令來添加節點,第一個參數是新節點的地址,第二個參數是任意一個已經存在的節點的IP和端口.

[email protected]: /opt/redis# src/redis-cli -c -h 10.10.101.100 -p 6379

10.10.101.100:6379> cluster nodes

0d9cb75cf92ce44dc3a4ad48bd95b48fc0d7a5ca 10.10.101.100:6379 myself,master - 0 0 0 connected

40d6721c15f32d732da89871b941788c3c57dcd3 10.10.101.100:6001 master - 0 1494413014845 1 connected 0-5460

041cb360dfcd8c1e8c77d8e7db03183da553953b 10.10.101.100:6004 slave 40d6721c15f32d732da89871b941788c3c57dcd3 0 1494413014344 1 connected

c9d5f58cd5e74f2c5ebbf6213e4314f4e92fb389 10.10.101.100:6006 slave 739f446f69739eb7f95331eec7c74a4e57d2eeac 0 1494413014644 3 connected

5a606eef48bc1fd8be9ad4d7a1d2a9420d8b2552 10.10.101.100:6002 master - 0 1494413015845 2 connected 5461-10922

f539cc2330a19f31a8dd55360e184cda2dc81151 10.10.101.100:6005 slave 5a606eef48bc1fd8be9ad4d7a1d2a9420d8b2552 0 1494413015345 2 connected

739f446f69739eb7f95331eec7c74a4e57d2eeac 10.10.101.100:6003 master - 0 1494413016345 3 connected 10923-16383

10.10.101.100:6379>

// 新節點沒有包含任何數據, 因為它沒有包含任何哈希槽.

技術分享

技術分享

盡管新節點沒有包含任何哈希槽, 但它仍然是一個主節點, 所以在集群需要將某個從節點升級為新的主節點時, 這個新節點不會被選中。只要將集群中的某些哈希桶移動到新節點裏面, 新節點就會成為真正的主節點了。

4、添加一個從節點

有兩種方法添加從節點,可以像添加主節點一樣使用redis-trib 命令,也可以像下面的例子一樣使用 –slave選項:

src/redis-trib.rb add-node --slave 10.10.101.100:6379 10.10.101.100:6001

// 此處並沒有指定添加的這個從節點的主節點,這種情況下系統會在其他的復制集中的主節點中隨機選取一個作為這個從節點的主節點。

a、指定主節點添加:

src/redis-trib.rb add-node --slave --master-id 739f446f69739eb7f95331eec7c74a4e57d2eeac 10.10.101.100:6379 10.10.101.100:6001

b、給主節點 10.10.101.100:6003添加一個從節點,該節點哈希槽的範圍10923-16383

節點 ID 739f446f69739eb7f95331eec7c74a4e57d2eeac,我們需要鏈接新的節點(已經是空的主節點)並執行命令:

redis 10.10.101.100:6379> cluster replicate 739f446f69739eb7f95331eec7c74a4e57d2eeac

c、驗證下集群節點

$ redis-cli -p 6379 cluster nodes | grep slave | grep 739f446f69739eb7f95331eec7c74a4e57d2eeac

f093c80dde814da99c5cf72a7dd01590792b783b 10.10.101.100:6379 slave 739f446f69739eb7f95331eec7c74a4e57d2eeac 0 1385543617702 3 connected

041cb360dfcd8c1e8c77d8e7db03183da553953b 10.10.101.100:6004 slave 40d6721c15f32d732da89871b941788c3c57dcd3 0 1494413014344 1 connected

// 節點 739f446f69739eb7f95331eec7c74a4e57d2eeac 有兩個從節點, 6004 (已經存在的) 和 6379 (新添加的).

5、移除一個節點

只要使用 del-node 命令即可:

src/redis-trib del-node 10.10.101.100:6001 `<node-id>`

// 第一個參數是任意一個節點的地址,第二個節點是你想要移除的節點地址。

使用同樣的方法移除主節點,不過在移除主節點前,需要確保這個主節點是空的. 如果不是空的,需要將這個節點的數據重新分片到其他主節點上.

替代移除主節點的方法是手動執行故障恢復,被移除的主節點會作為一個從節點存在,不過這種情況下不會減少集群節點的數量,也需要重新分片數據.

6、從節點的遷移

在Redis集群中會存在改變一個從節點的主節點的情況,需要執行如下命令 :

CLUSTER REPLICATE <master-node-id>

本文出自 “logs” 博客,請務必保留此出處http://51log.blog.51cto.com/6076767/1923980

Redis_cluster 集群