InfluxDB服务器启动流程

操作系统 : CentOS7.3.1611_x64

go语言版本:1.8.3 linux/amd64

InfluxDB版本:1.1.0

源码路径: github.com/influxdata/influxdb/cmd/influxd

程序入口(main.go):

1func main() { 2 rand.Seed(time.Now().UnixNano()) 3 4 m := NewMain() 5 if err := m.Run(os.Args[1:]...); err != nil { 6 fmt.Fprintln(os.Stderr, err) 7 os.Exit(1) 8 } 9}

在main函数中,调用Main.Run函数。

命令行参数为空或"run"

如命令行参数为空或"run",则执行如下流程:

1 1 case "", "run": 2 2 cmd := run.NewCommand() 3 3 4 4 // Tell the server the build details. 5 5 cmd.Version = version 6 6 cmd.Commit = commit 7 7 cmd.Branch = branch 8 8 9 9 if err := cmd.Run(args...); err != nil { 1010 return fmt.Errorf("run: %s", err) 1111 } 1212 1313 signalCh := make(chan os.Signal, 1) 1414 signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM) 1515 m.Logger.Println("Listening for signals") 1616 1717 // Block until one of the signals above is received 1818 select { 1919 case <-signalCh: 2020 m.Logger.Println("Signal received, initializing clean shutdown...") 2121 go func() { 2222 cmd.Close() 2323 }() 2424 } 2525 2626 // Block again until another signal is received, a shutdown timeout elapses, 2727 // or the Command is gracefully closed 2828 m.Logger.Println("Waiting for clean shutdown...") 2929 select { 3030 case <-signalCh: 3131 m.Logger.Println("second signal received, initializing hard shutdown") 3232 case <-time.After(time.Second * 30): 3333 m.Logger.Println("time limit reached, initializing hard shutdown") 3434 case <-cmd.Closed: 3535 m.Logger.Println("server shutdown completed") 3636 } 3737 3838 // goodbye.

执行 Command.Run 函数,后面跟的代码是处理系统信号的相关内容。

Command.Run函数内容如下:

1 1 func (cmd *Command) Run(args ...string) error { 2 2 // Parse the command line flags. 3 3 options, err := cmd.ParseFlags(args...) 4 4 if err != nil { 5 5 return err 6 6 } 7 7 8 8 // Print sweet InfluxDB logo. 9 9 fmt.Print(logo) 1010 1111 // Configure default logging. 1212 log.SetPrefix("[run] ") 1313 log.SetFlags(log.LstdFlags) 1414 1515 // Set parallelism. 1616 runtime.GOMAXPROCS(runtime.NumCPU()) 1717 1818 // Mark start-up in log. 1919 log.Printf("InfluxDB starting, version %s, branch %s, commit %s", 2020 cmd.Version, cmd.Branch, cmd.Commit) 2121 log.Printf("Go version %s, GOMAXPROCS set to %d", runtime.Version(), runtime.GOMAXPROCS(0)) 2222 2323 // Write the PID file. 2424 if err := cmd.writePIDFile(options.PIDFile); err != nil { 2525 return fmt.Errorf("write pid file: %s", err) 2626 } 2727 2828 // Parse config 2929 config, err := cmd.ParseConfig(options.GetConfigPath()) 3030 if err != nil { 3131 return fmt.Errorf("parse config: %s", err) 3232 } 3333 3434 // Apply any environment variables on top of the parsed config 3535 if err := config.ApplyEnvOverrides(); err != nil { 3636 return fmt.Errorf("apply env config: %v", err) 3737 } 3838 3939 // Validate the configuration. 4040 if err := config.Validate(); err != nil { 4141 return fmt.Errorf("%s. To generate a valid configuration file run `influxd config > influxdb.generated.conf`", err) 4242 } 4343 4444 if config.HTTPD.PprofEnabled { 4545 // Turn on block profiling to debug stuck databases 4646 runtime.SetBlockProfileRate(int(1 * time.Second)) 4747 } 4848 4949 // Create server from config and start it. 5050 buildInfo := &BuildInfo{ 5151 Version: cmd.Version, 5252 Commit: cmd.Commit, 5353 Branch: cmd.Branch, 5454 Time: cmd.BuildTime, 5555 } 5656 s, err := NewServer(config, buildInfo) 5757 if err != nil { 5858 return fmt.Errorf("create server: %s", err) 5959 } 6060 s.CPUProfile = options.CPUProfile 6161 s.MemProfile = options.MemProfile 6262 if err := s.Open(); err != nil { 6363 return fmt.Errorf("open server: %s", err) 6464 } 6565 cmd.Server = s 6666 6767 // Begin monitoring the server's error channel. 6868 go cmd.monitorServerErrors() 6969 7070 return nil 7171 }

解释如下:

1、解析命令行参数并放入options变量中

2、打印InfluxDB字符串logo

3、设置日志前缀

4、设置程序最大使用cpu的数量

默认使用服务器上的所有cpu,最坏情况下会导致cpu占用100%的场景出现。

5、添加启动日志

6、记录pid文件

该功能需要在命令行参数中指定pid文件路径才可以。

7、加载配置文件

解析并校验配置文件,如果没有问题则配置文件生效。

8、设置profile信息并启动服务器

9、启动各项服务

执行Server.Open函数(run/server.go)启动各项服务,具体内容可以在Server.Open函数中查看。

10、执行monitorServerErrors用于监控服务器出错情况

命令行参数为"backup"

如果命令行参数为"backup",则执行如下流程:

11 case "backup": 22 name := backup.NewCommand() 33 if err := name.Run(args...); err != nil { 44 return fmt.Errorf("backup: %s", err) 55 }

数据备份流程。

命令行参数为"restore"

如果命令行参数为"restore",则执行如下流程:

1case "restore": 2 name := restore.NewCommand() 3 if err := name.Run(args...); err != nil { 4 return fmt.Errorf("restore: %s", err) 5 }

数据恢复流程。

命令行参数为"config"

如果命令行参数为"config",则执行如下流程:

1case "config": 2 if err := run.NewPrintConfigCommand().Run(args...); err != nil { 3 return fmt.Errorf("config: %s", err) 4 }

输出默认的配置信息。

命令行参数为"help"

如果命令行参数为"help",则执行如下流程:

1case "help": 2 if err := help.NewCommand().Run(args...); err != nil { 3 return fmt.Errorf("help: %s", err) 4 }

输出帮助信息。

好,就这些了,希望对你有帮助。

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2018/20180105_InfluxDB服务器启动流程.rst

欢迎补充

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )