高性能:
一、在多分片節點中,將16384個槽位,均勻分佈到多個分片節點中
二、存數據時,將key作crc16(key),而後和16384進行取模,得出槽位值(0-16383之間)
三、根據計算得出的槽位值,找到相對應的分片節點的主節點,存儲到相應槽位上
四、若是客戶端當時鏈接的節點不是未來要存儲的分片節點,分片集羣會將客戶端鏈接切換至真正存儲節點進行數據存儲
高可用:
在搭建集羣時,會爲每個分片的主節點,對應一個從節點,實現slaveof的功能,同時當主節點down,實現相似於sentinel的自動failover的功能。
一、redis會有多組分片構成(3組)
二、redis cluster 使用固定個數的slot存儲數據(一共16384slot)
三、每組分片分得1/3 slot個數(0-5500 5501-11000 11001-16383)
四、基於CRC16(key) % 16384 ====》值 (槽位號)。
規劃、搭建過程:
6個redis實例,通常會放到3臺硬件服務器
注:在企業規劃中,一個分片的兩個分到不一樣的物理機,防止硬件主機宕機形成的整個分片數據丟失。node
端口號:7000-7005
一、安裝集羣插件redis
EPEL源安裝ruby支持
yum install ruby rubygems -y
使用國內源
gem sources -l
gem sources -a http://mirrors.aliyun.com/rubygems/
gem sources --remove https://rubygems.org/
gem sources -l
gem install redis -v 3.3.3
或者:
gem sources -a http://mirrors.aliyun.com/rubygems/ --remove https://rubygems.org/
二、集羣節點準備
vim
1 mkdir /data/700{0..7} 2 3 vim /data/7000/redis.conf 4 port 7000 5 daemonize yes 6 pidfile /data/7000/redis.pid 7 loglevel notice 8 logfile "/data/7000/redis.log" 9 dbfilename dump.rdb 10 dir /data/7000 11 protected-mode no 12 cluster-enabled yes 13 cluster-config-file nodes.conf 14 cluster-node-timeout 5000 15 appendonly yes 16 17 18 vim /data/7001/redis.conf 19 port 7001 20 daemonize yes 21 pidfile /data/7001/redis.pid 22 loglevel notice 23 logfile "/data/7001/redis.log" 24 dbfilename dump.rdb 25 dir /data/7001 26 protected-mode no 27 cluster-enabled yes 28 cluster-config-file nodes.conf 29 cluster-node-timeout 5000 30 appendonly yes 31 32 33 vim /data/7002/redis.conf 34 port 7002 35 daemonize yes 36 pidfile /data/7002/redis.pid 37 loglevel notice 38 logfile "/data/7002/redis.log" 39 dbfilename dump.rdb 40 dir /data/7002 41 protected-mode no 42 cluster-enabled yes 43 cluster-config-file nodes.conf 44 cluster-node-timeout 5000 45 appendonly yes 46 47 48 49 vim /data/7003/redis.conf 50 port 7003 51 daemonize yes 52 pidfile /data/7003/redis.pid 53 loglevel notice 54 logfile "/data/7003/redis.log" 55 dbfilename dump.rdb 56 dir /data/7003 57 protected-mode no 58 cluster-enabled yes 59 cluster-config-file nodes.conf 60 cluster-node-timeout 5000 61 appendonly yes 62 63 64 65 vim /data/7004/redis.conf 66 port 7004 67 daemonize yes 68 pidfile /data/7004/redis.pid 69 loglevel notice 70 logfile "/data/7004/redis.log" 71 dbfilename dump.rdb 72 dir /data/7004 73 protected-mode no 74 cluster-enabled yes 75 cluster-config-file nodes.conf 76 cluster-node-timeout 5000 77 appendonly yes 78 79 80 vim /data/7005/redis.conf 81 port 7005 82 daemonize yes 83 pidfile /data/7005/redis.pid 84 loglevel notice 85 logfile "/data/7005/redis.log" 86 dbfilename dump.rdb 87 dir /data/7005 88 protected-mode no 89 cluster-enabled yes 90 cluster-config-file nodes.conf 91 cluster-node-timeout 5000 92 appendonly yes 93 94 95 96 vim /data/7006/redis.conf 97 port 7006 98 daemonize yes 99 pidfile /data/7006/redis.pid 100 loglevel notice 101 logfile "/data/7006/redis.log" 102 dbfilename dump.rdb 103 dir /data/7006 104 protected-mode no 105 cluster-enabled yes 106 cluster-config-file nodes.conf 107 cluster-node-timeout 5000 108 appendonly yes 109 110 111 vim /data/7007/redis.conf 112 port 7007 113 daemonize yes 114 pidfile /data/7007/redis.pid 115 loglevel notice 116 logfile "/data/7007/redis.log" 117 dbfilename dump.rdb 118 dir /data/7007 119 protected-mode no 120 cluster-enabled yes 121 cluster-config-file nodes.conf 122 cluster-node-timeout 5000 123 appendonly yes
啓動節點:
ruby
1 redis-server /data/7000/redis.conf 2 redis-server /data/7001/redis.conf 3 redis-server /data/7002/redis.conf 4 redis-server /data/7003/redis.conf 5 redis-server /data/7004/redis.conf 6 redis-server /data/7005/redis.conf 7 redis-server /data/7006/redis.conf 8 redis-server /data/7007/redis.conf
1 [root@db01 ~]# ps -ef |grep redis 服務器
三、將節點加入集羣管理
app
1 redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
四、集羣狀態查看
集羣主節點狀態ide
redis-cli -p 7000 cluster nodes | grep master
集羣從節點狀態性能
1 redis-cli -p 7000 cluster nodes | grep slave spa
集羣節點管理
添加主節點:插件
redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
add-node 後面寫的地址爲須要添加的地址
最後的地址爲管理的地址
添加一個從節點
-----------------------------注意---------------------------
redis-trib.rb add-node --slave --master-id 691dbaf500ffe5a60213a5f8681637ea7868e9c5 127.0.0.1:7007 127.0.0.1:7000
--master-id 後面的是對應的主節點id值
後面跟的是從節點地址
最後的是管理節點地址
轉移slot(從新分片)
----------------------------重點-----------------------
每次添加都必須向新添加的節點增長slot,否則沒有性能的提高
redis-cli -p 7000 cluster nodes | grep master
添加節點後默認是沒有slot的
運行
redis-trib.rb reshard 127.0.0.1:7000
後面的數字填寫的是須要挪動的slot數 通常是16384除以主節點數得出的結果
我這裏節點數有4個 因此 16384/4 = 4096
這個id值爲須要接收的id 就是哪一個新添加須要接收slot的id值
這個是選擇從哪裏拿slot值, 選擇all就是再全部節點上拿一點 每一個節點平均分給須要收益的節點
選擇yes 表示開始配置!!!!!
將須要刪除節點的slot先移動走
redis-trib.rb reshard 127.0.0.1:7000
進入內容後
歸還第一個空間
由於節點一開始分配了4096的slot ,因此要把4096均勻的還給其他三個節點
第一個節點歸還
第一個值是歸還的大小
第二個值爲歸還的目標,我這裏第一個歸還目標爲7000節點
選擇肯定
第一個爲選擇從哪裏拿去slot值,由於要刪除7006, 因此也是從7006拿區值
第二個空位done 及結束,表示只在這裏拿
肯定
選擇yes
第二次歸還
發現7006空間少了,7000空間添加進去了
剩下的開始歸還
肯定到底,
第一個值位從7006要刪除的節點抽取的slot值
第二個位抽取的值接收的節點ID
第三個值爲抽取slot值的節點是哪一個
第四個爲結束
肯定------>後面的爲yes
第三次歸還
發現slot又少了, 受益者爲7001
肯定到底,
第一個值位從7006要刪除的節點抽取的slot值
第二個位抽取的值接收的節點ID
第三個值爲抽取slot值的節點是哪一個
第四個爲結束
肯定------>後面的爲yes
最後發現沒了
如今刪除他們一主一從 7006 7007
1 [root@db01 ~]# redis-trib.rb del-node 127.0.0.1:7006 d3d67f8fd1680caba870a8b5a167c365088f6840 2 >>> Removing node d3d67f8fd1680caba870a8b5a167c365088f6840 from cluster 127.0.0.1:7006 3 >>> Sending CLUSTER FORGET messages to the cluster... 4 >>> SHUTDOWN the node. 5 [root@db01 ~]# redis-trib.rb del-node 127.0.0.1:7007 64701ac2c0cf563cb6160c6948e97d2fdf602bfd 6 >>> Removing node 64701ac2c0cf563cb6160c6948e97d2fdf602bfd from cluster 127.0.0.1:7007 7 >>> Sending CLUSTER FORGET messages to the cluster... 8 >>> SHUTDOWN the node.
redis-trib.rb del-node 127.0.0.1:7006 d3d67f8fd1680caba870a8b5a167c365088f6840
redis-trib.rb del-node 127.0.0.1:7007 64701ac2c0cf563cb6160c6948e97d2fdf602bfd
後面的值爲地址和對應的id
要從新添加節點的話須要從新啓動節點信息而且刪除節點裏面的信息