zoukankan      html  css  js  c++  java
  • InfluxDB服务器启动流程

    操作系统 : 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

    欢迎补充

  • 相关阅读:
    linux-文件
    字符串函数
    函数
    内存管理
    静态库、动态库文件制作
    Makefile 待完善
    指针
    开发板GEC6816环境搭建,使用VS code
    C语言数组
    连接开发板下载程序
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/InfluxDBStartup20180105.html
Copyright © 2011-2022 走看看