0%

InfluxQL是一种类似于SQL的查询语言,用于与InfluxDB进行交互。它经过精心设计,可以使来自其他SQL或类似SQL环境的用户熟悉,同时还提供特定于存储和分析时间序列数据的功能。

InfluxQL的SELECT语句遵循SQL SELECT语句的形式:

SELECT <stuff> FROM <measurement_name> WHERE <some_conditions>

WHERE是可选的。

要在上面的部分中获取InfluxDB输出,请输入:

SELECT * FROM "foodships"

如果您只想查看有关该行的数据Saturn,请输入:

SELECT * FROM "foodships" WHERE "planet" = 'Saturn'

如果您想Saturn在2015年4月16日世界标准时间12:00:01之后查看行星的数据,请输入:

SELECT * FROM "foodships" WHERE "planet" = 'Saturn' AND time > '2015-04-16 12:00:01'

如上面的示例所示,InfluxQL允许您在WHERE子句中指定查询的时间范围。您可以使用日期时间字符串,这些日期时间字符串用单引号引起来,其格式为YYYY-MM-DD HH:MM:SS.mmm (mmm是毫秒,是可选的,还可以指定微秒或纳秒)。您还可以使用相对时间now()来引用服务器的当前时间戳:

SELECT * FROM "foodships" WHERE time > now() - 1h

该查询foodships以时间戳记比服务器当前时间减去一小时新的量度输出数据。用于指定持续时间的选项now()有:

格式 单位
ns 纳秒
u或µ 微秒
ms 毫秒
s
m 分钟
H 小时
d
w
  • InfluxQL还支持正则表达式,表达式,SHOW语句和GROUP BY语句中的算术运算。

  • InfluxQL功能包括COUNTMINMAXMEDIANDERIVATIVE等等。

  • 查询中的基本计算

SELECT声明支持使用基本数学运算符,如+,-,/,*,(),等。

-- Add two field keys
SELECT field_key1 + field_key2 AS "field_key_sum" FROM "measurement_name" WHERE time < now() - 15m

-- Subtract one field from another
SELECT field_key1 - field_key2 AS "field_key_difference" FROM "measurement_name" WHERE time < now() - 15m

-- Grouping and chaining mathematical calculations
SELECT (field_key1 + field_key2) - (field_key3 + field_key4) AS "some_calculation" FROM "measurement_name" WHERE time < now() - 15m
  • 计算查询中的百分比

使用基本的数学函数,您可以通过将一个字段值除以另一字段值并将结果乘以100来计算百分比:

SELECT (field_key1 / field_key2) * 100 AS "calculated_percentage" FROM "measurement_name" WHERE time < now() - 15m
  • 使用聚合函数计算百分比

如果在百分比计算中使用汇总函数,则必须使用汇总函数引用所有数据。 您不能混合使用汇总数据和非汇总数据。

所有聚合功能都需要一个GROUP BY time()子句,该子句定义将数据点分组和聚合的时间间隔。

SELECT (sum(field_key1) / sum(field_key2)) * 100 AS "calculated_percentage" FROM "measurement_name" WHERE time < now() - 15m GROUP BY time(1m)

支持的API client

参考官网

http

创建数据库

curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"

写入数据

curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'

配置gzip压缩

InfluxDB支持gzip压缩。要减少网络流量,请考虑以下选项:

  • 要接受来自InfluxDB的压缩数据,请将Accept-Encoding: gzip标头添加到InfluxDB API请求中。
  • 要在将数据发送到InfluxDB之前压缩数据,请将Content-Encoding: gzip标头添加到InfluxDB API请求中。

批量写入

curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257

从文件写入

通过传递@filename到文件来写入文件中的点curl。文件中的数据应遵循InfluxDB行协议语法。

格式正确的文件(cpu_data.txt)的示例:

cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257

写入数据cpu_data.txtmydb与数据库:

curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary @cpu_data.txt

注意:如果您的数据文件具有5,000个以上的点,则可能有必要将该文件拆分为几个文件,以便将数据批量写入InfluxDB。默认情况下,HTTP请求在五秒钟后超时。超时后,InfluxDB仍将尝试写入这些点,但是不会确认它们已成功写入。

HTTP响应摘要

  • 2xx:如果收到您的写请求HTTP 204 No Content,那就成功了!
  • 4xx:InfluxDB无法理解该请求。
  • 5xx:系统过载或严重损坏

查询数据

curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"

InfluxDB返回JSON。您的查询结果将显示在”results”数组中。如果发生错误,InfluxDB会设置一个”error”包含错误说明的密钥。

{
    "results": [
        {
            "statement_id": 0,
            "series": [
                {
                    "name": "cpu_load_short",
                    "columns": [
                        "time",
                        "value"
                    ],
                    "values": [
                        [
                            "2015-01-29T21:55:43.702900257Z",
                            2
                        ],
                        [
                            "2015-01-29T21:55:43.702900257Z",
                            0.55
                        ],
                        [
                            "2015-06-11T20:46:02Z",
                            0.64
                        ]
                    ]
                }
            ]
        }
    ]
}

注意:附加pretty=true到URL会启用精美打印的JSON输出。尽管这对于调试或在使用诸如之类的工具直接查询时很有用curl,但不建议用于生产环境,因为它会消耗不必要的网络带宽。

多个查询

通过单个API调用将多个查询发送到InfluxDB。只需使用分号分隔每个查询,例如:

curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west';SELECT count(\"value\") FROM \"cpu_load_short\" WHERE \"region\"='us-west'"

返回:

{
    "results": [
        {
            "statement_id": 0,
            "series": [
                {
                    "name": "cpu_load_short",
                    "columns": [
                        "time",
                        "value"
                    ],
                    "values": [
                        [
                            "2015-01-29T21:55:43.702900257Z",
                            2
                        ],
                        [
                            "2015-01-29T21:55:43.702900257Z",
                            0.55
                        ],
                        [
                            "2015-06-11T20:46:02Z",
                            0.64
                        ]
                    ]
                }
            ]
        },
        {
            "statement_id": 1,
            "series": [
                {
                    "name": "cpu_load_short",
                    "columns": [
                        "time",
                        "count"
                    ],
                    "values": [
                        [
                            "1970-01-01T00:00:00Z",
                            3
                        ]
                    ]
                }
            ]
        }
    ]
}

java

influxdb-java

  • Java 1.8+ (tested with jdk8 and jdk11)
  • Maven 3.0+ (tested with maven 3.5.0)

  org.influxdb
  influxdb-java
  2.17

compile 'org.influxdb:influxdb-java:2.17'

python

influxdb-python

go

influxdb1-client

CLI连接

参考链接

influx -precision rfc3339
  • influx默认使用本地8086端口和localhost连接,更多参考influx --help
  • -precision格式化时间,rfc3339使用RFC3339 format (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ).

管理连接

exit

创建数据库

CREATE DATABASE <db-name>

例如CREATE DATABASE mydb.default是默认关键字,不能用于数据库名.

查看数据库

创建完数据库可以用SHOW DATABASES查看所有数据库.

> SHOW DATABASES
name: databases
name
----
_internal
mydb

使用数据库

USE <db-name>

> USE mydb
Using database mydb

存储策略

查看当前数据库Retention Policies

show retention policies on "db_name"

创建新的Retention Policies

create retention policy "rp_name" on "db_name" duration 3w replication 1 default

数据格式

<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
  • measurement相当于表名.
  • tag是数据的标签,可以有多个
  • field是数据的值,可以有多个,例如 “value=0.64”, or “temperature=21.2”
  • timestamp是数据的时间戳

每一条数据称之为points.

插入一条数据

INSERT cpu,host=serverA,region=us_west value=0.64
INSERT temperature,machine=unit42,type=assembly external=25,internal=37

查询数据

SELECT "host", "region", "value" FROM "cpu"
SELECT * FROM "temperature"
> SELECT * FROM /.*/ LIMIT 1
--
> SELECT * FROM "cpu_load_short"
--
> SELECT * FROM "cpu_load_short" WHERE "value" > 0.9
SELECT * FROM cpu where time = '2020-02-20T06:43:42.9206681Z'

influxdb简介

influxdb是一款常年在db-engine使用排名第一的时序数据库,提供存储管理、用户管理、http接口、各类语言API接口。

TSM

时序数据使用类似 LSM Tree 的 TSM Tree (Time Series Merge Tree)存储,而且是一种「列式」存储结构。

数据写入时:

  • 先保存到 cache 和 WAL 当中
  • 当 WAL 当中数据超出阈值时,将 WAL 文件写入到 level 1 的 TSM 文件当中,cache 和 WAL 也随之清空
  • 每个 TSM 文件主要分成两部分:时序数据,以及时序数据的索引,通过索引可以使用二分查找找到我们需要的数据
  • 随着 TSM 文件变多,系统会将多个小 的TSM 文件会合并成一个的更大的 TSM 文件,持续这个过程保证文件数量不会过多
  • TSM 文件的合并策略是比较老的 size-tiered 策略,将小的文件压缩成大的文件,这一点和 leveldb 不太一样,leveldb 要严格保证每个 level 下的文件没有重叠,但是 influxdb 不会。

之所以这么设计,应该是因为查询时序数据的时候,一般会根据时间进行筛选,而大部分时候每个 TSM 文件当中都是越老的文件数据也越老,数据天然会按照时间排序,虽然会有重叠的情况,但是权衡利弊,最终可以容忍这种情况,查询的时候做数据合并的成本更小。

TSI

TSI 是 Time Series Index 的缩写,influxdb 用 TSI 来保存时序数据的倒排索引。可以通过 TSI 快速查询到某个表中,包含某个 tag 的 series 都有哪些。

TSI 的另一个工作是将倒排索引保存在磁盘当中,在 TSI 之前,influxdb 完全是使用内存存储倒排索引的,当时序数据变多的时候,特别是「表」变多的时候,倒排索引消耗的内存会飙升。TSI 使用类似 TSM 的文件结构来存储索引。

inflxdb数据库安装

centos安装

  1. 下载地址
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.10.x86_64.rpm
sudo yum localinstall influxdb-1.7.10.x86_64.rpm
  1. 安装
yum localinstall influxdb-1.7.10.x86_64.rpm
  1. 卸载
rpm -qa | grep influx
rpm -e influxdb-1.7.10.x86_64
  1. 启动
service influxdb start
systemctl enable influxdb
systemctl start influxdb
systemctl restart influxdb
systemctl stop influxdb

windows

https://dl.influxdata.com/influxdb/releases/influxdb-1.7.10_windows_amd64.zip unzip influxdb-1.7.10_windows_amd64.zip

docker安装

docker pull influxdb

可视化UI-Chronograf

docker安装

docker pull quay.io/influxdb/chronograf:1.7.17

centos

wget https://dl.influxdata.com/chronograf/releases/chronograf-1.7.17.x86_64.rpm
sudo yum localinstall chronograf-1.7.17.x86_64.rpm

windows

https://dl.influxdata.com/chronograf/releases/chronograf-1.7.17_windows_amd64.zip
unzip chronograf-1.7.17_windows_amd64.zip

数据收集器-Telegraf

docker安装

docker pull telegraf

centos

wget https://dl.influxdata.com/telegraf/releases/telegraf-1.13.3-1.x86_64.rpm
sudo yum localinstall telegraf-1.13.3-1.x86_64.rpm

windows

wget https://dl.influxdata.com/telegraf/releases/telegraf-1.13.3_windows_amd64.zip
unzip telegraf-1.13.3_windows_amd64.zip

处理和监控服务-Kapacitor

docker安装

docker pull kapacitor

centos

wget https://dl.influxdata.com/kapacitor/releases/kapacitor-1.5.4-1.x86_64.rpm
sudo yum localinstall kapacitor-1.5.4-1.x86_64.rpm

windows

wget https://dl.influxdata.com/kapacitor/releases/kapacitor-1.5.4_windows_amd64.zip
unzip kapacitor-1.5.4_windows_amd64.zip

架构综述

Istio在逻辑上分为数据平面(data plane)和控制平面(control plane)两部分:

  • 数据平面:由一系列以sidecar形式部署的智能代理(Envoy)组成。这些代理可以调节和控制微服务及混合器(Mixer)之间的所有网络通信
  • 控制平面:负责管理和配置代理来路由流量,除此之外控制平面还配置混合器(Mixer)以执行策略和收集遥测数据

istio 架构

数据平面

  • Envoy是以C++开发的高性能代理,用于接管服务网格中所有服务的所有inboundoutbound流量。 Istio实际上利用了很多Envoy已有的特性,例如:服务的动态发现、负载均衡、TSL终止、HTTP/2和gRPC代理、断路器、健康检查、基于百分比流量拆分的灰度发布、故障注入以及丰富的度量指标。
  • Envoy以sidecar部署,与对应的服务在同一个Kubernetes Pod中。这样的部署方式使得Istio可以将大量了关于流量行为的信号作为属性(Attribute)提取出来。这些属性可以被用来在混合器(Mixer)中执行策略决策,并发送给监控系统,以提供整个Service Mesh的行为信息。Sidecar模式允许我们将istio的功能添加到现有的部署中,而无需重构或重写现有的代码。

控制平面

  • Pilot为 Envoy sidecar 提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。 将控制流量行为的高级路由规则转换为Envoy的相关配置,并在运行时将它们传播到sidecar。

  • Mixer分为PolicyTelemetry两个子模块。Policy用于向Envoy提供准入策略控制,黑白名单控制,速率限制等相关策略;Telemetry为Envoy提供了数据上报和日志搜集服务,以用于监控告警和日志查询。

  • Galley在Istio中,承担配置的导入、处理和分发任务,为Istio提供了配置管理服务,提供在k8s服务端验证Istio的CRD 资源的合法性的方法,是整个控制面的配置管理中心。

  • Citadel主要关注安全,为服务之间以及与终端用户提供认证、授权、凭据管理等功能。

类比

istio 架构

简介

服务网格(Service mesh)是服务间通信的基础设施层。它对全局流量和通信进行监控和管理,提供包括可观察性、流量转移(用于灰度发布)、弹性能力(例如断路和重试/超时)等一系列功能,并为服务之间的通信提供双向 TLS 认证能力,让网格能够对请求和响应进行自动加密和解密。
Service Mesh

特点

  • 治理能力独立(Sidecar)
  • 应用程序无感知
  • 服务通信的基础设施层

关注的方面

  • 可观察性
  • 安全性
  • 可运维性
  • 可拓展性

为什么需要?

Service Mesh
Kubernetes 提供平台基础设施层强大的容器编排与调度能力

  • 服务部署与弹性伸缩:Deployment
  • 服务拆分与服务发现:Service

Kubernetes 提供简单的负载均衡

  • 负载均衡:基于IPVSIptables的简单均衡机制

但是Kubernetes在服务治理方面并不完备,缺少了动态路由、熔断、灰度发布等等功能,需要由服务网格互补。

什么时候用Service Mesh?

Service Mesh

随着我们的微服务越来越细分,我们所要管理的服务正在成倍的增长着,Kubernetes 提供了丰富的功能,使得我们可以快速的部署和调度这些服务,同时也提供了我们熟悉的方式来实现那些复杂的功能,但是随着部署的应该越来越多,复杂度越来越高,当临界点到来时,可能就是我们真正要去考虑使用 Service Mesh 的时候了。

Istio问世

Service Mesh
Istio是一个开放服务网格,是Service Mesh标准实现,也是当下最流行的,提供了一种连接,管理和保护微服务的统一方法。它支持管理服务之间的流量,执行访问策略以及汇总遥测数据,所有这些都无需更改微服务代码。