InfluxDB服务器启动流程

Stella981
• 阅读 775

操作系统 : CentOS7.3.1611_x64

go语言版本:1.8.3 linux/amd64

InfluxDB版本:1.1.0

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

程序入口(main.go):

func main() {
    rand.Seed(time.Now().UnixNano())

    m := NewMain()
    if err := m.Run(os.Args[1:]...); err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
}

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

命令行参数为空或"run"

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

 1 case "", "run":
 2     cmd := run.NewCommand()
 3 
 4     // Tell the server the build details.
 5     cmd.Version = version
 6     cmd.Commit = commit
 7     cmd.Branch = branch
 8 
 9     if err := cmd.Run(args...); err != nil {
10         return fmt.Errorf("run: %s", err)
11     }
12 
13     signalCh := make(chan os.Signal, 1)
14     signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
15     m.Logger.Println("Listening for signals")
16 
17     // Block until one of the signals above is received
18     select {
19     case <-signalCh:
20         m.Logger.Println("Signal received, initializing clean shutdown...")
21         go func() {
22             cmd.Close()
23         }()
24     }
25 
26     // Block again until another signal is received, a shutdown timeout elapses,
27     // or the Command is gracefully closed
28     m.Logger.Println("Waiting for clean shutdown...")
29     select {
30     case <-signalCh:
31         m.Logger.Println("second signal received, initializing hard shutdown")
32     case <-time.After(time.Second * 30):
33         m.Logger.Println("time limit reached, initializing hard shutdown")
34     case <-cmd.Closed:
35         m.Logger.Println("server shutdown completed")
36     }
37 
38     // goodbye.

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

Command.Run函数内容如下:

 1 func (cmd *Command) Run(args ...string) error {
 2     // Parse the command line flags.
 3     options, err := cmd.ParseFlags(args...)
 4     if err != nil {
 5         return err
 6     }
 7 
 8     // Print sweet InfluxDB logo.
 9     fmt.Print(logo)
10 
11     // Configure default logging.
12     log.SetPrefix("[run] ")
13     log.SetFlags(log.LstdFlags)
14 
15     // Set parallelism.
16     runtime.GOMAXPROCS(runtime.NumCPU())
17 
18     // Mark start-up in log.
19     log.Printf("InfluxDB starting, version %s, branch %s, commit %s",
20         cmd.Version, cmd.Branch, cmd.Commit)
21     log.Printf("Go version %s, GOMAXPROCS set to %d", runtime.Version(), runtime.GOMAXPROCS(0))
22 
23     // Write the PID file.
24     if err := cmd.writePIDFile(options.PIDFile); err != nil {
25         return fmt.Errorf("write pid file: %s", err)
26     }
27 
28     // Parse config
29     config, err := cmd.ParseConfig(options.GetConfigPath())
30     if err != nil {
31         return fmt.Errorf("parse config: %s", err)
32     }
33 
34     // Apply any environment variables on top of the parsed config
35     if err := config.ApplyEnvOverrides(); err != nil {
36         return fmt.Errorf("apply env config: %v", err)
37     }
38 
39     // Validate the configuration.
40     if err := config.Validate(); err != nil {
41         return fmt.Errorf("%s. To generate a valid configuration file run `influxd config > influxdb.generated.conf`", err)
42     }
43 
44     if config.HTTPD.PprofEnabled {
45         // Turn on block profiling to debug stuck databases
46         runtime.SetBlockProfileRate(int(1 * time.Second))
47     }
48 
49     // Create server from config and start it.
50     buildInfo := &BuildInfo{
51         Version: cmd.Version,
52         Commit:  cmd.Commit,
53         Branch:  cmd.Branch,
54         Time:    cmd.BuildTime,
55     }
56     s, err := NewServer(config, buildInfo)
57     if err != nil {
58         return fmt.Errorf("create server: %s", err)
59     }
60     s.CPUProfile = options.CPUProfile
61     s.MemProfile = options.MemProfile
62     if err := s.Open(); err != nil {
63         return fmt.Errorf("open server: %s", err)
64     }
65     cmd.Server = s
66 
67     // Begin monitoring the server's error channel.
68     go cmd.monitorServerErrors()
69 
70     return nil
71 }

解释如下:

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",则执行如下流程:

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

数据备份流程。

命令行参数为"restore"

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

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

数据恢复流程。

命令行参数为"config"

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

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

输出默认的配置信息。

命令行参数为"help"

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

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

输出帮助信息。

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

本文github地址:

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

欢迎补充

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这