Ruby和InfluxDB入门指南

导航到

本文由Oluwaseun Raphael Afolayan撰写。向下滚动查看作者的图片和简介。

时间序列数据库,如InfluxDB,按时间索引数据。它们在记录像服务器指标、应用程序监控、传感器报告或任何包含时间戳的数据的连续数据流方面非常高效。这种结构使得分析随时间的变化变得轻而易举。

本教程将向您展示如何使用示例Ruby应用程序设置InfluxDB。

什么是时间序列数据库?

时间序列数据库是一种针对存储和检索带时间戳的数据或涉及在特定时间段内收集的事件和测量的数据进行优化的数据库。

时间序列数据库特别适用于物联网设备的实现,因为远程设备会持续捕获用于分析的指标。另一个有用的用例是在构建服务器监控应用程序时,您可能希望获得有关系统在特定时间段内如何操作的详细报告,以监控业务或安全关键数据。

为什么使用InfluxDB?

InfluxDB是时间序列数据库中最受欢迎的选项之一。所有功能都通过一个统一的API提供,并且它提供了强大的UI和仪表板工具。

尽管InfluxDB与传统数据库有一些相似之处,但它并非一个直观的CRUD数据库。InfluxDB更注重数据的写入和读取,而不是修改和删除。

在InfluxDB中,您通过插入具有相同测量值、标签集和时间戳的数据来更新记录。这使得InfluxDB在读写操作方面更优化。

如何使用InfluxDB

您将在本地机器上安装InfluxDB,并使用influxdb-client-ruby软件包与Ruby集成,然后学习一些基本的数据库操作。

InfluxDB提供了一系列客户端库,使它与各种技术集成变得简单。对于Ruby开发者,InfluxDB提供了influxdb-client-ruby软件包,它与InfluxDB 1.8+和2.x版本兼容。

设置您的机器

本教程假设您在本地机器上有一个Ruby开发环境。

要验证Ruby的安装,运行以下命令查看已安装的版本。

ruby-v

如果您没有Ruby,运行brew install ruby命令使用Homebrew(macOS软件包管理器)下载Ruby编译器,如果您是Mac用户。

基于Debian/Ubuntu的Linux用户可以使用APT软件包管理器安装编译器,或者运行sudo apt-get install ruby-full

如果您使用的是Windows设备,请运行Ruby安装程序

其他操作系统或Linux发行版的安装指南可以在官方Ruby文档中找到。一旦您设置了本地Ruby安装,您就可以安装InfluxDB平台了。

或者,您可以使用InfluxDB Cloud,在几分钟内运行一个免费的InfluxDB实例,而无需在您的计算机上本地设置任何内容。除了您需要使用所选云提供商的URL而不是localhost作为代码中的URL参数之外,它将是一样的。

安装InfluxDB

您可以通过运行以下命令在Mac上安装InfluxDB软件包:

## update Homebrew

brew update

brew install influxdb

对于其他操作系统或基于Docker或Kubernetes的环境,请查看安装指南

安装完成后,您可以使用终端中的influxd命令启动服务器。

设置InfluxDB

您有两个本地设置选项:通过基于Web的UI或通过命令行。

使用UI

为了访问InfluxUI界面,您需要使用influxd命令运行守护进程。转到localhost:8086并输入您的配置配置文件。

使用CLI

InfluxDB CLI允许您从命令行中操作您的本地数据库。您可以通过运行influx --helpinflux -h查看可用的命令列表。

List of commands

要设置CLI,请运行influx setup并按照提示输入用户信息。

生成令牌

要使用客户端与您的存储桶交互,您需要设置一个授权令牌,该令牌可以通过CLI运行influx auth create -o <组织名称>来生成。

使用 influx auth create 命令还可以让您指定应该授予令牌的权限,如下所示

influx auth create -o organization-name \

--read-buckets \

--write-buckets \

--read-dashboards \

--read-tasks \

--read-user

如果您更喜欢图形界面,可以通过点击“数据”选项卡,然后点击左侧的“令牌”选项卡从UI创建和管理令牌

Generate token

一旦您的令牌成功设置,请将其保存在安全的地方,因为您以后需要使用它。

安装客户端库

influx-ruby 库是一个标准的Ruby包,可以从RubyGems安装

gem install influxdb-client -v 2.0.0

## Optionally install the client-apis

gem install influxdb-client-apis -v 2.0.0

您可以通过运行 gem list 来验证gem的安装状态,它会输出您可用的gem列表。

List of gems

建立连接

要设置与本地InfluxDB实例的连接,您需要在文件顶部导入 influx-db-client,使用 require 'influxdb-client'

将您的连接凭据作为变量设置,用您之前创建的实际令牌值替换令牌变量。如果您在除默认8086端口以外的端口上运行InfluxDB,请在下面的示例中更改它

token = 'YOUR_TOKEN_HERE'

org = 'demo'

bucket = 'demobucket'

url = 'https://127.0.0.1:8086'

在生产使用情况下,您可能希望将其作为秘密存储在受保护的 .env 文件中。

接下来,使用 InfluxDB2::Client.new 创建连接

client = InfluxDB2::Client.new(url, token, bucket: bucket, org: org)

使用SSL/TLS建立连接

当使用 InfluxDB2::Client.new() 方法来创建与运行中的InfluxDB 2实例的连接时,需要一些参数。这些参数允许您传递额外的选项,例如写入精度和SSL首选项到实例。

默认情况下,Influx客户端的访问带有SSL加密,以确保传入和传出的HTTP请求得到保护。要关闭它,请将 use_ssl 参数设置为false

client = InfluxDB2::Client.new(url, token, bucket: bucket, org: org, use_ssl: false

插入数据

现在您将创建示例数据以使用。如果您是Flux的新手,请查看 文档 以开始查询您的实例。

使用 create_write_api.write() 方法,使用InfluxDB行协议、数据点或数组结构将数据存储在InfluxDB存储桶中。

使用行协议

使用InfluxDB行协议写入数据涉及直接以字符串格式传递您的数据到 write() 方法。将测量名称作为字符串的第一个元素传递,后面跟着一个标签值对列表和一个以逗号分隔的实际数据字段列表。

如果您要构建一个应用程序来监控仓库中不同时间间隔的人数,行协议将以这种格式表示

workers_in_warehouse,building=main,floor=one,supervisor=james count=200

您可以在 InfluxDB文档 中了解更多有关行协议的信息。

使用数据点

influxdb-client-ruby包还提供了一个 InfluxDB2::Point 类,该类公开一个 new() 方法,用于将值格式化为写入存储桶的数据点。

执行此操作的通用语法如下所示

point = InfluxDB2::Point.new(name: 'workers_in_warehouse')

.add_tag('building', 'main')

.add_tag('floor', 1)

.add_tag('supervisor', 'james')

.add_field('count', 201)

使用哈希

将数据写入存储桶的另一种方法是解析数据为哈希,这是一种以普通对象形式的数据格式。

hash = { name: 'workers_in_warehouse',

tags: { building: 'main', floor: 1, supervisor: 'james' },

fields: { count: 213 }

}

使用哈希写入数据很方便,但您可以使用您最喜欢的语法。它们都可以正常工作。

将数据保存到您的存储桶

# Configuring write options

write_options = InfluxDB2::WriteOptions.new(write_type: InfluxDB2::WriteType::BATCHING, batch_size: 10, flush_interval: 5_000, max_retries: 3, max_retry_delay: 15_000, exponential_base: 2, precision: InfluxDB2::WritePrecision::NANOSECOND)

# Writing to the bucket

write_api = client.create_write_api(write_options: write_options)

# writing to the bucket

write_api.write(data: 'workers_in_warehouse,building=main,floor=one,supervisor=james count=200')

运行此脚本后,请转到InfluxUI的数据探索器部分,查看您已插入存储桶的内容。

通过InfluxDB UI读取数据

如前所述,本地安装InfluxDB为您提供了一个用于编辑数据的Web界面。使用该界面可以查看插入到桶中的数据的可视化表示。

使用您之前设置的用户名和密码登录InfluxUI。您应该会进入“入门”页面。

Getting Started

  • 通过点击侧边栏上的“数据”菜单来打开“加载数据”页面。
  • 进入“加载数据”页面后,通过点击上方的水平菜单切换到桶部分。
  • 打开test-bucket,选择所需的度量(workers_in_warehouse),然后点击提交以在数据探索器部分显示数据。
  • 您可以从可用选项中选择您数据的形式。

Data explorer

现在您需要一种从Ruby脚本中读取或查询插入到InfluxDB中的数据的方法。

从InfluxDB中读取数据

从InfluxDB中读取或查询数据应使用Flux——一种旨在与InfluxDB和Prometheus等时间序列数据库以及MySQL和PostgreSQL等关系型数据库一起工作的数据脚本语言。

如果您是Flux的新手,请查看文档以开始学习。

您可以通过从客户端实例化create_query_api属性来查询您的InfluxDB实例:query_api = client.create_query_api。

例如,如果您查询了InfluxDB桶中过去一小时插入的数据,相应的Flux查询字符串将是

query = 'from(bucket:"' + bucket + '") |> range(start: -1h, stop: now())'

定义Flux查询后,您可以通过调用query_raw()方法并传入字符串作为参数来执行它,以换取未处理的数据字符串

result = query_api.query_raw(query: query)

Script started

优化InfluxDB库

虽然InfluxDB已被证明是存储和检索时间序列数据的多功能平台,但您应遵循某些指导和最佳实践,以充分利用您的数据库。以下是一些建议

  • 避免在度量名称中编码数据,以保持其简单。
  • 为了减少InfluxDB实例的大小和成本,避免在您的桶中存储重复或不必要的数据。
  • 以批量的形式写入数据,以减少写入InfluxDB实例时的网络开销。您可以通过在写入选项中提供batch_size属性来启用批处理写入,使用influxdb-client-ruby包。
  • 在可能的情况下,当向实例写入数据时,应谨慎使用time_precision属性的值。尽管InfluxDB默认使用纳秒精度将数据写入桶中,但您不一定需要在项目中这样做。

结论

InfluxDB是一个令人兴奋的平台,可用于构建各种时间相关的项目,用于分析、物联网以及云原生服务。它与多个库一起工作,其开发者社区可用于帮助解决云或开源问题。

正如本教程所示,将InfluxDB与Ruby结合使用为您提供编译、查看和分析您的时敏数据的多种选项。

代码示例可在此GitHub存储库此链接的GitHub gists中找到。

关于作者

Oluwaseun Afolayan

开发者 & 数字增长黑客。自由职业技术作家,帮助拯救世界,一次一段话。