阅读162 返回首页    go 小米MIX


核心概念__基础概念_用户指南_日志服务-阿里云

半世纪前说起日志,想到的是船长、操作员手里厚厚的笔记。如今计算机诞生使得日志产生与消费无处不在:服务器、路由器、传感器、GPS、订单、及各种IoT设备通过不同角度描述着我们生活的世界。借助于计算力量,通过收集、处理、使用日志,我们不断更新对整个世界以及体系的认知。

日志是什么?

从船长日志中我们可以发现,日志除了带一个记录的时间戳外,可以包含几乎任意的内容,例如:一段记录文字、一张图片、天气状况、船行方向等。几个世纪过去了,“船长日志”的方式已经扩展到一笔订单、一项付款记录、一次用户访问、一次数据库操作等多样的领域。

日志这种广泛使用模式之所以经久不衰,在于:“日志是一种简单的不能再简单的存储抽象”。它是一个只能增加的,完全按照时间排序的一系列记录。日志(时间序列数据)看起来如下:

我们可以给日志末尾添加记录,并且可以从左到右读取日志记录。每一条记录都指定了一个唯一的有一定顺序的日志记录编号。

  日志顺序由“时间”来确定,从图上可以看到日志从右到左的时间顺序,新产生的事件被记录,过去的事件渐渐远去,但它记录了什么时间发生了什么事情,这无论对于计算机、人类、还是整个世界而言,是认知与推理的基础。   

核心概念

为方便理解整个日志服务服务并顺利使用,这里首先介绍其中的几个基本概念。

地域(Region)

地域为阿里云的服务节点。用户通过在不同的阿里云Region部署服务,让自己的服务距离客户更近,获得更低的访问延时及更好的用户体验。目前阿里云在全国各地拥有多个Region。

项目(Project)

项目为日志服务中的基本管理单元,用于资源隔离和控制。用户可以通过项目来管理某一个应用的所有日志及相关的日志源。

日志库(Logstore)

日志库为日志服务中日志数据的收集、存储和查询单元。每个日志库隶属于一个项目,且每个项目可以创建多个日志库。用户可以根据实际需求为某一个项目生成多个日志库,其中常见的做法是为一个应用中的每类日志创建一个独立的日志库。例如,假如用户有一个“big-game”游戏应用,服务器上有三种日志:操作日志(operation_log),应用程序日志(application_log)以及访问日志(access_log),用户可以首先创建名为“big-game”的项目,然后在该项目下面为这三种日志创建三个日志库,分别用于它们的收集、存储和查询。

分区(Shard)

分区(shard)是每个日志库下读写基本单元,用户可以指定每个日志库下分区数目。每个分区能承载一定量的服务能力:

  • 写入:5MB/S,2000次/S
  • 读取:10MB/S,100次/S

shard有两种状态:

  • readwrite:shard处于可读可写状态
  • readonly:shard只能读,不能写

每个shard都是有一个range,取值范围[00000000000000000000000000000000,ffffffffffffffffffffffffffffffff),可用MD5方式来表示,用于支持指定hash key的模式写入,以及shard split和merge操作

  • inclusiveBeginKey:shard起始的range key(包含)
  • exclusiveEndKey:shard的结束range key(不包含)

在向Shard读写数据过程中,读必须指定对应shard,而写的过程中可以使用负载均衡模式或者指定hash key的模式。负载模式下,每个数据包,随机写入某一个当前可用的shard中,在指定hash key模式下,数据写入shard range包含这个key的shard。

Project/Logstore/Shard 关系:shard

日志(Log)

日志为日志服务中处理的最小数据单元。日志服务采用半结构数据模式定义一条日志,具体数据模型如下:

  • 主题(Topic):用户自定义字段,用以标记一批日志(例如:访问日志根据不同的站点进行标记)。默认该字段为空字符串(空字符串也为一个有效的主题)。
  • 时间(Time):日志中保留字段,用以表示日志产生的时间(精度为秒,从1970-1-1 00:00:00 UTC计算起的秒数),一般由日志中的时间直接生成。
  • 内容(Content):用以记录日志的具体内容。内容部分由一个或多个内容项组成,每一个内容项由Key、Value对组成。
  • 来源(Source):日志的来源地,例如产生该日志机器的IP地址。默认该字段为空。

与此同时,日志服务对日志各字段的取值有不同要求,具体如下表描述:

数据域 要求
time 整型,Unix标准时间格式,最小单位为秒
topic 任意不超过128字节的字符串
source 任意不超过128字节的字符串
content 一个或多个Key-Value对。其中Key为仅包含字母、下划线、数字,不以数字开头,不超过128字节的UTF-8编码字符串。Value为不超过1024*1024字节的任意字符串

上表content中的key不可以使用如下关键字:__time____source____topic__, __partition_time___extract_others_, __extract_others__

日志组(LogGroup)

一组日志的集合,写入与读取的基本单位。日志组限制为:最大4096行日志,或10MB空间。

loggroup

日志主题(Topic)

一个日志库内的日志可以通过日志主题(Topic)来划分。用户可以在写入时指定日志主题,并在查询时必须指定查询的日志主题。例如,一个平台用户可以使用用户编号作为日志主题写入日志。这样在查询时可利用日志主题让不同用户仅看到自己的日志。如果不需要划分一个日志库内日志,让所有日志使用相同的日志主题即可。

注意:空字符串是一个有效的日志主题(Topic),且无论是写入还是查询日志时,默认的日志主题都是空字符串。所以,如果不需要使用日志主题,最简单的方式就是在写入和查询日志时都使用默认日志主题,即空字符串。

下图描述了日志库、日志主题和日志之间的关系:

实际使用场景中,日志的格式多样。为了帮助理解,以下以一条nginx原始访问日志如何映射到日志服务日志数据模型为例说明。假设用户nginx服务器的IP地址为10.249.201.117,下面为其上的一条原始日志:

  1. 10.1.168.193 - - [01/Mar/2012:16:12:07 +0800] "GET /Send?AccessKeyId=8225105404 HTTP/1.1" 200 5 "-" "Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2"

把该条原始日志映射到日志服务日志数据模型,如下:

数据域 内容 说明
topic “” 沿用默认值(空字符串)
time 1330589527 日志产生的精确时间(精确到秒),从原始日志中的时间戳转换而来。
source “10.249.201.117” 使用服务器IP地址作为日志源
content Key-Value对 日志具体内容

用户可以自己决定如何提取日志原始内容并组合成Key-Value对,例如下表:

key value
ip “10.1.168.193”
method “GET”
status “200”
length “5”
ref_url “-“
browser “Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2”

最后更新:2016-11-23 17:25:44

  上一篇:go 弹性Web托管如何创建数据库账号和分配权限__产品相关问题_使用问题_弹性 Web 托管-阿里云
  下一篇:go 项目(Project)__基础概念_用户指南_日志服务-阿里云