• 关于 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,},
    ]
    

    足够了

  • 相关阅读:
    2018-2019-1 20175330 《信息安全系统设计基础》第四周学习总结
    2019-2020-1 20175330 《信息安全系统设计基础》第三周学习总结
    《程序设计与数据结构》实验一报告
    《程序设计与数据结构》第四周学习总结
    学号 20172326 《程序设计与数据结构》第三周学习总结
    《程序设计与数据结构》第二周学习总结
    《JAVA软件结构与数据结构》第一周学习总结
    《程序设计与数据结构》(上)课程总结
    2017-2018-2 《程序设计与数据结构》实验五报告
    《程序设计与数据结构》实验四报告
  • 原文地址:https://www.cnblogs.com/liuzhuan23/p/13323416.html
Copyright © 2020-2023  润新知