Sniffer MySQL package: capture TCP package, parsed with mysql protocol, optional you can send query info to Kafka. 抓取tcp包解析出mysql语句
Go to file
xiaobiao b705210cdb Merge commit '3430b80' into master 2022-04-19 11:53:03 +08:00
Godeps 从proxy获取client ip地址 2019-12-05 20:51:43 +08:00
capture add windows support 2022-04-18 22:28:49 +08:00
communicator add windows support 2022-04-18 22:28:49 +08:00
docs Merge pull request #16 from zr-hebo/realtime-qps 2020-02-13 15:09:21 +08:00
exporter add windows support 2022-04-18 22:28:49 +08:00
images update images 2019-08-30 10:21:38 +08:00
model add query qps api 2019-12-27 17:50:25 +08:00
scripts add communicator api 2019-09-05 20:27:49 +08:00
session-dealer add windows support 2022-04-18 22:28:49 +08:00
util 修改buffer pool大小 2019-12-10 19:31:11 +08:00
vendor add windows support 2022-04-18 22:28:49 +08:00
.gitignore change git ignore 2019-09-25 15:56:58 +08:00
Makefile Initial commit 2019-08-08 15:20:56 +08:00
README.md 更新 windows系统相关说明 2022-04-19 11:51:48 +08:00
main.go add windows support 2022-04-18 22:28:49 +08:00

README.md

Sniffer-Agent

Sniffer TCP package, parsed with mysql protocol, optional you can just print on screen or send query info to Kafka. 抓取tcp包解析出mysql语句将查询信息打印在屏幕上或者发送到Kafka

1. Architecture

架构设计:

本项目采用模块化设计主要分为四大模块TCP抓包模块协议解析模块输出模块心跳模块 架构设计图

2. Parse Protocol

sniffer-agent采用模块化结构支持用户添加自己的解析模块只要实现了统一的接口即可

  • MySQL
  • PostgreSQL
  • Redis
  • Mongodb
  • GRPC
详细输出格式查看

3. CapturePacketRate

sniffer-agent可以动态设置抓包率详情查看文档

4. Exporter

输出模块主要负责将解析的结果对外输出。默认情况下输出到命令行可以通过指定export_type参数选择kafka这时候会直接将解析结果发送到kafka。 同样只要实现了export接口用户可以自定义自己的输出方式。

5. Install:

环境:

golang1.12+

libpcap包

测试脚本运行在python3环境下

1.安装依赖目前自测支持Linux系列操作系统其他版本的系统有待验证

CentOS:

yum install libpcap-devel

Ubuntu:

apt-get install libpcap-dev

WindowsWindows系统的抓包效率和准确性都较低建议别在生产使用:

安装 Npcap, 下载地址https://npcap.com/

2.关闭 GO111MODULE状态

go env -w GO111MODULE=off

3.执行编译命令

go build

6. Demo

目前只支持MySQL协议的抓取需要将编译后的二进制文件上传到MySQL服务器上

1.最简单的使用

./sniffer-agent

2.指定log级别可以指定的值为debug、info、warn、error默认是info

./sniffer-agent --log_level=debug

默认会监听 网卡eth0端口3306

3.指定网卡和监听端口

./sniffer-agent --interface=eth0 --port=3358

4.指定输出到kafka为了将ddl和select、dml区分处理这里使用了两个topic来生产消息

./sniffer-agent --export_type=kafka --kafka-server=$kafka_server:$kafka_server --kafka-group-id=sniffer --kafka-async-topic=non_ddl_sql_collector --kafka-sync-topic=ddl_sql_collector

5.指定严格模式,通过查询获取长连接的用户名和数据库

./sniffer-agent --strict_mode=true --admin_user=root --admin_passwd=123456

7. 题外话

在做这个功能之前,项目组调研过类似功能的产品,最有名的是 mysql-sniffergo-sniffer,这两个产品都很优秀,不过我们的业务场景要求更多。 我们需要将提取的SQL信息发送到kafka进行处理之前的两个产品输出的结果需要进行一些处理然后自己发送在QPS比较高的情况下这些处理会消耗较多的CPU 另外mysql-sniffer使用c++开发,平台的适用性较差,后期扩展较难。 开发的过程中也借鉴了这些产品的思想另外在MySQL包解析的时候参考了一些 VitessTiDB 的内容,部分私有变量和函数直接复制使用,这里向这些优秀的产品致敬,如有侵权请随时联系。

8. 结果分析

在压测的过程中和mysql-sniffer进行了结果对比压测执行28万条语句mysql-sniffer抓取了8千条sniffer-agent抓取了30万条语句其中包含client自动生成的语句

9. 风险提示

1.sniffer-agent使用了pacp抓包根据pacp抓包原理在IO较高的时候有一定的概率丢包

2.sniffer-agent提供了Prepare语句的支持但是如果sniffer-agent在prepare语句初始化之后启动就无法抓取prepare语句

3.目前在 MySQL5.5-5.7上测试可用MySQL8上会出现一些莫名其妙的问题

4.目前为止也没有使用 go mod进行包管理因为一些原因依赖的一些包在国内没法直接下载进来因此把这些包保存在 vendor目录方便编译

License MIT