No.6 - 時序數(shù)據(jù)庫隨筆 - InfluxDB&Flux調(diào)試環(huán)境搭建
“ 本篇為大家介紹了InfluxDB和Flux的開發(fā)調(diào)試環(huán)境,便于后續(xù)對上一篇提到的用戶問題進行解決的操作演示。”
01
—
上篇回顧

這是上一篇結尾我們拋出來的InfluxDB社區(qū)問題,那么要想解決這個問題,我們首先先建立InfluxDB的開發(fā)環(huán)境,以源碼的方式了解其應用和實現(xiàn)。所以本篇我們?yōu)榇罱ń榻BInflxuDB的開發(fā)調(diào)試環(huán)境。
02
—
依賴安裝
要想進行InfluxDB的開發(fā)調(diào)試,我們需要一些基礎軟件安裝(MacOS),如下:
brew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"go
brew install go@1.15......flux git:(master) ? go versiongo version go1.15.9 darwin/am
git
brew install gitgit:(master) ? git --versiongit version 2.30.2
bazaar
brew install bazaargit:(master) ? bzr versionBazaar (bzr) 2.7.0
rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shmake pkg-config protobuf yarn
brew install make pkg-config protobuf yarngit:(master) ? make --versionGNU Make 4.3......
如果上面一切順利,我們設置一下環(huán)境變量 ~/.bash_profile :
export GOPATH=/Users/jincheng/goexport GOROOT=/usr/local/opt/[email protected]/libexecexport PKG_CONFIG=/Users/jincheng/go/bin/pkg-configexport PKG_CONFIG_PATH=$(find /usr/local/Cellar -name 'pkgconfig' -type d | grep lib/pkgconfig | tr '\n' ':' | sed s/.$//)export PATH=$GOROOT/bin:$GOPATH/bin:$PKG_CONFIG_PATH:$PATH
別忘記 source ~/.bash_profile, 我們進入正題,下載源碼。
03
—
源碼構建
很多時候我們對一項功能的了解,需要對源碼有一定的了解,學習InfluxDB我們同樣需要源碼方式進行。
下載
git clone https://github.com/influxdata/influxdb.git編譯
make......make[2]: Leaving directory '/Users/jincheng/work/influxdb/storage/flux'make[1]: Leaving directory '/Users/jincheng/work/influxdb/storage'env GO111MODULE=on go build -tags 'assets' -ldflags "-s -w -X main.commit=eeba0f3268" -o bin/darwin/influx ./cmd/influxenv GO111MODULE=on go build -tags 'assets' -ldflags " -X main.commit=eeba0f3268" -o bin/darwin/influxd ./cmd/influxd
如上我們發(fā)現(xiàn)會生成兩個二進制文件,一個是influxd服務,一個是influx的客戶端。
下載依賴
go clean -modcache && go mod tidy && go mod vendor執(zhí)行完如上命令會在項目目錄下生成一個vendor目錄,里面下載了go.mod里面配置的項目所有依賴。
04
—
GoLand運行調(diào)試
GoLand是進行Go開發(fā)調(diào)試的IDE工具,我們后面關于InfluxDB源碼部分分享就在GoLand環(huán)境中進行。
IDE配置
在GoLand中進行InfluxDB的開發(fā)調(diào)試,需要簡單的配置一下,GOROOT/GOPATH/Go Modules ,如圖:

其中GOROOT/GOPATH和~/.bash_profile保持一致。
運行主服務
運行 influxd/main.go ,出現(xiàn)如下界面證明已經(jīng)influxd的服務已經(jīng)啟動成功,并在8086端口監(jiān)聽。

如果一切順利,那么服務監(jiān)聽在8086端口。
調(diào)試主服務
我們?nèi)绻纯丛创a的執(zhí)行路徑,往往我們期望debug的方式運行 influxd/main.go ,如果出現(xiàn)debug啟動出現(xiàn)如下錯誤,說明我們的環(huán)境變量沒有在IDE中生效:

如上情況我們可以創(chuàng)建或者在~/.zshrc中增加一行配置讓 ~/.bash_profile配置生效。
source ~/.bash_profile然后重啟電腦,再試一下。如果順利,我們設置一下斷點,可以類似界面如下:

如果一切順利,那么調(diào)試模式下的服務也是監(jiān)聽8086端口。
05
—
操作測試
好的,服務啟動了,下面我們利用客戶端繼續(xù)數(shù)據(jù)操作的測試。上面編譯的時候大家發(fā)現(xiàn)其實我們會生成2個二進制可執(zhí)行文件,一個是influxd,一個是influx。我們剛才debug啟動了influxd的服務,我們同樣可以啟動influx的客戶端,進行數(shù)據(jù)操作,客戶端我們之間運行可執(zhí)行文件(如果你愿意也可以IDE啟動)。
初始化
:upper:]' '[:lower:]')/influx setup \--username iot \--password 2021iotdb \--org org \--bucket iot \--retention 1h \--token where-were-going-we-dont-need-roads \--forceConfig default has been stored in /Users/jincheng/.influxdbv2/configs.User Organization Bucketiot org iot
如上執(zhí)行成功表明我們完成了setup,創(chuàng)建了名為 iot 的bucket,在v2中bucket相當于v1中的database。
插入數(shù)據(jù)
bin/$(uname -s | tr '[:upper:]' '[:lower:]')/influx write --bucket iot --precision s "m v=2 $(date +%s)"bin/$(uname -s | tr '[:upper:]' '[:lower:]')/influx write --bucket iot --precision s "m v=168 $(date +%s)"bin/$(uname -s | tr '[:upper:]' '[:lower:]')/influx write --bucket iot --precision s "n v=222 $(date +%s)"
如上我們插入了3條數(shù)據(jù),接下來我們查詢一下。
查詢數(shù)據(jù)
bin/$(uname -s | tr '[:upper:]' '[:lower:]')/influx query 'from(bucket:"iot") |> range(start:-1h)'
執(zhí)行之后,我們會查詢到剛才插入的數(shù)據(jù),同時IDE中調(diào)試模式啟動的influxd服務也會打印相應的日志信息。
上面是簡單查詢記錄,下面我們在進行一下聚合計算:
bin/$(uname -s | tr '[:upper:]' '[:lower:]')/influx query 'from(bucket:"iot") |> range(start:-1h) |> sum()'
到此,我們InfluxDB的調(diào)試模式啟動服務,客戶端創(chuàng)建bucket,插入數(shù)據(jù)和查詢數(shù)據(jù)就有了一個直觀的印象。
06
—
Flux查詢語言
上面我利用influx客戶端進行query命令,其實執(zhí)行的是Flux的查詢語言,F(xiàn)lux是influxDB社區(qū)提供的新的查詢語言,那么Flux是否可以在IDE中進行運行和調(diào)試呢?當然!我們對Flux的開發(fā)調(diào)試環(huán)境搭建一下,并且對查詢操作進行演示。
下載&編譯
git clone https://github.com/influxdata/flux.git...make...go clean -modcache && go mod tidy && go mod vendor
GoLand 運行
我們需要配置flux的命令,為 repl,然后運行,如下:

啟動repl之后,我們可以進行數(shù)據(jù)處理操作,如下圖:

查詢數(shù)據(jù)
Flux可以直接和InfluxDB服務連接,進行數(shù)據(jù)查詢,上面我們在influx客戶端輸入的查詢語句其實就是Flux查詢語言,那么我們當然可以在Flux中進行數(shù)據(jù)查詢,我們啟動Flux repl,進行查詢?nèi)缦拢喝缦拢?/p>import "influxdata/influxdb"data = influxdb.from(bucket:"iot") |> range(start:-1h) |> sum()data |> yield()

如圖,發(fā)生了錯誤,原因是Flux去嘗試連接influxdb的9999端口服務,不過我們上面看到我們的服務是監(jiān)聽8086了,所以我們要修改一下默認端口(這就是源碼debug的好處了)。

修改端口之后,我們發(fā)現(xiàn)連接已經(jīng)建立,但是權限還有問題,如下:

這個就需要我們連接的Token信息,如下:
cat ~/.influxdbv2/configs 
我們讀取數(shù)據(jù)時候攜帶token和org信息,如下:
import "influxdata/influxdb"data = influxdb.from(bucket:"iot", token:"where-were-going-we-dont-need-roads", org:"org") |> range(start:-1h) |> sum()data |> yield()

好,到這里我們Flux讀取InfluxDB數(shù)據(jù)部分也有了一個直觀的了解。
07
—
InfluxDB&Flux社區(qū)貢獻
目前看InflxdbV2版本的貢獻者并不多,我在源碼構建的時候發(fā)現(xiàn)的這些默認端口問題都是influx社區(qū)待改進的patch,我也提交了相關的PRs。
For InfluxDB: https://github.com/influxdata/influxdb/pull/20809
For Flux: https://github.com/influxdata/flux/pull/3514
BTW:如何貢獻社區(qū)?見到問題就解決,不以善小而不為!祝你好運!
阿里招聘
時序數(shù)據(jù)庫開發(fā)崗位
(P7/P8/P9)
(長期有效)
職位描述:
1. 精通Java/Scala編程
2. 精通常用數(shù)據(jù)結構和算法應用,具備良好的、精益求精的設計思維,每一個bit都是客戶/技術價值。
3. 了解Hadoop/Flink/Spark等計算框架和熟悉HBase/LevelDB/RocksDB等主流NoSQL數(shù)據(jù)庫,深入理解其實現(xiàn)原理和架構優(yōu)勢劣勢;
4. 具備分布式系統(tǒng)的設計和應用的經(jīng)歷,能對分布式常用技術進行應用和改進者優(yōu)先;
5. 有開源社區(qū)貢獻,并成為Flink/Spark/Druid/OpenTSDB/InfluxDB/IoTDB等社區(qū)的Committer/PMC者優(yōu)先;
6. 要具備良好的團隊協(xié)作能力,良好的溝通表達能力,和對正確事情持之以恒的韌性和耐力。
來!讓我看到你的簡歷,因為成就你的不僅僅是能力,更是雷厲風行的執(zhí)行力!
