0%

支持的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标准实现,也是当下最流行的,提供了一种连接,管理和保护微服务的统一方法。它支持管理服务之间的流量,执行访问策略以及汇总遥测数据,所有这些都无需更改微服务代码。

LogQL github

LogQL简介

LogQL: Log Query Language
Loki comes with its very own language for querying logs called LogQL. LogQL can be considered a distributed grep with labels for filtering.

A basic LogQL query consists of two parts: the log stream selector and a filter expression. Due to Loki’s design, all LogQL queries are required to contain a log stream selector.

The log stream selector will reduce the number of log streams to a manageable volume. Depending how many labels you use to filter down the log streams will affect the relative performance of the query’s execution. The filter expression is then used to do a distributed grep over the retrieved log streams.

Loki选择器

对于查询表达式的标签部分,将其包装在花括号中{},然后使用键值对的语法来选择标签,多个标签表达式用逗号分隔,比如:

{app="mysql",name="mysql-backup"}

目前支持以下标签匹配运算符:

  • =等于
  • !=不相等
  • =~正则表达式匹配
  • !~不匹配正则表达式
  • 比如:
{name=~"mysql.+"}
{name!~"mysql.+"}

日志过滤器

编写日志流选择器后,您可以通过编写搜索表达式来进一步过滤结果。搜索表达式可以只是文本或正则表达式。
查询示例:

{job="mysql"} |= "error"
{name="kafka"} |~ "tsdb-ops.*io:2003"
{instance=~"kafka-[23]",name="kafka"} != kafka.server:type=ReplicaManager

过滤器运算符可以被链接,并将顺序过滤表达式-结果日志行将满足每个过滤器。例如:

{job="mysql"} |= "error" != "timeout"

已实现以下过滤器类型:

  • |= 行包含字符串。
  • != 行不包含字符串。
  • |~ 行匹配正则表达式。
  • !~ 行与正则表达式不匹配。
    regex表达式接受RE2语法。默认情况下,匹配项区分大小写,并且可以将regex切换为不区分大小写的前缀(?i)

日志统计

  • rate: calculate the number of entries per second
rate( ( {job="mysql"} |= "error" != "timeout)[10s] ) )
  • count_over_time: counts the entries for each log stream within the given range.
count_over_time({job="mysql"}[5m])

聚合运算

  • sum: Calculate sum over labels
  • min: Select minimum over labels
  • max: Select maximum over labels
  • avg: Calculate the average over labels
  • stddev: Calculate the population standard deviation over labels
  • stdvar: Calculate the population standard variance over labels
  • count: Count number of elements in the vector
  • bottomk: Select smallest k elements by sample value
  • topk: Select largest k elements by sample value

示例:
Get the top 10 applications by the highest log throughput:

topk(10,sum(rate({region="us-east1"}[5m])) by (name))

Get the count of logs during the last five minutes, grouping by level:

sum(count_over_time({job="mysql"}[5m])) by (level)

Get the rate of HTTP GET requests from NGINX logs:

avg(rate(({job="nginx"} |= "GET")[10s])) by (region)