obkv-redis 压测zadd报错

【 使用环境 】生产环境
【 OB or 其他组件 】obkv-redis
【 使用版本 】4.2.5.2
【问题描述】
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):
export host=10.37
export port=2885
export passwd=My
*3L
/usr/local/bin/memtier_benchmark
-s $host
-p $port
-a $passwd
-t 10
-c 50
-n 31457
–pipeline=1
–distinct-client-seed
–random-data
–data-size=1024
–key-maximum=15728640
–key-minimum=1
–command=‘zadd key key data
–command-key-pattern=P
【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

^G --command=‘zadd key key data
^G --command-key-pattern=P
Writing results to stdout
[RUN #1] Preparing benchmark client…
[RUN #1] Launching threads now…
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR value is not a valid float
server 10.38.48.37:2885 handle error response: -ERR valu

1 个赞

这个是zadd的语法问题吗?
OBKV-Redis 性能测试-V4.2.5-文档-分布式数据库使用文档

1 个赞

根据您提供的信息,obkv-redis 在进行 zadd 压测时出现了 -ERR value is not a valid float 的错误。以下是问题分析和可能的解决方案:


1. 问题分析

从错误信息来看,-ERR value is not a valid float 表明在执行 zadd 命令时,传递的参数不符合 Redis 的规范。具体来说,zadd 命令的语法如下:

ZADD key score member [score member ...]

其中:

  • key 是有序集合的名称。
  • score 是一个浮点数,表示成员的分值。
  • member 是要添加到集合中的成员。

根据您的命令:

--command='zadd __key__ __key__ __data__'

这里的 __key____data__ 可能没有正确解析为有效的浮点数 score,导致报错。


2. 可能的原因

结合压测工具 memtier_benchmark 的行为和 zadd 的语法规则,以下是可能的原因:

  • __data__ 不是合法的浮点数zadd 要求 score 必须是一个浮点数,而 __data__ 可能是一个随机生成的字符串,无法被解析为浮点数。
  • 参数顺序错误zadd 的第二个参数必须是 score(浮点数),但当前命令中可能将 __key__ 或其他非浮点数值误用作 score
  • 压测工具生成的数据不合规memtier_benchmark--random-data 参数可能会生成不符合 zadd 要求的数据。

3. 解决方案

针对上述问题,可以尝试以下解决方法:

方法一:确保 score 是合法的浮点数

修改 --command 参数,明确指定 score 为一个合法的浮点数。例如:

--command='zadd __key__ 1.0 __data__'

这里将 score 固定为 1.0,以确保符合 zadd 的要求。

方法二:动态生成合法的 score

如果需要动态生成 score,可以通过脚本或工具生成合法的浮点数。例如:

--command='zadd __key__ $(python -c "import random; print(random.uniform(0, 100))") __data__'

此命令会生成一个范围在 [0, 100] 的随机浮点数作为 score

方法三:检查 memtier_benchmark 的数据生成逻辑

如果您使用了 --random-data 参数,请确认生成的数据是否符合 zadd 的要求。如果不符,可以禁用 --random-data 并手动指定合法的 scoremember

方法四:验证 OBKV-Redis 的兼容性

虽然 OceanBase 的 OBKV-Redis 模式兼容大部分 Redis 命令,但仍可能存在某些细微差异。建议参考官方文档确认 zadd 命令的具体实现和限制。


4. 进一步排查

如果上述方法仍无法解决问题,可以采取以下步骤进一步排查:

  1. 收集诊断信息:使用 obdiag 工具收集集群日志和状态信息,定位具体的错误原因。
    obdiag collect log --start-time="2023-01-01 00:00:00" --end-time="2023-01-02 00:00:00"
    
  2. 检查 OBKV-Redis 配置:确认 OBKV-Redis 的配置是否正确,特别是与 Redis 兼容性相关的参数。
  3. 联系技术支持:如果问题仍未解决,可联系 OceanBase 的人工答疑团队,提供详细的日志和配置信息以获取进一步帮助。

5. 总结

根据文档库中的信息和您的描述,问题的主要原因是 zadd 命令的参数不符合 Redis 的规范。通过确保 score 是合法的浮点数并调整压测工具的参数,可以有效解决该问题。如果仍有疑问,请提供更多详细信息以便进一步分析。

更多信息请查看:

  1. 进行 Sysbench 测试
  2. 使用 JMeter 运行业务场景测试
  3. replace 和 insert_or_update 的区别
  4. 使用 OBD 升级 OceanBase 数据库
  5. OBKV-Table 支持的值类型
  6. OceanBase 集群运维管理之用户实操
  7. 使用 MySQL 租户做常见数据库开发
1 个赞

:clap: :clap: :clap: :clap:

:facepunch: :facepunch: :facepunch: :facepunch:

设置的value 不是浮点型会报错