在重新分片 Redis Enterprise 数据库之前需要检查什么?
最后更新日期:2024 年 4 月 18 日
问题
在重新分片 Redis Enterprise 数据库之前需要检查什么?
答案
分片的 Redis Enterprise 数据库支持对多个键进行操作,例如 MSET 和 MGET(以及其他可变参数命令)(尽管不保证原子性,代理会管理跨不同分片的可变参数命令),但对于既是多键命令又是跨槽操作的命令存在限制。
当 Redis Enterprise 数据库未分片时,不强制执行此类约束
redis-12730.cluster.local:12730> MULTI
OK
redis-12730.cluster.local:12730(TX)> SET user:1 "John Smith"
QUEUED
redis-12730.cluster.local:12730(TX)> SET user:1:books "56456,656565,55555"
QUEUED
redis-12730.cluster.local:12730(TX)> EXEC
1) OK
2) OK
然而,当数据库分片时,涉及不同槽位中键的命令是不允许的:跨槽命令需要协调跨分片操作,这在设计上为了提高简单性和性能而未予支持。 在此示例中,在集群化数据库中运行相同的 Redis 事务
redis-12730.cluster.local:12730> MULTI
OK
redis-12730.cluster.local:12730(TX)> SET user:1 "John Smith, London"
QUEUED
redis-12730.cluster.local:12730(TX)> SET user:1:books "56456,656565,55555,6666"
(error) CROSSSLOT Keys in request don't hash to the same slot (context='within MULTI', command='SET', original-slot='10778', wrong-slot='3197', first-key='user:1', violating-key='user:1:books')
总结
WATCH/MULTI/EXEC
块中的操作应在位于同一槽位的键上执行。- 多键命令(例如
SDIFF
或ZUNION
)只能在所有受影响的键位于同一槽位时使用。此类命令的示例包括:BITOP, BLPOP, BRPOP, BRPOPLPUSH, MSETNX, RPOPLPUSH, SDIFF, SDIFFSTORE, SINTER, SINTERSTORE, SMOVE, SORT, SUNION, ZINTER, ZINTERSTORE, ZUNION, ZUNIONSTORE, ZDIFF, ZDIFFSTORE
- 同样,Lua 脚本和 Redis Functions 必须针对同一槽位中的键进行操作
可以使用 INFO COMMANDSTATS 命令审计在 Redis 中执行的命令,并验证(除其他事项外)在数据库上执行的命令是否是“集群安全”的。
请注意,重新分片操作在无停机的情况下执行,但可能在操作完成之前产生一些延迟。
参考资料
请参阅文档以了解有关多键操作的更多信息。