redis集群之Codis( 五 )
slot_index = crc32(command.key) % 1024
if slot_index in migrating_slots:
do_migrate_key(command.key) # 强制执行迁移
redis = slots[slot_index
.new_redis
else:
redis = slots[slot_index
.redis
redis.do(command)
我们知道 Redis 支持的所有 Scan 指令都是无法避免重复的 , 同样 Codis 自定义的SLOTSSCAN 也是一样 , 但是这并不会影响迁移 。 因为单个 key 被迁移一次后 , 在旧实例中它就彻底被删除了 , 也就不可能会再次被扫描出来了 。
自动均衡
Redis 新增实例 , 手工均衡 slots 太繁琐 , 所以 Codis 提供了自动均衡功能 。 自动均衡会在系统比较空闲的时候观察每个 Redis 实例对应的 Slots 数量 , 如果不平衡 , 就会自动进行
迁移 。
Codis 的代价
Codis 给 Redis 带来了扩容的同时 , 也损失了其它一些特性 。 因为 Codis 中所有的 key 分散在不同的 Redis 实例中 , 所以事务就不能再支持了 , 事务只能在单个 Redis 实例中完成 。 同样 rename 操作也很危险 , 它的参数是两个 key , 如果这两个 key 在不同的 Redis 实例中 , rename 操作是无法正确完成的 。 Codis 的官方文档中给出了一系列不支持的命令列表 。 同样为了支持扩容 , 单个 key 对应的 value 不宜过大 , 因为集群的迁移的最小单位是key , 对于一个 hash 结构 , 它会一次性使用 hgetall 拉取所有的内容 , 然后使用 hmset 放置到另一个节点 。 如果 hash 内部的 kv 太多 , 可能会带来迁移卡顿 。 官方建议单个集合结构的总字节容量不要超过 1M 。 如果我们要放置社交关系数据 , 例如粉丝列表这种 , 就需要注意了 , 可以考虑分桶存储 , 在业务上作折中 。 Codis 因为增加了 Proxy 作为中转层 , 所有在网络开销上要比单个 Redis 大 , 毕竟数据包多走了一个网络节点 , 整体在性能上要比单个 Redis 的性能有所下降 。 但是这部分性能损耗不是太明显 , 可以通过增加 Proxy 的数量来弥补性能上的不足 。 Codis 的集群配置中心使用 zk 来实现 , 意味着在部署上增加了 zk 运维的代价 , 不过大部分互联网企业内部都有 zk 集群 , 可以使用现有的 zk 集群使用即可 。
推荐阅读
- 腾讯云数据库Redis鼎立支持:腾讯会议完成300人在线会议
- 蚂蚁花呗五面(高级):分布式+MySQL+HashMap+线程池+MQ+Redis
- Java Redis 你了解多少?
- 腾讯云数据库Redis助力百万企业远程办公
- 2020年大厂面试开发者需知:redis有什么用?
- Redis缓存知识问题
- BAT一线互联网常考面试题:Spring+并发编程+JVM+设计模式+Redis
- 读懂这一篇,集群节点不下线
- 在大数据开发里Zookeeper有什么用?多台服务器集群的安装与配置
- 粉丝福利!不要小看redis,任何一家公司的招聘信息都包含一段redis的需求!