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",則執行如下流程:
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, 1)
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 * 30):
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(0))
// 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(1 * 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",則執行如下流程:
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) }
輸出協助資訊。
好,就這些了,希望對你有協助。