参考链接:
https://blog.csdn.net/truelove12358/article/details/79612954
https://blog.csdn.net/yejingtao703/article/details/78484151
一:基础理解:
redis集群通过hash solt来实现
1. 对象保存到Redis之前先经过CRC16哈希到一个指定的Node上,例如Object4最终Hash到了Node1上。
2.每个Node被平均分配了一个Slot段,对应着0-16384,Slot不能重复也不能缺失,否则会导致对象重复存储或无法存储。
3.Node之间也互相监听,一旦有Node退出或者加入,会按照Slot为单位做数据的迁移。例如Node1如果掉线了,0-5640这些Slot将会平均分摊到Node2和Node3上,由于Node2和Node3本身维护的Slot还会在自己身上不会被重新分配,所以迁移过程中不会影响到5641-16384Slot段的使用.
二:集群搭建
安装Buby环境
sudo apt-get install ruby
sudo gem install redis -v 3.2.1
安装redis
tar -zxvf redis-3.2.8.tar.gz
复制六份纯净的redis并安装,如下图所示
分别修改reids中的配置文件redis.conf
port 7001
daemonize yes
cluster-enabled yes
编写启动脚本start-all.sh
cd redis1/src
./redis-server ../redis.conf
cd ../../
cd redis2/src
./redis-server ../redis.conf
cd ../../
cd redis3/src
./redis-server ../redis.conf
cd ../../
cd redis4/src
./redis-server ../redis.conf
cd ../../
cd redis5/src
./redis-server ../redis.conf
cd ../../
cd redis6/src
./redis-server ../redis.conf
cd ../../
编写停止服务脚本stop-all.sh
./redis1/src/redis-cli -p 7001 shutdown
./redis2/src/redis-cli -p 7002 shutdown
./redis3/src/redis-cli -p 7003 shutdown
./redis4/src/redis-cli -p 7004 shutdown
./redis5/src/redis-cli -p 7005 shutdown
./redis6/src/redis-cli -p 7006 shutdown
redis-trib.rb脚本是从redis源码包src目录下复制过来的
执行创建集群命令(一个master主节点带一个slave从节点)
sudo ./redis-trib.rb create --replicas 1 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 127.0.0.1:7006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
M: 0311897922ea6ab36a201ebb327af226a00189b0 127.0.0.1:7001
slots:0-5460 (5461 slots) master
M: d1f2ab9638e288c4ff14a9448f5787fc11d474da 127.0.0.1:7002
slots:5461-10922 (5462 slots) master
M: 0000377745c63f73f55012fe75a498858c5cca6d 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
S: 38568d19773557e044999489b76bcee3158b9828 127.0.0.1:7004
replicates 0311897922ea6ab36a201ebb327af226a00189b0
S: ef454eaddc3022f6bdae06ac11cf362addf2b0c7 127.0.0.1:7005
replicates d1f2ab9638e288c4ff14a9448f5787fc11d474da
S: f22081ce3ae497f221f30cdf4a87e5212b047940 127.0.0.1:7006
replicates 0000377745c63f73f55012fe75a498858c5cca6d
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:7001)
M: 0311897922ea6ab36a201ebb327af226a00189b0 127.0.0.1:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: ef454eaddc3022f6bdae06ac11cf362addf2b0c7 127.0.0.1:7005
slots: (0 slots) slave
replicates d1f2ab9638e288c4ff14a9448f5787fc11d474da
M: d1f2ab9638e288c4ff14a9448f5787fc11d474da 127.0.0.1:7002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 38568d19773557e044999489b76bcee3158b9828 127.0.0.1:7004
slots: (0 slots) slave
replicates 0311897922ea6ab36a201ebb327af226a00189b0
S: f22081ce3ae497f221f30cdf4a87e5212b047940 127.0.0.1:7006
slots: (0 slots) slave
replicates 0000377745c63f73f55012fe75a498858c5cca6d
M: 0000377745c63f73f55012fe75a498858c5cca6d 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
创建成功,我们可以使用命令查看集群状态
zp@zp-VirtualBox:~/dowmload/redis-cluster$ ./redis1/src/redis-cli -c -h 127.0.0.1 -p 7001
127.0.0.1:7001> 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:6
cluster_my_epoch:1
cluster_stats_messages_sent:9416
cluster_stats_messages_received:9411
127.0.0.1:7001>
至此,基础搭建就已经完成了
我们可以使用php代码测试一下是否可行
编写test.php文件
<?php
$obj_cluster = new RedisCluster(NULL,[
'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',
'127.0.0.1:7006'
]);
$obj_cluster->set('a',"test",5);
echo $obj_cluster->get("a")."\n";
测试结果