InfluxDB伺服器啟動流程

来源:https://www.cnblogs.com/MikeZhang/archive/2018/01/05/InfluxDBStartup20180105.html
-Advertisement-
Play Games

操作系統 : CentOS7.3.1611_x64 go語言版本:1.8.3 linux/amd64 InfluxDB版本:1.1.0 源碼路徑: github.com/influxdata/influxdb/cmd/influxd 程式入口(main.go): 在main函數中,調用Main.Ru ...


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

歡迎補充


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先,不要誤解,我這裡的計算器是指硬體的計算器,至於純軟體的計算程式,乃至有高級功能的,比如可以求解方程甚至可編程之類,我以後找個時間來說說。這兩天看到有人在博問里問類似的問題,原問是想設計一個有著數位管、有著4x4鍵盤的硬體里的程式,不知道他具體想做什麼,只是給了一些建議。聯想到還有計算器這個東西 ...
  • 前言 上次安裝了Sonarqube英文版使用起來不方便,這次為Sonarqube安裝中文插件。 前期準備: 軟體下載: https://github.com/SonarQubeCommunity/sonar-l10n-zh 安裝插件: 1.下載插件jar文件 2.將jar文件複製到Sonarqube ...
  • 第1章 資料庫管理系統 1.1 前言 01.數據的定義:文字、圖像、地理位置信息(坐標、經緯度)等 02.資料庫管理系統的定義:建立、存取和管理數據,保證數據安全和完整性的軟體 03.常見的資料庫管理系統: 關係型:MySQL、Oracle、SQL Server、Db2等 非關係型:MongoDB、 ...
  • 1,下載curl url命令傳輸工具 2,配置curl環境變數 3,在cmd環境中使用 舉例:curl -G http://xxxxxxx.com?+參數 使用:curl -G "www.baidu.com" 使用:curl -G "www.baidu.com" 最原始的批量通訊返回 可以將通訊命令 ...
  • 一、supervisor是什麼 Linux的後臺進程運行有好幾種方法,例如nohup,screen等,但是,如果是一個服務程式,要可靠地在後臺運行,我們就需要把它做成daemon,最好還能監控進程狀態,在意外結束時能自動重啟。 supervisor就是用Python開發的一套通用的進程管理程式,能將 ...
  • VirtualBox安裝CentOS後,再安裝增強功能就可以共用文件夾、粘貼板以及滑鼠無縫移動,主要步驟如下: 1、yum -y update 2、yum -y install g++ gcc gcc-c++ make kernel-* # 主要是在安裝增強工具提示沒有安裝這些軟體 3、yum -y ...
  • 獲取表結構的一些簡要信息,可以生成自己需要的字典,簡單又實用! 以數據表PP_MO為例: ...
  • 學習目標 -理解分層查詢概念 -創建樹形組織報告 -格式化分層數據 -樹形組織排除分支 分層查詢 語法 SELECT [LEVEL],<column>,exper ... FROM <table_name> [WHERE condition(s)] START WITH condition(s) C ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...