Sniffer MySQL package: capture TCP package, parsed with mysql protocol, optional you can send query info to Kafka. 抓取tcp包解析出mysql语句
Go to file
hebo a09af431ee update images 2019-08-30 10:21:38 +08:00
Godeps 优化抓包性能 2019-08-14 15:47:47 +08:00
capture expand tcp cahce size 2019-08-30 09:43:45 +08:00
communicator add get status api 2019-08-09 19:55:07 +08:00
exporter fix bug of execute prepare stmt 2019-08-29 20:37:07 +08:00
images update images 2019-08-30 10:21:38 +08:00
model expand tcp cahce size 2019-08-30 09:43:45 +08:00
scripts deal multi packages 2019-08-16 23:02:08 +08:00
session-dealer fix bug of execute prepare stmt 2019-08-29 20:37:07 +08:00
vendor 优化抓包性能 2019-08-14 15:47:47 +08:00
.gitignore 优化性能 2019-08-13 15:51:33 +08:00
Makefile Initial commit 2019-08-08 15:20:56 +08:00
README.md change begin time to timestamp 2019-08-23 15:36:57 +08:00
main.go 优化性能 2019-08-13 15:51:33 +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

Architecture

架构设计:

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

Parse Protocol

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

  • MySQL
  • PostgreSQL
  • Redis
  • Mongodb

目前输出的内容都是解析结果组成的json。 MySQL协议的解析结果示例如下

{"cip":"192.168.XXX.XXX","cport":63888,"sip":"192.168.XX.XX","sport":3306,"user":"root","db":"sniffer","sql":"show tables","bt":"1566545734147","cms":15}

其中cip代表客户端ipcport代表客户端port(客户端ipport组成session标识)sip代表server ipsport代表server portuser代表查询用户db代表当前连接的库名sql代表查询语句bt代表查询开始时间戳cms代表查询消耗的时间单位是毫秒

Exporter

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

Install:

环境:

golang1.12

libpcap包

测试脚本运行在python3环境下

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

CentOS:

yum install libpcap-devel

Ubuntu:

apt-get install libpcap-dev

2.执行编译命令 go build

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

题外话

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

License

MIT