关于 shazam 代理
关于 shazam
他是基于mysql的一个代理,import了PingCAP基于golang实现的sql parser
代理需要做路由以及sharding,所以需要解析语法,但仅实现ast,不实现语义
更多介绍去看他的官方git就可以了,写的总体还是不错的,性能我没做测试,后续安排此事
他比较重要的一个数据结构resultset
mysql/result.go
// Resultset means mysql results of sql execution, included split table sql
type Resultset struct {
Fields []*Field // 解析协议后的mysql协议内field段
FieldNames map[string]int // column information, key: column name value: index in Fields
Values [][]interface{} // 解析协议后的mysql协议内的data段
RowDatas []RowData // 原始mysql协议数据,上面三个字段都是parser,并不返回session中的客户端
// 返回客户端的是这个RowDatas
}
通过golang的调试器dlv调试数据
dlv exec ./shazam-proxy
b writeResultset 停到这个断点,他返回mysql会话内协议数据
[GIN-debug] GET /api/proxy/ping --> github.com/nooncall/shazam/proxy/server.(*AdminServer).ping-fm (2 handlers)
[GIN-debug] PUT /api/proxy/config/prepare/:name --> github.com/nooncall/shazam/proxy/server.(*AdminServer).prepareConfig-fm (2 handlers)
[GIN-debug] PUT /api/proxy/config/commit/:name --> github.com/nooncall/shazam/proxy/server.(*AdminServer).commitConfig-fm (2 handlers)
[GIN-debug] PUT /api/proxy/namespace/delete/:name --> github.com/nooncall/shazam/proxy/server.(*AdminServer).deleteNamespace-fm (2 handlers)
[GIN-debug] GET /api/proxy/config/fingerprint --> github.com/nooncall/shazam/proxy/server.(*AdminServer).configFingerprint-fm (2 handlers)
[GIN-debug] GET /api/proxy/stats/sessionsqlfingerprint/:namespace --> github.com/nooncall/shazam/proxy/server.(*AdminServer).getNamespaceSessionSQLFingerprint-fm (2 handlers)
[GIN-debug] GET /api/proxy/stats/backendsqlfingerprint/:namespace --> github.com/nooncall/shazam/proxy/server.(*AdminServer).getNamespaceBackendSQLFingerprint-fm (2 handlers)
[GIN-debug] GET /api/metric/metrics --> github.com/gin-gonic/gin.WrapH.func1 (2 handlers)
[GIN-debug] GET /debug/pprof/ --> github.com/gin-gonic/gin.WrapF.func1 (2 handlers)
[GIN-debug] GET /debug/pprof/cmdline --> github.com/gin-gonic/gin.WrapF.func1 (2 handlers)
[GIN-debug] GET /debug/pprof/profile --> github.com/gin-gonic/gin.WrapF.func1 (2 handlers)
[GIN-debug] POST /debug/pprof/symbol --> github.com/gin-gonic/gin.WrapF.func1 (2 handlers)
[GIN-debug] GET /debug/pprof/symbol --> github.com/gin-gonic/gin.WrapF.func1 (2 handlers)
[GIN-debug] GET /debug/pprof/trace --> github.com/gin-gonic/gin.WrapF.func1 (2 handlers)
[GIN-debug] GET /debug/pprof/block --> github.com/gin-gonic/gin.WrapF.func1 (2 handlers)
[GIN-debug] GET /debug/pprof/goroutine --> github.com/gin-gonic/gin.WrapF.func1 (2 handlers)
[GIN-debug] GET /debug/pprof/heap --> github.com/gin-gonic/gin.WrapF.func1 (2 handlers)
[GIN-debug] GET /debug/pprof/mutex --> github.com/gin-gonic/gin.WrapF.func1 (2 handlers)
[GIN-debug] GET /debug/pprof/threadcreate --> github.com/gin-gonic/gin.WrapF.func1 (2 handlers)
[GIN-debug] GET /debug/pprof/allocs --> github.com/gin-gonic/gin.WrapF.func1 (2 handlers)
没啥问题的化,已经正常启动了
下面这段是mysql原始协议,这个文档在以下实现描述
https://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::Resultset
(dlv) p r.Fields
[]*github.com/nooncall/shazam/mysql.Field len: 3, cap: 3, [
*{
Data: github.com/nooncall/shazam/mysql.FieldData len: 48, cap: 48, [3,100,101,102,4,116,101,115,116,4,98,111,111,107,4,98,111,111,107,7,112,117,98,108,105,115,104,7,112,117,98,108,105,115,104,12,33,0,96,0,0,0,253,0,0,0,0,0],
Schema: []uint8 len: 4, cap: 43, [116,101,115,116],
Table: []uint8 len: 4, cap: 38, [98,111,111,107],
OrgTable: []uint8 len: 4, cap: 33, [98,111,111,107],
Name: []uint8 len: 7, cap: 28, [112,117,98,108,105,115,104],
OrgName: []uint8 len: 7, cap: 20, [112,117,98,108,105,115,104],
Charset: 33,
ColumnLength: 96,
Type: 253,
Flag: 0,
Decimal: 0,
DefaultValueLength: 0,
DefaultValue: []uint8 len: 0, cap: 0, nil,},
*{
Data: github.com/nooncall/shazam/mysql.FieldData len: 48, cap: 48, [3,100,101,102,4,116,101,115,116,4,98,111,111,107,4,98,111,111,107,7,97,100,100,114,101,115,115,7,97,100,100,114,101,115,115,12,33,0,96,0,0,0,253,0,0,0,0,0],
Schema: []uint8 len: 4, cap: 43, [116,101,115,116],
Table: []uint8 len: 4, cap: 38, [98,111,111,107],
OrgTable: []uint8 len: 4, cap: 33, [98,111,111,107],
Name: []uint8 len: 7, cap: 28, [97,100,100,114,101,115,115],
OrgName: []uint8 len: 7, cap: 20, [97,100,100,114,101,115,115],
Charset: 33,
ColumnLength: 96,
Type: 253,
Flag: 0,
Decimal: 0,
DefaultValueLength: 0,
DefaultValue: []uint8 len: 0, cap: 0, nil,},
*{
Data: github.com/nooncall/shazam/mysql.FieldData len: 44, cap: 44, [3,100,101,102,4,116,101,115,116,4,98,111,111,107,4,98,111,111,107,5,112,104,111,110,101,5,112,104,111,110,101,12,33,0,96,0,0,0,253,0,0,0,0,0],
Schema: []uint8 len: 4, cap: 39, [116,101,115,116],
Table: []uint8 len: 4, cap: 34, [98,111,111,107],
OrgTable: []uint8 len: 4, cap: 29, [98,111,111,107],
Name: []uint8 len: 5, cap: 24, [112,104,111,110,101],
OrgName: []uint8 len: 5, cap: 18, [112,104,111,110,101],
Charset: 33,
ColumnLength: 96,
Type: 253,
Flag: 0,
Decimal: 0,
DefaultValueLength: 0,
DefaultValue: []uint8 len: 0, cap: 0, nil,},
]
足够了