Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移能力。集群环境搭建Redis集群最少需要3个master节点,这里我们搭建3个ma......
Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移能力。
集群环境搭建Redis集群最少需要3个master节点,这里我们搭建3个master节点,3个slave及节点(由于我机器配置受限,直接通过端口的方式模拟集群搭建,本处只是实验方便,生产环境不可采取此方案)。
环境搭建步骤如下:
简单说明,首先我们先要定义集群节点的端口7000-7005然后配置文件复制到对应的配置文件名。
IP端口配置文件127.0.0.170007000/127.0.0.170017001/127.0.0.170027002/127.0.0.170037003/127.0.0.170047004/127.0.0.170057005/
编辑文件,主要修改以下的几个配置(如果需要设置密码需要配置requirepass和masterauth)
daemonizeyes
启动集群模式
cluster-enabledyes
启动所有的服务7000-7005
cd7000
redis-server./
初始化集群,通过redis-cli--clustercreate命令初始化集群,命令如下(如果是生产环境,需要节点间IP以及端口是否可互相访问):
:7000127.0.0.1:7001\
127.0.0.1:7002127.0.0.1:7003127.0.0.1:7004127.0.0.1:7005\
--cluster-replicas1
集群状态查询
登录节点,注意一定要加-c表示集群模式。
查询集群状态clusterinfo
➜
127.0.0.1:7000
127.0.0.1:7000clusterinfo
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:263
cluster_stats_messages_pong_sent:270
cluster_stats_messages_sent:533
cluster_stats_messages_ping_received:270
cluster_stats_messages_pong_received:263
cluster_stats_messages_received:533
127.0.0.1:7000
其他的集群创建方案utils/create-cluster我们可以在参考资料中找到创建方式(参考文档:)
RedisCluster将所有数据划分为16384个slots(槽位),每个节点负责其中一部分槽位。槽位的信息存储于每个节点中。
当RedisCluster的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。这样当客户端要查找某个key时,可以直接定位到目标节点。同时因为槽位的信息可能会存在客户端与服务器不一致的情况,还需要纠正机制来实现槽位信息的校验调整。
Cluster默认会对key值使用crc16算法进行hash得到一个整数值,然后用这个整数值对16384进行与操作来得到具体槽位。
源码位置src/中的keyHashSlot方法
crc16(key,keylen)0x3FFF
为什是16384可以看看这篇文章:Redis为什么是16384个槽?
查询某个key那个节点上,方法如下:
查询所有的槽分布信息
查询集群节点
➜etcredis-cli-p7001clusternodes
2109:7006@17006master-016539205627187connected0-13325461-679410923-12255
:7003@17003slavee36fc81472afb04b9c88af1504a8e02647de1b617102connected
6:7004@17004slavede631f8ac9649f5d9fb12013dc01407f953c3299016539205620003connected
57:7005@17005slave0acfc8b3dd2223333a03bbcf856dd2a839d2e072016539205625161connected
8:7007@17007master-016539205630000connected
:7002@17002master-016539205630003connected12256-16383
0:7000@17000master-016539205615061connected1333-5460
:7001@17001myself,master-016539205620002connected6795-10922
制定当前当前节点的主节点7006
127.0.0.1:7007clusterreplicate2109c2832177e8514174c6ef8fefd681076e28df
OK
1:2109c2832177e8514174c6ef8fefd681076e28df
Sourcenode#2:done
查询节点槽信息
:70062109c2832177e8514174c6ef8fefd681076e28df
执行后结果如下:
《Redis设计与实现》黄健宏
Redis为什么是16384个槽?