06. redis cluster

Redis Cluster

构建redis cluster。而后测试,操做redis cluster。redis集群中的data会自动被分片在跨多个reids nodeds.
参考官当点击这里java

redis cluster 特色

  1. 自动分片dataset数据集到rediscluster的节点2中。自动哦!
  2. redis cluster提供持续使用操做数据功能,当出现集群中一些节点失败或者不能communicte和其它正常节点时。

搭建redis cluster

  • 下载

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目录下并发

  • 构建redis cluster集群
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.

访问redis cluster

不管python,java, ruby仍是go,node.js,都有额外客户端库访问redis cluster。这里就使用redis-cli来访问,特别处就是加上-c参数,就能够了。工具

redis-cli 访问redis cluster

1. redis-cli -c -p 7000  # 就能够经过7000的访问redis cluster集群了
不过redis-cli 是一个比较简单的客户端。比较好的客户端应该是缓存了hash slots与对应节点的地址,直接访问对应的node,而不用经过redirect

从新分片数据

新加master节点

  1. 首先节点得配置为cluster 模式,而后启动运行,端口不能与已存在的redis cluster 节点冲突。
  2. 而后执行如下命令:
    redis-cli --cluster add-node 127.0.0.1:your_new_port 127.0.0.1:7000
    这时候新节点就会处于myself,master 状态。
  3. 新节点目前的状态算是加入到了redis cluster,可是和其它节点不同:首先,它是没有hash slots,即没有数据的;再,它是不会参加选举当一个slave想变为master时。
  4. 注意,固然能够经过从新分片,来给新节点分配hash slots。

新加一个复制slave节点

增长一个复制节点有两种方式:测试

方式一

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

升级或者须要重启节点

对于slave

很简单,只须要重启升级便可,没有其它影响。

对于master

  1. 使用 CLUSTER FAILOVER 去让master变为slave
  2. 等待master变为slave
  3. 而后就能够升级已经变成slave的节点
  4. 若是须要升级后再变为master,再触发一次cluster failover来转换

迁移到redis cluster

若是从单个master,或者其它状况要将数据迁移到redis cluster,那么就可能存在一些事务问题或者说是多key同时操做问题。

  1. 对于事务,多key操做,lua脚本,key都在用切不在同一个hash tag。这种状况redis cluster是没法解决的。
  2. 对于上述操做,若是是在同一个hash tag,这种redis cluster能够解决。
  3. 对于上述操做,若是多key其它并发链接没有被使用,这种redis cluster能够解决。

因为第一种状况没法解决,因此咱们聚焦在2,3状况。

  1. 中止你的clients, 非自动实时迁移到redis cluster是可能的。你可能须要去编排一个实时的迁移在你的应用上下文幻境中。
  2. 生成一个 append only file 用于你的全部N master,利用 BGREWRITEAOF 命令, 而后等待AOF生成完成。
  3. 保存你的AOF 文件 从aof-1 到 aof-N , 到如今,你能够中止你的老的节点实例。
  4. 建立一个redis cluster 组成是 N master 0 slave,slave将后面来添加。肯定你全部的节点使用aof开启。
  5. 中止全部的cluster节点,替换掉他们的AOF使用前面存在的AOF文件,aof-1 用于第一个节点,aof-2用于第二个节点, 知道aof-N。
  6. 重启全部的cluster节点使用新的aof文件。他们将完成 这些的keys不该该在这里 根据他们的配置。
  7. 使用 redis-cli --cluster fix 命令用于修复cluster,以致于全部的keys 将被迁移根据 the hash slots each node is authoritative or not
  8. 使用 redis-cli --cluster check 在最后,肯定你的cluster 是ok的。
  9. 重启你全部的clistes 被改成使用redis cluster aware client library.

这里有另外一个方式去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。

相关文章
相关标签/搜索