Redis集群(1)-基础知识

我们都知道单个Redis服务或者Redis主从结构,都会存在以下问题:

1、Redis服务的存储空间受到单台服务器的内存空间限制;
2、Redis服务访问压力都集中在一台服务器中(主从结构可以将读写访问分开,但是所有的写请求都集中在主服务中);
3、存在单点故障的隐忧(主从结构+哨兵的结构可以一定程度上防止单点故障的出现)。

集群可以使用多台主机横向扩展Redis服务的存储空间,使得Redis服务的存储空间不再受限于一台主机的内存大小;而且集群能将单台主机的访问压力分布到多台主机上,从而提高Redis系统的吞吐率和降低服务的响应时间。

端口使用

当Redis服务启动集群功能时,每个Redis服务都会监听两个端口;一个用于提供给Redis客户端进行连接发送命令(即数据端口),另一个用于集群节点间通信,即集群总线,主要用于集群节点间的故障检测、配置更新、故障恢复等用途。此两个端口的差值固定10000,如:若集群中某个Redis服务的数据端口是6379,则集群总线的端口为16379。因此集群要正常运行,防火墙必须开放这两个端口的访问权限。

数据分片

每个Redis集群中都会有16384个哈希槽(hash slot),存储在集群中的每一个键都会分配到这16284个哈希槽中的其中一个。集群默认会将这些哈希槽分配到集群中的每一个主Redis服务中,每个主Redis负责部分哈希槽的读写操作。如:假设集群中有A、B、C 三个主Redis服务,其中A负责0-5500好哈希槽、B负责5501-1100号哈希槽、C负责1101-16383号哈希槽。
集群中哈希槽的迁移操作并不需要下线集群再进行操作,因此我们可以在集群提供正常服务的同时,通过哈希槽的迁移操作进行集群节点的上线和下线功能。

注意事项

但是Redis集群存在一个小问题,若在集群上执行如mget这种多键的操作,只有操作的所有键都在同一个哈希槽中,集群才能返回正确的结果。好消息是Redis集群提供了哈希标签(hash tag)机制来保证某些键分配到相同的哈希槽中。

哈希标签的主要思想是:当键中有以{}括起的子串,则Redis集群以此子串为有效部分进行哈希槽的分配。如:键{user:2}:name和键{user:2}:age两个键均以 user:2 子串为有效部分进行哈希槽的分配,因此这两个键肯定会分配到同一个哈希槽中。

集群还有个问题,若集群中只有主服务,当某个主Redis服务出现故障不能正常提供服务时,整个集群集群会因为某些哈希槽没有Redis服务负责而不能正常工作。
这种情况下可以有如下两种解决方案,这两种解决方案可以配合使用:

1、为集群中每个主Redis服务增加从服务,在这种情况下,当集群中主Redis服务出现故障不能正常工作时,集群会在其从服务中选择一个备选从服务升级成主服务,继续保持集群正常工作。
2、 修改/path/to/redis.config配置文件中cluster-require-full-coverage配置值为no使集群在这种情况下继续工作【但是某些哈希槽不能正常使用】,此配置项默认值为yes

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值