|
本文参考孙卫琴所创作的<<Spring Cloud Alibaba微服务开发零基础入门到实战>>一书本文按照集群模式来搭建Redis集群。如图1所示,一共建立6个节点,有三个是主节点,另外三个是从节点。这6个节点的安装文件分别位于C:\redis1、C:\redis2、C:\redis3、C:\redis4、C:\redis5、C:\redis6目录下。
图1 包括6个节点的Redis集群
创建图1所示的Redis集群的步骤如下。
(1)把Redis的安装压缩文件解压到C:\redis1目录下,作为第一个Redis节点。
(2)在C:\redis1目录下创建redis.conf配置文件,参见例程1。
例程1 redis.conf
#监听端口
port 7001
#开启集群功能
cluster-enabled yes
#集群的配置文件名称,不需要自己创建,由Redis自己维护
cluster-config-file node-7001.conf
#节点心跳失败的超时时间
cluster-node-timeout 5000
#持久化文件存放目录
dir "\data"
#绑定地址
bind 0.0.0.0
#是否让Redis后台运行
daemonize no
#保护模式
protected-mode no
#数据库数量
databases 1 |
(3)在C:\redis1目录下创建data子目录。Redis节点的存储数据以及node-7001.conf集群配置文件都会存放在该目录下。
(4)把C:\redis1目录中的内容复制到C:\redis2、C:\redis3、C:\redis4、C:\redis5、C:\redis6目录中。
(5)修改C:\redis2、C:\redis3、C:\redis4、C:\redis5、C:\redis6目录中的redis.conf配置文件,修改相应的端口号。例如C:\redis2目录下的redis.conf文件作如下修改,端口号改为为7002,集群配置文件改为node-7002.conf:
port 7002
……
cluster-config-file node-7002.conf |
(6)在DOS命令行转到每个Redis节点的根目录下,运行以下命令:
以上命令会根据redis.conf文件中的配置内容启动Redis节点。
(7)在DOS命令行转到C:\redis1目录,运行以下命令搭建Redis集群:
redis-cli --cluster create --cluster-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 |
以上命令会把6个Redis节点作为一个集群,打印以下信息:
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 |
以上信息显式了各个节点之间的主从关系,例如端口为7001的节点为主节点,它的从节点的端口为7004。值得注意的是,主从节点的关系并不是一成不变的。redis-cli命令会按照特定算法选择一个可用的节点作为特定主节点的从节点。
问题:“向Redis集群中存入一对key/value,到底存放到哪个Redis节点呢?”
回答:“每个Redis主节点都包含若干哈希槽(hash slot)。这对key/value会存放到特定的哈希槽中。”
Redis 集群中内置了 16384 个哈希槽,分摊到所有的Redis主节点中。在图2中,三个主节点分别分配了5461、5462、5461个哈希槽。每个槽都有编号,依次为0、1、2,直到16383。例如编号为3的槽位于主节点1,编号为5463的槽位于主节点2,编号为10925的槽位于主节点3。
图2 Redis 集群中各节点的哈希槽分配
当应用程序向 Redis 集群中存入一对key/value时,与应用程序连接的Redis节点先按照key计算哈希槽的编号,运算表达式为:
crc16(key) % 16384 //crc16是一种校验算法 |
以上表达式的取值位于0到16384之间,表示槽的编号,假定取值为10925。由于编号为10925的槽位于主节点3中,这对key/value就会存放到主节点3的编号为10925的槽中。在一个槽中,可以存放多对key/value。此外,主节点存放的数据会同步到从节点中。
使用哈希槽的优点在于可以方便地添加或移除节点。当需要向Redis集群增加节点时,只需要把其他节点的某些哈希槽挪到新节点;当需要移除节点时,只需要把被移除节点的哈希槽挪到其他可用节点。
程序猿的技术大观园:www.javathinker.net
[这个贴子最后由 sunweiqin 在 2024-07-11 13:45:20 重新编辑]
|
|