redis集群搭建

96
亭子青年
2018.01.31 09:07 字数 1501

写在前面的话

路漫漫其修远兮

redis 集群介绍

分布式
去中心话,集群中的所有节点之间相互连接并通信
复制
重用了单机redis的复制特性,可以扩展读能力等
节点故障检测和自动故障转移
集群的主节点内置了该功能,当集群中有主节点下限时,集群中的其它在线的主节点会注意到,并且对已经下限的主节点进行故障转移,故障检测和转移是由其他的主节点负责的,所以集群不必另外使用redis sentinel
分片
集群使用分片来扩展数据库的容量,并将命令请求的负载交给不同的节点来分担。集群将整个数据库分为 16384 个槽(slot),所有键都属于这 16384 个槽的其中一个,计算键 key属于哪个槽的公式为 slot_number = crc16(key) % 16384 ,其中 crc16 为 16 位的循环冗余校验和函数。
集群中的每个主节点都可以处理 0 个至 16384 个槽,当 16384 个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。
比如说,如果我们有三个主节点 7000 、 7001 和 7002 ,那么我们可以:
(1)将槽 0 至 5460 指派给节点 7000 负责处理;
(2)将槽 5461 至 10922 指派给节点 7001 负责处理;
(3) 将槽 10923 至 16383 指派给节点 7002 负责处理;
这样就可以将 16384 个槽平均地指派给三个节点负责处理。
转向
对于一个被指派了槽的主 节点来说,这个主节点只会处理属于指派给自己的槽的命令请求。
如果一个节点接收到了和自己处理的槽无关的命令请求,那么节点会向客户端返回一个转向错误(redirection error),告诉客户端,哪个节点才是负责处理这条命令的,之后客户端需要根据错误中包含的地址和端口号重新向正确的 节点发送命令请求(支持集群的客户端自动处理)。

集群搭建

ruby环境:是因为我们需要使用ruby gems 中的redis-trib.rb 来创建和操作集群

1. ruby环境安装:检测按照是否成功:ruby -v

2. 安装ruby gems:包管理工具,用来获取操作redis集群的redis-trib.rb

3. 设置gem源并安装redis依赖


gem sources --remove [https://rubygems.org/](https://rubygems.org/)  #删掉原来的源

gem sources -a [http://gems.ruby-china.org](http://ruby.taobao.org/)/ #添加新源

gem sources -l #查看现有的源

gem install redis #安装redis依赖

4. 下载redis-trib.rb文件,点击这里 进行下载

4. 3主3从做集群:创建6个文件夹6379,6380,6381,7379,7380,7381

5. 每个文件夹下的conf文件修改如下(config文件建议将名字修改带端口号)

port 6379 #修改成正确的端口号

bind 192.168.3.106 #服务器ip配置:这里一定不能使用127.0.0.1,否则jedis客户端使用时无法连接到

cluster-enabled yes #开启集群模式

cluster-config-file nodes.conf # 指定集群的配置文件,自动维护,方便重启时恢复状态

cluster-node-timeout 5000 #允许集群中的节点能够失联的最大时间,超过这个时间,该节点就会被认为故障。

6. 启动redis server:分别启动6个redis

redis-server.exe redis.windows6379.conf
redis-server.exe redis.windows6380.conf
redis-server.exe redis.windows6381.conf
.....

7. 搭建集群命令:

参数说明:

(1)create:表示创建集群

(2)--replicas N:指定从的个数


C:\redis64-3.0.501>ruby redis-trib.rb create --replicas 1 192.168.3.106:6379 192.168.

3.106:6380 192.168.3.106:6381 192.168.3.106:7379 192.168.3.106:7380 192.168.3.10

6:7381

8.执行之后会打印出一对集群配置信息,确认无误之后输入yes


clipboard.png
  1. 执行成功之后的界面:
    遇到的问题:7379的conf中cluster-config-file nodes.conf 的文件配置错误,导致创建集群失败。重新执行create命令后,依旧失败,输出如下


    错误信息.png

解决方案:删除集群的配置文件,然后重新启动redis-server
执行成功之后的界面:


执行成功.png

10 到此,搭建集群完成
11 测试集群:用redis-cli来处理数据,注意命令和非集群相比加了一个-c

redis-cli.exe -h 192.168.3.106 -p 6379 -c
连接集群.png
  1. 查看集群的信息:cluster nodes


    查看集群.png

新增集群节点

1. 开启端口为9999的实例:redis-server.exe redis.windows9999.conf
2. 执行脚本:ruby redis-trib.rb add-node 192.168.56.102:6382 192.168.56.102:6379

执行脚本.png

3. cluster nodes:查看集群信息
查看集群信息.png

4. 分配插槽给9999的redis 实例:
分配插槽.png

分配成功.png

5. 查看集群信息:cluster nodes
查看集群.png

分配插槽成功

删除集群节点
需要先将插槽转移到其他节点上,然后删除节点即可

  1. 转移插槽:ruby redis-cli.exe reshard 192.168.3.102:9999
  2. 选择需要转移的数量:1000
  3. 输入接受插槽的node id
  4. 输入转移的node id
  5. 输入done 开始转移
  6. 转移成功后,查看集群信息


    查看集群.png
  7. ruby redis-trib.rb del-node 192.168.3.102:9999 “9999的node id”
    删除集群.png

    查看集群.png

故障转移

  1. 集群中的每个节点都会定期的向其它节点发送PING命令,并且通过有没有收到回复判断目标节点是否下线;
  2. 集群中每一秒就会随机选择5个节点,然后选择其中最久没有响应的节点放PING命令;
  3. 如果一定时间内目标节点都没有响应,那么该节点就认为目标节点疑似下线;
  4. 当集群中的节点超过半数认为该目标节点疑似下线,那么该节点就会被标记为下线;所以这里的节点必须大于3
  5. 当集群中的任何一个节点下线,就会导致插槽区有空档,不完整,那么该集群将不可用;
  6. 如何解决上述问题?
  7. 在Redis集群中可以使用主从模式实现某一个节点的高可用
  8. 当该节点(master)宕机后,集群会将该节点的从数据库(slave)转变为(master)继续完成集群服务;

问题

为什么最小集群需要3个节点?
因为你要使用他的自动故障转移机制。自动故障转移的机制就是需要集群中一半以上的节点都认为你下线了,才会自动故障转移

redis
Web note ad 1