当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384(redis集群将所有的空间分为16384份) 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
集群是如何判断是否有某个节点挂掉了呢?
节点之间通过互相的ping-pong判断是否可以连接上,如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了。
为什么需要至少3个master节点?
因为故障检测和故障转移过程都要求大多数主节点(即一半以上节点)达成协议.如果我们只有2个主设备而一个设备发生故障,则另一个主节点无法根据协议做出决定;主数量应为奇数,以便做选举判决。
搭建集群
创建文件夹
我们计划集群中 Redis 节点的端口号为 9001-9006 ,端口号即集群下各实例文件夹。数据存放在 端口号/data 文件夹中。
mkdir /usr/local/redis-cluster cd redis-cluster/ mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data |
复制脚本
在 /usr/local/redis-cluster 下创建 bin 文件夹,用来存放集群运行脚本,并把安装好的 Redis 的 src 路径下的运行脚本拷贝过来。看命令:
Cd /usr/local/redis-cluster mkdir bin Cd /usr/local/redis-3.2.9/src cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin |
复制一个新 Redis 实例
我们现在从已安装好的 Redis 中复制一个新的实例到 9001 文件夹,并修改 redis.conf 配置。
cp -r /usr/local/redis /usr/local/redis-cluster/9001 注意,修改 redis.conf 配置和单点唯一区别是下图部分,其余还是常规的这几项: port 9001(每个节点的端口号) daemonize yes bind 192.168.119.131(绑定当前机器 IP) dir /usr/local/redis-cluster/9001/data/(数据文件存放位置) pidfile /var/run/redis_9001.pid(pid 9001和port要对应) cluster-enabled yes(启动集群模式) cluster-config-file nodes9001.conf(9001和port要对应) cluster-node-timeout 15000 appendonly yes |
再复制出五个新 Redis 实例
我们已经完成了一个节点了,其实接下来就是机械化的再完成另外五个节点,其实可以这么做:把 9001 实例 复制到另外五个文件夹中,唯一要修改的就是 redis.conf 中的所有和端口的相关的信息即可,其实就那么四个位置。开始操作,看图:
\cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9002 \cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9003 \cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9004 \cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9005 \cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9006 |
\cp -rf 命令是不使用别名来复制,因为 cp 其实是别名 cp -i,操作时会有交互式确认,比较烦人。
修改 9002-9006 的 redis.conf 文件
其实非常简单了,你通过搜索会发现其实只有四个点需要修改,我们全局替换下吧,进入相应的节点文件夹,做替换就好了。命令非常简单,看图:
vi /usr/local/redis-cluster/9002/redis/etc/redis.conf vi /usr/local/redis-cluster/9003/redis/etc/redis.conf vi /usr/local/redis-cluster/9004/redis/etc/redis.conf vi /usr/local/redis-cluster/9005/redis/etc/redis.conf vi /usr/local/redis-cluster/9006/redis/etc/redis.conf %s/9001/9002 %s/9001/9003 %s/9001/9004 %s/9001/9005 %s/9001/9006 其实我们也就是替换了下面这四行: port 9002 dir /usr/local/redis-cluster/9002/data/ cluster-config-file nodes-9002.conf pidfile /var/run/redis_9002.pid |
启动9001-9006六个节点
/usr/local/redis/bin/redis-server /usr/local/redis-cluster/9001/redis/etc/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis-cluster/9002/redis/etc/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis-cluster/9003/redis/etc/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis-cluster/9004/redis/etc/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis-cluster/9005/redis/etc/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis-cluster/9006/redis/etc/redis.conf
随便找一个节点测试试
/usr/local/redis-cluster/9001/redis/bin/redis-cli -h 192.168.212.150 -p 9001
(error) CLUSTERDOWN Hash slot not served
这是因为虽然我们配置并启动了 Redis 集群服务,但是他们暂时还并不在一个集群中,互相直接发现不了,而且还没有可存储的位置,就是所谓的slot(槽)。
安装集群所需软件
由于 Redis 集群需要使用 ruby 命令,所以我们需要安装 ruby 和相关接口。
yum install ruby yum install rubygems gem install redis 使用本地上传方式 |
SpringBoot整合Redis集群
spring: redis: database: 0 # host: 132.232.44.194 # port: 6379 # password: 123456 jedis: pool: max-active: 8 max-wait: -1 max-idle: 8 min-idle: 0 timeout: 10000 cluster: nodes: - 192.168.212.149:9001 - 192.168.212.149:9002 - 192.168.212.149:9003 - 192.168.212.149:9004 - 192.168.212.149:9005 - 192.168.212.149:9006 |