排除写入数据的问题
了解如何在写入 InfluxDB Cloud Dedicated 时避免意外结果并从错误中恢复。
处理写入响应
当您发送写入请求时,InfluxDB Cloud Dedicated 会执行以下操作:
验证请求。
在批处理中获取或拒绝数据,并返回以下HTTP状态代码之一:
204 No Content: 批次中的所有数据都已被接收。400 Bad Request:一些(当部分写入为集群配置时)或所有数据已被拒绝。未被拒绝的数据已被接收并可查询。
响应主体包含关于拒绝的点的错误详细信息,最多100个点。
写操作是同步的——响应状态表示写操作的最终状态,所有摄取的数据都是可查询的。
为了确保 InfluxDB 按照您请求的顺序处理写入,发送下一个请求之前请等待响应。
查看HTTP状态码
InfluxDB使用常规的HTTP状态码来指示请求的成功或失败。
响应体的message属性可能包含有关错误的其他详细信息。
InfluxDB Cloud Dedicated 对写请求返回以下HTTP状态码之一:
| HTTP 响应代码 | 响应体 | 描述 |
|---|---|---|
204 No Content" | 无响应主体 | 如果InfluxDB已处理批量中的所有数据 |
400 "Bad request" | 关于被拒绝点的错误详情,最多100个点: line 包含第一个被拒绝的行,message 描述拒绝原因 | 如果某些(当为集群配置了部分写入时)或所有请求数据不被允许(例如,如果数据格式不正确或超出了桶的保留期)–响应体指示是否发生了部分写入或所有数据都已被拒绝 |
401 "Unauthorized" | 如果Authorization头缺失或格式错误,或者如果token没有permission写入数据库的权限。参见写请求中的使用凭据的示例。 | |
404 "未找到" | 请求的 资源类型 (例如,“组织”或“数据库”),以及 资源名称 | 如果请求的资源(例如,组织或数据库)未找到 |
422 "不可处理的实体" | message 包含有关错误的详细信息 | 如果数据不被允许(例如,超出了数据库的保留期限)。 |
500 "内部服务器错误" | 错误的默认状态 | |
503 "服务不可用" | 如果服务器暂时无法接受写入。Retry-After头包含在再次尝试写入之前要等待的秒数。 |
响应体的 message 属性可能包含有关错误的更多详细信息。 如果您的数据没有写入数据库,看看如何 排除被拒绝的点。
故障排除
如果您注意到数据库中缺少数据,请执行以下操作:
- 检查响应中的 HTTP 状态码。
- 检查响应主体中的
message属性以获取有关错误的详细信息。 - 如果
message描述了一个字段错误,排查拒绝的点。 - 验证所有行都包含有效的语法 (line protocol).
- 验证您数据中的时间戳与请求中的 precision parameter 匹配。
- 通过 优化写入 来最小化负载大小和网络错误。
排查被拒绝的要点
在从批次写入点时,InfluxDB会拒绝具有语法错误或模式冲突的点。 如果InfluxDB处理了您批次中的数据,然后拒绝了点,HTTP响应主体包含以下描述被拒绝点的属性:
code:"无效"line: 批处理中第一个被拒绝点的行号。message: 一个包含分行错误信息的字符串,每个被拒绝的点都有一个信息,最多可包含100个被拒绝的点。
InfluxDB 因以下原因拒绝数据点:
- 行协议解析错误
- 无效的时间戳
- 模式冲突
当您尝试写入包含以下任何内容的数据时,会发生架构冲突:
- 错误的数据类型:该点落在与现有桶数据相同的分区内(默认分区为测量和天),并且包含现有字段的不同数据类型
- 具有相同键的标签和字段
示例
以下示例展示了一个写请求的响应体,其中包含两个被拒绝的点:
{
"code": "invalid",
"line": 2,
"message": "failed to parse line protocol:
errors encountered on line(s):
error parsing line 2 (1-based): Invalid measurement was provided
error parsing line 4 (1-based): Unable to parse timestamp value '123461000000000000000000000000'"
}
检查被拒绝的数据点与同一数据库和分区内的点之间的 字段数据类型 差异——例如,您是否尝试将 string 数据写入 int 字段?