Redis集群内部存储结构设计及搭建

集群cluster介绍

Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。

Redis 集群不支持需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis 集群的性能, 并导致不可预测的错误。

Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

Redis 集群提供了以下两个好处:

  • 将数据自动切分(split)到多个节点的能力。
  • 当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。

数据分片

Redis 集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现:
一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个。
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽,集群中的每个节点负责处理一部分哈希槽。

  • 节点 A 负责处理 0 号至 5500 号哈希槽。
  • 节点 B 负责处理 5501 号至 11000 号哈希槽。
  • 节点 C 负责处理 11001 号至 16384 号哈希槽。

这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。
比如说,我现在想设置一个key,叫demo_key :set demo_key demo
按照Redis Cluster的哈希槽算法,CRC16('demo_key')%16384 = 2412 那么这个key就被分配到了节点A上 。
当连接(A,B,C)的任意一个节点想获取demo_key这个key,都会转到节点A上 。
如果用户将新节点 D 添加到集群中, 那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。

主从复制模型

为了集群在一部分节点下线或者无法与集群的大多数节点进行通讯的情况下仍然可以正常运作, Redis 集群对节点使用了主从复制功能:

集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave)。

在之前列举的节点 A 、B 、C 的例子中, 如果节点 B 下线了, 那么集群将无法正常运行, 因为集群找不到节点来处理 5501 号至 11000号的哈希槽。

假如在创建集群的时候(或者在节点 B 下线之前), 为主节点 B 添加了从节点 B1 , 那么当主节点 B 下线的时候, 集群就会将 B1 设置为新的主节点, 并让它代替下线的主节点 B , 继续处理 5501 号至 11000 号的哈希槽, 这样集群就不会因为主节点 B 的下线而无法正常运作了。
不过如果节点 B 和 B1 都下线的话, Redis 集群还是会停止运作。

集群Cluster配置

每个Redis实例使用不同的配置文件,主从不用配置,集群会自己选
这里采用三主三从的集群方案(本地测试六个实例)

  • 添加节点
    cluster-enabled yes|no
  • cluster配置文件名,该文件属于自动生成,仅用于快速查找文件并查询文件内容
    cluster-config-file <filename>
  • 节点服务响应超时时间,用于判定该节点是否下线或切换为从节点
    cluster-node-timeout <milliseconds>
  • master连接的slave最小数量
    cluster-migration-barrier <count>

Redis.Conf文件配置

port 6379
daemonize no
dir data
dbfilename dump-6379.rdb
rdbcompression yes
rdbchecksum yes
save 10 2
appendonly yes
appendfsync everysec
appendfilename appendonly-6379.aof
#集群配置
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 10000

可以使用sed命令快速替换复制六份

sed "s/6379/6384/g" redis-6379.conf > redis-6384.conf

然后启动6个Redis实例可以使用 ps -ef | grep redis 查看实例是否成功启动

集群创建

使用redis-cli命令创建集群

redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
--replicas 指集群内部结构 1 表示 一个Master后面跟一个Slave 1主1从,如果填3 那么就是3主三从
输入yes,这样集群就建立了

集群节点操作命令

  • cluster nodes:查看集群节点信息
  • cluster replicate <master-id>:进入一个从节点redis,切换其主节点
  • cluster meet ip:port:发现一个新节点间,新增主节点
  • cluster forget <id>:忽略一个没有solt的节点
  • cluster failover:手动故障转移

RedisCli命令

  • redis-cli --cluster add-node:添加节点
  • redis-cli --cluster del-node:删除节点
  • redis-cli --cluster reshard:重新分片

添加新评论

评论列表