0%

在RedisCluster中Debug lua 脚本.md

在使用单实例Redis时, 我们可以使用./redis-cli -h redis_ip -p redis 6379 --ldb --eval script.lua somekey , arg1 arg2命令轻松的进入debug模式调试lua脚本
在正常情况下, 进入debug模式后可以使用一系列命令来执行控制脚本的执行, 使用help命令应该可以看到如下界面

1
2
3
4
5
6
7
8
9
lua debugger> help
Redis Lua debugger help:
[h]elp Show this help.
[s]tep Run current line and stop again.
[n]ext Alias for step.
[c]continue Run till next breakpoint.
[l]list List source code around current line.
[l]list [line] List source code around [line].
...

但是如果你使用的是redis cluster, 当你执行debug后, 大概率会看到如下内容

1
2
3
4
5
6
7
Lua debugging session started, please use:
quit -- End the session.
restart -- Restart the script in debug mode again.
help -- Show Lua script debugging commands.

MOVED 6918 127.0.0.1:6001
...

通常你还会看到lua脚本的输出,但是却无法设置任何debug或者断点

即使你输入help, 也只是会看到如下报错, 这种情况下所有的debug命令都无法使用

1
2
lua debugger> help
ERR unknown command `help`, with args beginning with:

造成这种现象的原因是你登陆的节点不包含key所属的slot,

解决方法也很简单, 根据consloe输出的MOVED 6918 127.0.0.1:6001指令, 使用redis-cli直接连接对应的redis node就可以顺利进入debug模式。
如果丢失了一开始的输出, 可以在界面中执行get操作, 就可以再次看到MOVED关键字。

1
2
lua debugger> get somekey
MOVED 6918 127.0.0.1:6001

重新连接后即可看到正常输出

1
2
3
4
5
6
7
8
Lua debugging session started, please use:
quit -- End the session.
restart -- Restart the script in debug mode again.
help -- Show Lua script debugging commands.

* Stopped at 1, stop reason = step over
-> 1 local expirePTTL = redis.call('PTTL', KEYS[1])
lua debugger>