LogHub Shipper for TableStore(以下简称传送服务)将用户在日志服务中的数据经简单清洗、转换后写入用户在表格存储中的表。
它由表格存储官方提供,以 Docker 镜像的方式发布于阿里云容器 Hub,并经由容器服务运行于用户的云服务器上。
服务简介
在日志服务中,日志数据以 json 形式进行存储,并以
日志组作为写入与读取的基本单位。这种情况下,无法根据特定条件(比如某个 app 近 12 个小时的日志数据)对日志做快速的查询和分析。
日志数据传送服务,是将日志服务中的日志数据经过结构化转换后,实时写入表格存储中的数据表,以提供准确的、高性能的实时在线服务。
数据示例
假设在日志服务中有如下格式的日志数据:
{"__time__":1453809242,"__topic__":"","__source__":"10.170.148.237","ip":"10.200.98.220","time":"26/Jan/2016:19:54:02 +0800","url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=U0UjpekFQOVJW45A&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=pD12XYLmGxKQ%2Bmkd6x7hAgQ7b1c%3D HTTP/1.1","status":"200","user-agent":"aliyun-sdk-java"}
将其写入到表格存储中主键为 ip 和 time 的数据表中,格式如下:
在表格存储中,很容易对某个 ip 根据时间对历史数据进行精确检索。
日志数据传送服务中提供灵活的数据映射规则,用户可以配置日志数据中的字段与数据表中的属性列的对应关系以及简单的数据转换。
基础概念
相关产品
由传送服务的定位可以看出,它的功能连接两个产品,它的部署依托另外两个产品。所以理解传送服务需先理解这些产品。
表格存储
云服务器
容器服务
访问控制
子账号
建议传送服务所用的子账号仅包含读取日志库的权限和写入表格存储的权限。
数据表
目标表用于存储经清洗、转换后的用户日志数据。
数据表注意事项如下:
用户需要自行创建目标表,传送服务不会主动建表。
在日志服务和表格存储皆可用的条件下,从一条日志进入日志服务到它被写入表格存储的延迟在百毫秒级。
传送服务在表格存储不可用的情况下会主动等待一段时间(不超过 500 ms)重试。
传送服务会定期记录持久化断点。
若传送服务本身不可用,比如升级,则恢复服务后会从最近一个断点继续消费日志。
建议同一个日志库的不同日志对应目标表的不同行。在重试的情况下,这样做可以使目标表最终一致。
传送服务使用表格存储的 UpdateRow 操作写入数据,所以多个传送服务可以共用同一个目标表。这种情况下,建议这些传送服务写入的属性列不要重叠。
状态表
传送服务依赖用户在表格存储中创建的状态表反馈一些信息给用户。
状态表注意事项如下:
多个传送服务可以共用同一个状态表。
在没有出错的情况下,每个传送服务容器每隔 5 分钟在状态表添加一条记录。
在出错的情况下(非表格存储不可用),传送服务容器立即在状态表添加一条记录。
建议状态表设置天级别 TTL,只保留最近的数据。
状态表有四列主键:
project_logstore:String 类型。用户的日志服务的项目和日志库,以字符’|’分隔。
shard:Integer 类型。用户日志服务的 Shard 号。
target_table:String 类型。用户在表格存储的目标表表名。
timestamp:Integer 类型。状态表这条记录添加的时间点。UNIX 时间,单位毫秒。
除此以外,还有以下若干属性列来记录本周期的数据导入情况。对于状态表上任意具体的一行来说,每个属性列都有可能不存在。
shipper_id:String 类型。传送服务容器的 id,目前实现成其容器的主机名。
error_code:String 类型。表格存储定义的错误码,若无错误则该属性列不存在。
error_message:String 类型。表格存储返回的具体出错信息,若无错误则该属性列不存在。
failed_sample:String 类型。出错的日志,组织成 json string。
__time__:Integer 类型。该传送服务容器最近一次更新状态表以来,成功写入表格存储的日志的__time__字段的最大值。
row_count:Integer 类型。该传送服务容器最近一次更新状态表以来,成功写入表格存储的日志条数。
cu_count:Integer 类型。该传送服务容器最近一次更新状态表以来,消耗的写服务能力单元。
skip_count:Integer 类型。该传送服务容器最近一次更新状态表以来,清洗掉的日志条数。
skip_sample:Str 类型。该传送服务容器最近一次更新状态表被丢弃掉的日志之一,组织成 json string。容器本身的日志会记录每一条丢弃掉的日志,以及其被丢弃的理由。
配置
传送服务在创建的时候需要为容器提供一些环境变量:
access_key_id, access_key_secret:传送服务所用的阿里云账号的 Access Key ID 和 Access Key Secret。
loghub:传送服务所需日志服务的配置,一个json object。包括:
endpoint
logstore
consumer_group
tablestore:传送服务所需的表格存储配置,一个json object。包括:
endpoint
instance:实例名
target_table:数据表表名。必须为该实例下已有的表。
status_table:状态表表名。必须为该实例下已有的表。
exclusive_columns:属性列黑名单,一个 json array,其中元素为 json string。
如果有该项设置,则其中字段不会被作为属性列写入目标表。例如,若目标表主键 A,exclusive_columns 设为 [“B”, “C”],某条日志含有 A、B、D三个字段,则目标表会出现一行,主键为 A,属性列为 D;C 不在日志中而不被写入;B 虽在日志中但被 exclusive_columns 排除,也不被写入。
transform:简单变换,一个 json object,其中的 key 为写入目标表的列名(可以是主键列),而 value 为传送服务定义的简单变换表达式:
日志字段直接是一个表达式。
无符号整数是一个表达式。
被一对双引号包围起来的字符串是一个表达式。字符串中可以使用 \" 以及 \\\\ 转义。
( func arg... )也是一个表达式,括号前后可以有 0 个或多个空白(包括空格和 tab)。func 和其参数之间以及各参数之间有至少一个空白,每个参数都必须是表达式。目前支持如下函数:
->int 将字符串转换成整数。有两个参数,第一个参数为进制,支持 2-36 进制;第二个参数为待转换的字符串,字母(大小写无关)代表高于十进制下的 10-26。
->bool 将字符串转换成 Boolean 型。有一个参数,为待转换的字符串,”true”对应 true,”false”对应 false,其余字符串皆出错。
crc32 计算字符串的 crc32,输出为 Integer 型。有一个参数,为待计算的字符串。
若日志缺失或转换的过程出错则视为 key 对应的列缺失。若出错,容器的日志将会记录详细的错误信息。
传送服务的清洗规则只有一条:若主键列缺失,则该条日志被清洗。
改变配置
登录容器服务控制台。
单击[backcolor=transparent]服务,进入服务页面。
找到传送服务,单击其右侧操作栏下的[backcolor=transparent]变更配置,进入修改页面。
单击[backcolor=transparent]确定。
升级镜像
登录容器服务控制台。
单击[backcolor=transparent]应用,进入应用页面。
找到传送服务,单击其右侧操作栏下的[backcolor=transparent]重新部署。
单击[backcolor=transparent]确定。
扩容
以下是两种有效的扩容方式。如果用户需要频繁扩容、缩容,可以考虑使用
弹性伸缩以及
资源编排。
增加节点:
登录
容器服务控制台。
单击[backcolor=transparent]集群,进入集群列表页面。
找到传送服务所在的集群,单击其右侧操作栏下的[backcolor=transparent]管理。
单击页面右侧的[backcolor=transparent]集群扩容增加按量付费的云服务器,或者单击[backcolor=transparent]添加已有节点将已有的的云服务器加入集群。
增加传送服务的容器:增加集群节点本身并不会增加传送服务的容器,增加传送服务容器需在改变传送服务的配置,其操作步骤如下:
登录
容器服务控制台。
单击[backcolor=transparent]服务,进入服务页面。
找到传送服务,单击其右侧操作栏下的[backcolor=transparent]变更配置,进入修改页面。
修改容器数量,然后单击[backcolor=transparent]确定。
缩容
扩容的逆过程。
[backcolor=transparent]注意:被摘除的节点不会自动释放。