zoukankan      html  css  js  c++  java
  • go开源项目influxdb-relay源码分析(一)

    influxdb-relay项目地址: https://github.com/influxdata/influxdb-relay,主要作为负载均衡节点,写入多个influxdb节点,起到高可用效果。

    不多说,开搞~

    1、main.go

     1 package main
     2 
     3 import (
     4     "flag"
     5     "fmt"
     6     "log"
     7     "os"
     8     "os/signal"
     9 
    10     "github.com/influxdata/influxdb-relay/relay"
    11 )
    12 
    13 var (
    14     //influxdb-realy启动时接收的配置文件参数,因为是falg.String所以接收的是一个字符串类型的参数
    15     //flag.String 函数第一个参数代表启动时参数的名称,第二个参数代表默认值,第三个参数代表用途描述,此方法返回一个指针
    16     //那么启动realy时应该是这个样子的: ./influxdb-relay  -config  relay.toml  ———— "-config" 就是匹配上面flag.String函数第一个参数, "relay.toml" 是-config的值,这里代表配置文件的路径
    17     configFile = flag.String("config", "", "Configuration file to use")
    18 )
    19 
    20 func main() {
    21     //flag.Parse是用来解析启动时传入的参数,必须调用
    22     flag.Parse()
    23 
    24     //如果启动参数,配置文件路径为空
    25     if *configFile == "" {
    26         //记录日志
    27         fmt.Fprintln(os.Stderr, "Missing configuration file")
    28         //打印需要的参数提示,也就是会输出上面flag.String函数第三个参数
    29         flag.PrintDefaults()
    30         //退出
    31         os.Exit(1)
    32     }
    33     //加载配置文件
    34     cfg, err := relay.LoadConfigFile(*configFile)
    35     //LoadConfigFile方法如下: 主要做的事情是把配置文件反序列化成一个Config对象然后return,也就是cfg
    36     // func LoadConfigFile(filename string) (cfg Config, err error) {
    37     //    f, err := os.Open(filename)
    38     //    if err != nil {
    39     //        return cfg, err
    40     //    }
    41     //    defer f.Close()
    42     //    return cfg, toml.NewDecoder(f).Decode(&cfg)
    43     // }
    44     if err != nil {
    45         fmt.Fprintln(os.Stderr, "Problem loading config file:", err)
    46     }
    47     //根据Config对象 创建relay组件
    48     r, err := relay.New(cfg)
    49     if err != nil {
    50         log.Fatal(err)
    51     }
    52     //定义接收操作系统信号的channel
    53     sigChan := make(chan os.Signal, 1)
    54     //notify用于监听信号,如果操作系统向当前进程发送中断信号(os.Interrupt 表示中断信号)
    55     signal.Notify(sigChan, os.Interrupt)
    56     //如果接收到中断信号,开一个协程调用relay的Stop方法 停止http监听
    57     go func() {
    58         <-sigChan
    59         r.Stop()
    60     }()
    61 
    62     log.Println("starting relays...")
    63     //relay 运行
    64     r.Run()
    65 }

    2、配置文件 relay.toml

     1 [[http]]
     2 name = "example-http"
     3 bind-addr = "127.0.0.1:9096"
     4 output = [
     5     { name="influxdb-1", location = "http://127.0.0.1:8086/write" },
     6     { name="influxdb-2", location = "http://127.0.0.1:7086/write" },
     7 ]
     8 
     9 [[udp]]
    10 name = "example-udp"
    11 bind-addr = "127.0.0.1:19096"
    12 read-buffer = 0 # default
    13 output = [
    14     { name="influxdb-1", location="127.0.0.1:8089", mtu=512 },
    15     { name="influxdb-2", location="127.0.0.1:7089", mtu=1024 },
    16 ]

    总结:

    1、加载配置文件 relay.toml

    2、根据配置文件创建relay,启动监听端口,接收请求

    3、把接收到的请求写入到influxdb1-2节点

    后面再研究下核心模块relay怎么把接收到的数据同时写入,influxdb多个节点。

  • 相关阅读:
    数据压缩算法---LZ77算法 的分析与实现
    数据压缩算法---霍夫曼编码的分析与实现
    数据压缩的重要组成部分---位操作
    排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)
    广度优先(bfs)和深度优先搜索(dfs)的应用实例
    数据结构 图的定义和搜索方法(清晰图解)
    数据结构-堆 接口定义与实现分析(详细注释与图解)
    数据结构-堆的定义描述
    数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)
    SQLServer常用快捷键汇总
  • 原文地址:https://www.cnblogs.com/chenru1988/p/9681246.html
Copyright © 2011-2022 走看看