01上一篇文章回顾这是我们在上一篇文章末尾提出的InfluxDB社区问题。为了解决这个问题,我们首先搭建InfluxDB的开发环境,以源码的形式了解它的应用和实现。所以在这篇文章中,我们将介绍InflxuDB的开发调试环境。02依赖安装为了开发和调试InfluxDB,我们需要安装一些基本的软件(MacOS),如下:brew/bin/bash-c"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"gobrewinstallgo@1.15......fluxgit:(master)?goversiongoversiongo1.15.9darwin/amgitbrewinstallgitgit:(master)?git--versiongitversion2.30.2bazaarbrewinstallbazaargit:(master)?bzr版本Bazaar(bzr)2.7.0rustcurl--proto'=https'--tlsv1.2-sSfhttps://sh.rustup.rs|shmakepkg-configprotobufyarnbrewinstallmakepkg-configprotobufyarngit:(master)?make--versionGNUMake4.3……如果一切顺利,我们来设置环境变量~/.bash_profile:exportGOPATH=/Users/jincheng/goexportGOROOT=/usr/local/opt/go@1.15/libexecexportPKG_CONFIG=/Users/jincheng/go/bin/pkg-configexportPKG_CONFIG_PATH=$(find/usr/local/Cellar-name'pkgconfig'-typed|greplib/pkgconfig|tr'\n'':'|seds/.$//)exportPATH=$GOROOT/bin:$GOPATH/bin:$PKG_CONFIG_PATH:$PATH别忘了source~/.bash_profile,进入正题,下载源码。03源码构建很多时候,我们需要对源码有一定的了解,才能理解一个功能。学习InfluxDB,我们还需要源码方法。下载gitclonehttps://github.com/influxdata/influxdb.git编译make……make[2]:Leavingdirectory'/Users/jincheng/work/influxdb/storage/flux'make[1]:离开目录'/Users/jincheng/work/influxdb/storage'envGO111MODULE=ongobuild-tags'assets'-ldflags"-s-w-Xmain.commit=eeba0f3268"-obin/darwin/influx./cmd/influxenvGO111MODULE=ongobuild-tags'assets'-ldflags"-Xmain.commit=eeba0f3268"-obin/darwin/influxd./cmd/influxd如上我们发现会生成两个二进制文件,一个是influxd服务,一个是influx的client。下载依赖goclean-modcache&&gomodtidy&&gomodvendor执行上述命令后,会在项目目录下生成一个vendor目录,下载go.mod中配置的项目所有依赖。04GoLand运行调试GoLand是一个用于Go开发调试的IDE工具。后面我们会在GoLand环境中分享InfluxDB的源码。IDE配置在GoLand中开发调试InfluxDB,需要一个简单的配置,GOROOT/GOPATH/GoModules,如图:GOROOT/GOPATH与~/.bash_profile一致。运行主服务,运行influxd/main.go,会出现如下界面,证明influxd服务已经启动成功,并且正在监听8086端口。如果一切顺利,那么该服务正在监听8086端口。调试主服务如果我们查看源代码的执行路径,我们通常期望在调试模式下运行influxd/main.go。如果debug启动时出现如下错误,说明我们的环境变量在IDE中还没有生效:以上情况,我们可以创建或者在~/.zshrc中添加一行配置,使~/.bash_profile配置生效。source~/.bash_profile然后重启电脑,再试一次。如果顺利的话,我们打个断点,界面可以类似下面这样:如果一切顺利,那么debug模式下的服务也在监听8086端口。05运行测试完成后,启动服务。接下来我们使用客户端继续进行数据操作测试。上面编译的时候大家发现我们其实会生成两个二进制可执行文件,一个是influxd,一个是influx。我们刚刚用debug启动了influxd服务,我们也可以启动influx客户端进行数据操作,客户端可以运行我们之间的可执行文件(如果需要也可以启动IDE)。初始化bin/$(uname-s|tr'[:upper:]''[:lower:]')/influxsetup\--usernameiot\--password2021iotdb\--orgorg\--bucketiot\--retention1h\--tokenwhere-were-going-we-dont-need-roads\--forceConfig默认已经存放在/Users/jincheng/.influxdbv2/configs.UserOrganizationBucketiotorgiot上面执行成功表示我们已经完成了设置,创建了一个名为iot的bucket。在v2中,桶相当于v1中的数据库。插入数据bin/$(uname-s|tr'[:upper:]''[:lower:]')/influxwrite--bucketiot--precisions"mv=2$(date+%s)"bin/$(uname-s|tr'[:upper:]''[:lower:]')/influxwrite--bucketiot--precisions"mv=168$(date+%s)"bin/$(uname-s|tr'[:upper:]''[:lower:]')/influxwrite--bucketiot--precisions"nv=222$(date+%s)"如上,我们插入了3多条数据,接下来我们查询。执行后查询databin/$(uname-s|tr'[:upper:]''[:lower:]')/influxquery'from(bucket:"iot")|>range(start:-1h)',我们会查询刚才插入的数据,IDE中debug模式启动的influxd服务也会打印相应的日志信息。上面是一条简单的查询记录,现在我们进行聚合计算:bin/$(uname-s|tr'[:upper:]''[:lower:]')/influxquery'from(bucket:"iot")|>range(start:-1h)|>sum()'此时,我们以InfluxDB的debug模式启动服务,客户端创建bucket,插入数据,查询数据,有一个直观的印象。06FluxQueryLanguage上面我使用influx客户端来执行查询命令。事实上,它执行的是Flux查询语言。Flux是influxDB社区提供的一种新的查询语言。Flux可以在IDE中运行调试吗?当然!下面搭建Flux的开发调试环境,并演示查询操作。下载并编译gitclonehttps://github.com/influxdata/flux.git...make...goclean-modcache&&gomodtidy&&gomodvendorGoLand运行我们需要配置flux的命令,用于repl,然后运行,如下:启动repl后,我们可以进行数据处理操作,如下图:查询数据Flux可以直接连接InfluxDB服务进行数据查询。上面我们在influx客户端输入的查询语句其实就是Flux查询语言,所以我们当然可以在Flux中进行数据查询。我们启动Fluxrepl并查询如下:如图,出现错误,原因是Flux尝试连接influxdb的9999端口服务,但是上面我们看到我们的服务监听的是8086,所以需要修改默认端口(这个是源码代码调试的好处)。修改端口后发现连接已经建立,但是权限还是有问题,如下:这里需要我们连接的Token信息,如下:cat~/.influxdbv2/configs当我们读取数据时,我们携带令牌和组织信息,如下所示:")|>range(start:-1h)|>sum()data|>yield()好了,到这里我们对Flux读取InfluxDB数据的部分也有了一个直观的认识。07InfluxDB&FluxCommunityContributions目前InfluxdbV2版本的贡献者并不多。我在构建源代码时发现的默认端口问题是influx社区需要改进的补丁,我也提交了相关的PR。InfluxDB:https://github.com/influxdata/influxdb/pull/20809Flux:https://github.com/influxdata/flux/pull/3514作者介绍孙金城,51CTO社区编辑,ApacheFlinkPMC成员,ApacheBeamCommitter,ApacheIoTTDBPMCMember,ALCBeijing会员,Apache神鱼导师,Apache软件基金会会员。专注于技术领域的流计算和时序数据存储。
