操作系统 : 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",则执行如下流程:
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",则执行如下流程:
1 case "backup":
2 name := backup.NewCommand()
3 if err := name.Run(args...); err != nil {
4 return fmt.Errorf("backup: %s", err)
5 }
数据备份流程。
如果命令行参数为"restore",则执行如下流程:
case "restore":
name := restore.NewCommand()
if err := name.Run(args...); err != nil {
return fmt.Errorf("restore: %s", err)
}
数据恢复流程。
如果命令行参数为"config",则执行如下流程:
case "config":
if err := run.NewPrintConfigCommand().Run(args...); err != nil {
return fmt.Errorf("config: %s", err)
}
输出默认的配置信息。
如果命令行参数为"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
欢迎补充
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.
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 }
如果命令行参数为"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",则执行如下流程:
case "restore":
name := restore.NewCommand()
if err := name.Run(args...); err != nil {
return fmt.Errorf("restore: %s", err)
}
数据恢复流程。
如果命令行参数为"config",则执行如下流程:
case "config":
if err := run.NewPrintConfigCommand().Run(args...); err != nil {
return fmt.Errorf("config: %s", err)
}
输出默认的配置信息。
如果命令行参数为"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
欢迎补充
case "restore": name := restore.NewCommand() if err := name.Run(args...); err != nil { return fmt.Errorf("restore: %s", err) }
如果命令行参数为"config",则执行如下流程:
case "config": if err := run.NewPrintConfigCommand().Run(args...); err != nil { return fmt.Errorf("config: %s", err) }
输出默认的配置信息。
如果命令行参数为"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
欢迎补充
case "help": if err := help.NewCommand().Run(args...); err != nil { return fmt.Errorf("help: %s", err) }