构建redis cluster。而后测试,操做redis cluster。redis集群中的data会自动被分片在跨多个reids nodeds.
参考官当点击这里java
wget http://download.redis.io/releases/redis-5.0.5.tar.gznode
tar xf redis-5.0.5.tar.gzpython
cd redis-5.0.5redis
make缓存
make install PREFIX=/server/redis # PREFIX指定将编译好的redis相关二进制文件安装到指定目录。ruby
二进制文件将在PREFIX/bin目录下并发
1. 从新建立一个redis_cluster目录,用于部署每个redis节点实例 2. 在redis_cluster目录下建立redis节点实例目录,已官网例子,6个节点实例,3主3从。 3. cd redis_cluster && mkdir 700{0,1,2,3,4,5} # 在集群目录中建立6个实例目录。 4. 而后在7000-7005 每一个目录下建立一个redis.conf文件,做为每一个节点的配置文件。 5. 集群节点最小配置项以下,添加到每一个redis.conf文件中,可是要修改port为对应的目录号。 ------redis.conf配置文件内容以下--------- port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes ------分割线---------------------------- 6. 拷贝刚才安装的二进制路径bin下的redis-server到每一个7000-7005目录下 7. 而后每一个目录下执行 ./redis-server ./reids.conf 启动每一个redis cluster 节点实例 8. 若是是redis 5 版本及以上。就直接能够利用redis-cli程序来构建new cluster,并检测和从新分片咱们的redis集群数据。若是是5如下的版本参考[点击这里](https://redis.io/topics/cluster-tutorial)或者google, 咱们都是用5版原本作。 9. 经过redis-cli命令来执行: redis-cli --cluster create 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 --cluster-replicas 1 10. 集群的构建配置过程是一个自动化配置的过程,可是最后会询问是否配置,而后键入yes就能够了。 11. 固然在redis的源码目录的utils下有一个目录叫create-cluster 里面就包含了方便建立集群的工具,参考其中的README文件 12. 至此,redis cluster的简单搭建就完成了。
下面是执行redis-cli命令的输出app
>>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 127.0.0.1:7004 to 127.0.0.1:7000 Adding replica 127.0.0.1:7005 to 127.0.0.1:7001 Adding replica 127.0.0.1:7003 to 127.0.0.1:7002 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: cb891554949583a7a54edf59e33bec838a230274 127.0.0.1:7000 slots:[0-5460] (5461 slots) master M: cffc46853e7b8187172ccbfe2694065084eda1e7 127.0.0.1:7001 slots:[5461-10922] (5462 slots) master M: 8756a8eb3b7803aa917be509d54a1294fbbf6be1 127.0.0.1:7002 slots:[10923-16383] (5461 slots) master S: 558a8e71c5d7a41813539653ab3c8bd2ed98e8dc 127.0.0.1:7003 replicates 8756a8eb3b7803aa917be509d54a1294fbbf6be1 S: d30fa58dd88767dbc7b393f1cf8f51765562c30d 127.0.0.1:7004 replicates cb891554949583a7a54edf59e33bec838a230274 S: bcf8db2410a78b3aff9b071035e168bcfbd28e28 127.0.0.1:7005 replicates cffc46853e7b8187172ccbfe2694065084eda1e7 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:7000) M: cb891554949583a7a54edf59e33bec838a230274 127.0.0.1:7000 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: cffc46853e7b8187172ccbfe2694065084eda1e7 127.0.0.1:7001 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 558a8e71c5d7a41813539653ab3c8bd2ed98e8dc 127.0.0.1:7003 slots: (0 slots) slave replicates 8756a8eb3b7803aa917be509d54a1294fbbf6be1 S: bcf8db2410a78b3aff9b071035e168bcfbd28e28 127.0.0.1:7005 slots: (0 slots) slave replicates cffc46853e7b8187172ccbfe2694065084eda1e7 S: d30fa58dd88767dbc7b393f1cf8f51765562c30d 127.0.0.1:7004 slots: (0 slots) slave replicates cb891554949583a7a54edf59e33bec838a230274 M: 8756a8eb3b7803aa917be509d54a1294fbbf6be1 127.0.0.1:7002 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.
不管python,java, ruby仍是go,node.js,都有额外客户端库访问redis cluster。这里就使用redis-cli来访问,特别处就是加上-c参数,就能够了。工具
1. redis-cli -c -p 7000 # 就能够经过7000的访问redis cluster集群了 不过redis-cli 是一个比较简单的客户端。比较好的客户端应该是缓存了hash slots与对应节点的地址,直接访问对应的node,而不用经过redirect
redis-cli --cluster add-node 127.0.0.1:your_new_port 127.0.0.1:7000
增长一个复制节点有两种方式:测试
redis-cli --cluster add-node 127.0.0.1:your_new_slave_port 127.0.0.1:7000 --cluster-slave
注意, 咱们这里没有指定做为slave的master。这种状况,redis-cli将会添加这个新的slave到一个随机的master ,这个master缺乏slave.
若是指定master,执行下面:
redis-cli --cluster add-node 127.0.0.1:your_new_slave_port 127.0.0.1:7000 --cluster-slave --cluster-master-id the_id_of_master
其实就是讲新节点经过添加为master的方式,而后命令行登陆该节点,而后执行CLUSTER REPLICATE命令来指定变为slave.
执行命令以下:
>cluster replicate the_id_of_master
这条命令也能够将一个slave成为另外一个master的slave.
删除一个slave节点:
redis-cli --cluster del-node 127.0.0.1:7000 node-id
对于master节点的删除,master节点必须是空的,若是不是空,那么须要从新分片数据,将其数据从新分片到其它的master中。而后再删除已经变为空的master节点。
还有一种方案是,经过执行一个手动的failover操做,让它的slave变为master,再删除已经变为slave的节点。
若是每个master都有slave,那么咱们还能够在实例几个灾备slave节点,用于当一个master挡掉,只有一个slave时,这个slave变为master,而灾备的slave就会变为新master的slave,从而避免单master故障。
节点变为灾备节点经过:migration
很简单,只须要重启升级便可,没有其它影响。
若是从单个master,或者其它状况要将数据迁移到redis cluster,那么就可能存在一些事务问题或者说是多key同时操做问题。
因为第一种状况没法解决,因此咱们聚焦在2,3状况。
这里有另外一个方式去import data 从已存在的instances到redis cluster, 就是使用 redis-cli --cluster import 命令。
命令删除全部的keys 在运行中的instanc 到指定 已存在的 redis cluster. 然而,注意 若是你使用redis 2.8 实例做为这个source instance 操做可能慢,由于2.8 没有实现migrate 链接缓存,因此你可能想重启你的source instance使用reids 3.x before to perform such operation。