在重新分片 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代码块内的操作。
  • 只有当所有受影响的密钥均位于同一插槽中时,才可以使用SDIFFZUNION等多密钥命令。此类命令的示例有:BITOP, BLPOP, BRPOP, BRPOPLPUSH, MSETNX, RPOPLPUSH, SDIFF, SDIFFSTORE, SINTER, SINTERSTORE, SMOVE, SORT, SUNION, ZINTER, ZINTERSTORE, ZUNION, ZUNIONSTORE, ZDIFF, ZDIFFSTORE
  • 同样,Lua 脚本和 Redis 函数必须针对同一插槽中的密钥进行操作

可以用 INFO COMMANDSTATS 来审核在 Redis 中执行的命令,并验证在数据库上执行的命令是否是“群集安全的”。

请注意,重新分片操作在不中断服务的情况下执行,但在进程完成之前会产生一定延迟。

参考

参阅文档了解更多信息多键操作