欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

go开源项目influxdb-relay源码分析(一)

程序员文章站 2023-01-10 19:06:57
influxdb-relay项目地址: https://github.com/influxdata/influxdb-relay,主要作为负载均衡节点,写入多个influxdb节点,起到高可用效果。 不多说,开搞~ 1、main.go 2、配置文件 relay.toml 总结: 1、加载配置文件 r ......

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多个节点。