博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
InfluxDB服务器启动流程
阅读量:5819 次
发布时间:2019-06-18

本文共 4985 字,大约阅读时间需要 16 分钟。

操作系统 : 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 received18     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 closed28     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 config29     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 config35     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 databases46         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.CPUProfile61     s.MemProfile = options.MemProfile62     if err := s.Open(); err != nil {63         return fmt.Errorf("open server: %s", err)64     }65     cmd.Server = s66 67     // Begin monitoring the server's error channel.68     go cmd.monitorServerErrors()69 70     return nil71 }

解释如下:

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地址:

欢迎补充

转载地址:http://xlwdx.baihongyu.com/

你可能感兴趣的文章
Python 学习笔记 - 基本的安装,配置和输入输出
查看>>
myeclipse下原来好使的项目,tomcat启动找不到sessionFactory的bean的解决方法
查看>>
centOS7 安装 tomcat 并设置自动启动
查看>>
企业信息门户和工作协同
查看>>
Fabric private data入门实战
查看>>
Tomcat配置Basic认证方案(一)
查看>>
Hibernate 入门
查看>>
MRTG监测交换机端口流量图解(图文)_网络通讯_软件教程_脚本之家
查看>>
我有一个idea,但是没有钱,又没技术怎么办?
查看>>
benchmark性能测试工具
查看>>
redis安装及php扩展
查看>>
在Linux中批量创建和修改文件或目录
查看>>
道道道
查看>>
java的split分隔需要特殊转义收集
查看>>
js 限制输入字符的长度
查看>>
实例学习进程线程编程
查看>>
七种信号表明,你在浪费自己的才华
查看>>
SSH Secure Shell Client中文乱码的解决
查看>>
How the Blockchain is Redefining Trust
查看>>
Nginx 禁止IP访问
查看>>