项目地址

n9e-transfer-proxy

架构说明

image

  • 分析前端请求发现在使用m3db作为后端时需要下面4个接口
/*
下面对应都是transfer
- Request URL: http://127.0.0.1:8032/api/index/metrics 对应 QueryMetrics(recv dataobj.EndpointsRecv) *dataobj.MetricResp
- Request URL: http://127.0.0.1:8032/api/index/tagkv     对应 QueryTagPairs(recv dataobj.EndpointMetricRecv) []dataobj.IndexTagkvResp
- Request URL: http://127.0.0.1:8032/api/index/counter/fullmatch  对应 QueryIndexByFullTags(recv []dataobj.IndexByFullTagsRecv) ([]dataobj.IndexByFullTagsResp, int)
- Request URL: http://127.0.0.1:8032/api/transfer/data/ui  对应 QueryDataForUI(input dataobj.QueryDataForUI) []*dataobj.TsdbQueryResponse

*/
  • 所以proxy只需要实现上述4个接口的代理即可
  • 将原始请求并发打向后端所有transfer接口
  • 将数据merge后在返回前端
  • 在使用m3db作为存储时,有布隆过滤器顶在最前端,所以查询不存在该机房的数据所引发的资源开销不大
  • 优化点可以在proxy hold一个map,将请求的endpoint精细打向执行的机房
  • map的来源可以是长链接server端的数据

使用说明

编译 or 下载二进制
# 编译
export GOPROXY=https://goproxy.io,direct 
export GO111MODULE=on
go build src/main.go -o n9e-transfer-proxy
# 下载二进制
wget https://github.com/ning1875/n9e-transfer-proxy/releases/download/v1.0/n9e-transfer-proxy-1.0.linux-amd64.tar.gz
修改配置文件
  • 将所有分区transfer地址填入
启动proxy服务
n9e-transfer-proxy --config.file="n9e-transfer-proxy.yml"
修改n9e前端指向的nginx.conf
  • 将使用m3db作为后端时的/api/index /api/transfer指到proxy即可
upstream n9e.proxy {
    server proxy的地址如 localhost:9032;
    keepalive 60;
}

location /api/index {
    proxy_pass http://n9e.proxy;
}

location /api/transfer {
    proxy_pass http://n9e.proxy;
}
transfer的路由中还有些path没实现,但是看起来和前端请求无关,可以自行实现下
或者在修改nginx配置时精细化 比如只配置以下4条和前端相关的指向proxy,其余的还是指向transfer
/api/index/metrics          
/api/index/tagkv            
/api/index/counter/fullmatch
/api/transfer/data/ui    

upstream n9e.proxy {
    server proxy的地址如 localhost:9032;
    keepalive 60;
}

location /api/index/metrics {
    proxy_pass http://n9e.proxy;
}
location /api/index/tagkv  {
    proxy_pass http://n9e.proxy;
}
location /api/index/counter/fullmatch  {
    proxy_pass http://n9e.proxy;
}


location /api/transfer {
    proxy_pass http://n9e.proxy;
}
  • transfer v3的路由

func Config(r *gin.Engine) {
    sys := r.Group("/api/transfer")
    {
        sys.GET("/ping", ping)
        sys.GET("/pid", pid)
        sys.GET("/addr", addr)
        sys.POST("/stra", getStra)
        sys.POST("/which-tsdb", tsdbInstance)
        sys.POST("/which-judge", judgeInstance)
        sys.GET("/alive-judges", judges)

        sys.POST("/push", PushData)
        sys.POST("/data", QueryData)
        sys.POST("/data/ui", QueryDataForUI)
    }

    index := r.Group("/api/index")
    {
        index.POST("/metrics", GetMetrics)
        index.POST("/tagkv", GetTagPairs)
        index.POST("/counter/clude", GetIndexByClude)
        index.POST("/counter/fullmatch", GetIndexByFullTags)
    }

    pprof.Register(r, "/api/transfer/debug/pprof")
}

ning1875
167 声望67 粉丝

k8s/prometheus/cicd运维开发专家,想进阶的dy搜 小乙运维杂货铺