操作系统 : 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[:]...); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit()
}
}

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

命令行参数为空或"run"

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

 case "", "run":
cmd := run.NewCommand() // Tell the server the build details.
cmd.Version = version
cmd.Commit = commit
cmd.Branch = branch if err := cmd.Run(args...); err != nil {
return fmt.Errorf("run: %s", err)
} signalCh := make(chan os.Signal, )
signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
m.Logger.Println("Listening for signals") // Block until one of the signals above is received
select {
case <-signalCh:
m.Logger.Println("Signal received, initializing clean shutdown...")
go func() {
cmd.Close()
}()
} // Block again until another signal is received, a shutdown timeout elapses,
// or the Command is gracefully closed
m.Logger.Println("Waiting for clean shutdown...")
select {
case <-signalCh:
m.Logger.Println("second signal received, initializing hard shutdown")
case <-time.After(time.Second * ):
m.Logger.Println("time limit reached, initializing hard shutdown")
case <-cmd.Closed:
m.Logger.Println("server shutdown completed")
} // goodbye.

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

Command.Run函数内容如下:

 func (cmd *Command) Run(args ...string) error {
// Parse the command line flags.
options, err := cmd.ParseFlags(args...)
if err != nil {
return err
} // Print sweet InfluxDB logo.
fmt.Print(logo) // Configure default logging.
log.SetPrefix("[run] ")
log.SetFlags(log.LstdFlags) // Set parallelism.
runtime.GOMAXPROCS(runtime.NumCPU()) // Mark start-up in log.
log.Printf("InfluxDB starting, version %s, branch %s, commit %s",
cmd.Version, cmd.Branch, cmd.Commit)
log.Printf("Go version %s, GOMAXPROCS set to %d", runtime.Version(), runtime.GOMAXPROCS()) // Write the PID file.
if err := cmd.writePIDFile(options.PIDFile); err != nil {
return fmt.Errorf("write pid file: %s", err)
} // Parse config
config, err := cmd.ParseConfig(options.GetConfigPath())
if err != nil {
return fmt.Errorf("parse config: %s", err)
} // Apply any environment variables on top of the parsed config
if err := config.ApplyEnvOverrides(); err != nil {
return fmt.Errorf("apply env config: %v", err)
} // Validate the configuration.
if err := config.Validate(); err != nil {
return fmt.Errorf("%s. To generate a valid configuration file run `influxd config > influxdb.generated.conf`", err)
} if config.HTTPD.PprofEnabled {
// Turn on block profiling to debug stuck databases
runtime.SetBlockProfileRate(int( * time.Second))
} // Create server from config and start it.
buildInfo := &BuildInfo{
Version: cmd.Version,
Commit: cmd.Commit,
Branch: cmd.Branch,
Time: cmd.BuildTime,
}
s, err := NewServer(config, buildInfo)
if err != nil {
return fmt.Errorf("create server: %s", err)
}
s.CPUProfile = options.CPUProfile
s.MemProfile = options.MemProfile
if err := s.Open(); err != nil {
return fmt.Errorf("open server: %s", err)
}
cmd.Server = s // Begin monitoring the server's error channel.
go cmd.monitorServerErrors() return nil
}

解释如下:

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

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

数据备份流程。

命令行参数为"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

欢迎补充

InfluxDB服务器启动流程的更多相关文章

  1. shell脚本编程学习笔记(二)linux服务器启动流程

    一.linux服务器启动流程 1.bios找到磁盘上的mbr主引导扇区 2.进入grub洁面选择相应的启动内核 3.读取kernel内核文件-/boot/vmlinuz-* 4.读取init的镜像文件 ...

  2. Netty 拆包粘包和服务启动流程分析

    Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你能掌握EventLoopGroup的工作流程,ServerBootstrap的启动流程,ChannelPipeline是如何操作管理Ch ...

  3. 【转】Netty 拆包粘包和服务启动流程分析

    原文:https://www.cnblogs.com/itdragon/archive/2018/01/29/8365694.html Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你 ...

  4. Spring Boot启动流程详解(一)

    环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-starter-web. 配置完成后,编写了代码如下: @SpringBootApplication public ...

  5. broadcom代码中httpd进程启动流程介绍

    Broadcom代码中包含WEB配置管理媒介, 在嵌入式WEB服务器min_httpd基础上改造实现, 其bin名称为httpd,此httpd可以由管理进程有连接后动态启动,并且当一段时间内没有连接到 ...

  6. Linux 的启动流程(转)

    原文链接:http://blog.jobbole.com/46078/ 半年前,我写了<计算机是如何启动的?>,探讨BIOS和主引导记录的作用. 那篇文章不涉及操作系统,只与主板的板载程序 ...

  7. Linux启动流程详解

    在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...

  8. centos启动流程[转]

    启动流程概览 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 资讯: init 运行 /etc/rc.d/rc.sysinit 文件来准备软件运行 ...

  9. 【转】linux-系统启动流程详解

    第二十章.启动流程.模块管理与 Loader 最近升级日期:2009/09/14 1. Linux 的启动流程分析 1.1 启动流程一览 1.2 BIOS, boot loader 与 kernel ...

随机推荐

  1. 转载:搭建完整的arm-linux-gcc等交叉编译环境(感谢CSDN博主的分享)

    安装环境 Linux版本:Ubuntu 12.04    内核版本:Linux 3.5.0   交叉编译器版本:arm-linux-gcc-4.4.3 这个版本的交叉编译器 安装前的絮叨 首先简单介绍 ...

  2. pyqt pyside QPushButton 图标(icon)大小自适应设置

    pyqt pyside QPushButton 图标(icon)大小自适应设置 img = QtGui.QImage(r'd:/test.png') pixmap = QtGui.QPixmap(im ...

  3. scrapy response.xpath可以提取包含字符XX的标签

    1. 筛选属性包含某字符串的标签(如id = 'bigbaong'   查询包含'big'字符的就可以筛选到) res = response.xpath("//a[contains(@id, ...

  4. continue — Skip to the next iteration of a loop in a shell script

    continue — Skip to the next iteration of a loop in a shell script

  5. scrapy 命令行

    关于命令详细使用 命令的使用范围 这里的命令分为全局的命令和项目的命令,全局的命令表示可以在任何地方使用,而项目的命令只能在项目目录下使用 全局的命令有:startprojectgenspiderse ...

  6. 在addroutes后,$router.options.routes没有更新的问题(手摸手,带你用vue撸后台 读后感)

    参照<着手摸手,带你用vue撸后台>一文,本人做了前端的权限判断 https://segmentfault.com/a/1190000009275424 首先就是在addroutes后,$ ...

  7. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  8. cf 443

    题目链接 A,对于每一位可以暴力输入,看输出是什么,然后就有2x2中对应方式,然后可以用3次运算搞了,好像网上在悬赏最多只用2次搞出来的. B,这个题可以先处理每个串内部的情况,再处理连接处的情况,代 ...

  9. bzoj1708:[Usaco2007 Oct]Money奶牛的硬币(完全背包

    1708: [Usaco2007 Oct]Money奶牛的硬币 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 797  Solved: 540[Submi ...

  10. svn提交后 添加注释

    svn 提交后添加注释 第一步: 第二步: 第三步:提交就可以了. 注意:如果svn服务器管理员没有激活pre-revprop-change这个hook,会出现 需要让svn服务器管理员没有激活pre ...