MyRedisCapture
redis可通过monitor命令获取执行的命令.
但大部分redis proxy并不支持monitor命令,抓包请求命令与来源ip对于proxy来说是一个非常常见的需求。
该工具通过gopacket这个库完成redis请求的抓包。
关于gopacket的使用,可参考examples下的示例。
该工具主要参考:reassemblydump
注意事项
- 用
root账户执行; - 该工具无法捕获全部命令,特别在请求非常频繁时,捕获的请求数和实际执行的请求数会有较大差距;
- 该工具如果占用内存过高,可通过减少
--gopacket-max-pages-per-conn、--gopacket-max-pages-total降低内存占用. - 通过下面命令开启debug模式,会将相关错误信息输出:
export MYREDIS_CAPTURE_DEBUG=true
参数说明
--device: 网络设备名称,如eth1、eth0、lo等;--dst-port:目标端口号;--max-packet:最大包大小,默认是1MB,不建议修改;--only-big-req: 默认为0,不生效.如果--only-big-req大于0,则只抓取 pipeline命令数大于--only-big-req,mget、mset等操作的key个数超过--only-big-req的命令;--only-big-val: 默认为0,不生效.如果--only-big-val大于0,则只抓取命令中存在value大小大于--only-big-val的命令;--print-val-length:该功能未完成;--top-hot-keys: 该功能未完成;--decoder-thread-cnt:请求包解析者goroutine数,默认20;--timeout: 请求抓取时间;--gopacket-assembler-cnt: 指定accembler个数。如果请求较大,可能一个请求会分为多个packet发送给目的进程,此时如果想获取完整请求命令就需要使用tcp重组技术,该参数与该技术相关。--gopacket-max-pages-per-conn: 默认500, 抓取时每个连接达到最大pageee数后,会强制flush;--gopacket-max-pages-total: 所有抓取到的连接最大page个数;--output-file: 结果输出到文件,如果为空则输出到标注输出.
使用示例
#示例1
./myredisCapture --device=eth1 --dst-port=6379 --timeout=60 --output-file=1.log
#示例2
./myredisCapture --device=eth1 --dst-port=6379 --timeout=600 --output-file=1.log --gopacket-max-pages-per-conn=200 --gopacket-max-pages-total=50000
结果示例: