zoukankan      html  css  js  c++  java
  • 关于 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,},
    ]
    

    足够了

  • 相关阅读:
    ZeptoLab Code Rush 2015
    UVa 10048 Audiophobia【Floyd】
    POJ 1847 Tram【Floyd】
    UVa 247 Calling Circles【传递闭包】
    UVa 1395 Slim Span【最小生成树】
    HDU 4006 The kth great number【优先队列】
    UVa 674 Coin Change【记忆化搜索】
    UVa 10285 Longest Run on a Snowboard【记忆化搜索】
    【NOIP2016提高A组模拟9.28】求导
    【NOIP2012模拟10.9】电费结算
  • 原文地址:https://www.cnblogs.com/liuzhuan23/p/13323416.html
Copyright © 2011-2022 走看看