0%

阿里日志服务-费用优化实践

背景情况

日志服务存储量较大,费用明显增高

查看费用账单,可以看到日志服务费用为7万5千块钱,费用较高。

分析

首先在账单明细中查看日志服务详细的计量计费信息,包括请求次数、存储空间、索引流量、活跃Shard租用等。

image-20210219090909012

表格排序后看到存储量较大的project和logstore信息。

费用优化

费用和两方面因素相关:

  • 数据量:用户的数据量是业务决定的,无法优化。
  • 配置:使用和数据量相匹配的配置,选择最优的解决方案,才能使成本最小化。

优化配置

配置可以从以下两个方面进行优化:

  • 分区个数

    一个分区最大可以处理5M/s的数据。只有readwrite的分区会收费。请调整分区个数,使其正好能处理5M/s的数据。减少分区个数请合并分区。

  • Logstore 数据保存周期

    针对您对日志的查询、存储的需求不同,建议您优化Logstore 数据保存周期。

    • 如果您收集日志是为了做流计算,建议您只使用LogHub,不创建索引。
    • 如果您需要经常查询最近90天的日志数据,偶尔查询90天前的数据,建议您把Logstore 数据保存周期调整到90天,同时把数据导入MaxCompute。查询90天内数据,使用日志服务,查询90天前数据,使用MaxCompute。
    • 如果您对日志有长时间存储和备份的需求,建议您把日志导入到OSS。

其他优化建议

  • 使用Logtail:有 Batch 与断点续传功能,在保障实时性的同时以最优算法传输数据。Logtail 消耗资源是开源软件(Logstash,FluentD)的1/4,减少CPU消耗。
  • API写入用户尽量使用64KB~1MB大包写入,减少请求次数。
  • 索引关键字段,例如UserID,Action等,对无用字段不配置索引。

脚本优化方案:

通过脚本实现批量修改logstore数据保存周期

1、获取北京区域日志服务所有logstore的ttl保留时间配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from aliyun.log import LogClient
endpoint = 'cn-beijing.log.aliyuncs.com'

# 只读ak即可
accessKeyId = ''
accessKey = ''

client = LogClient(endpoint, accessKeyId, accessKey)

projectsList = client.list_project().get_body()['projects']
# project

for project in projectsList:
projectName = project['projectName']
# 获取所有logstore
logstoresList=client.list_logstore(projectName).get_body()['logstores']
for logstoreName in logstoresList:
ttl = client.get_logstore(projectName,logstoreName).get_body()['ttl']
if int(ttl) not in (3,7):
print('%s,%s,%s' % (projectName,logstoreName,ttl))

2、统一修改ttl

首先要确定数据保留的规则,我们目前的规范为:

生产数据保留7天,非生产保留3天,nginx日志长期保留,特殊日志、有指定需求的日志长期保留。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from aliyun.log import LogClient
endpoint = 'cn-beijing.log.aliyuncs.com'

#需对日志服务有写权限
accessKeyId = ''
accessKey = ''

client = LogClient(endpoint, accessKeyId, accessKey)

#只改特定几个project
projectsList = ['k8s-log-cb16adeacafeb4b9b988ae5d7e8bf0fc1','k8s-log-c2ab41eea4b8143efa03879fb49a9a282','k8s-log-c502d303ba7fb4fd5b01aa091f9cc79fe','proj-xtrace-eb2cce493ffc5c6328dfd9e39e9f38c-cn-beijing','k8s-log-c37c707c4b45b4b7ab09265f449492802']

for projectName in projectsList:
# 获取所有logstore
logstoresList=client.list_logstore(projectName).get_body()['logstores']
for logstoreName in logstoresList:
ttl = client.get_logstore(projectName,logstoreName).get_body()['ttl']
# 保留时间不是3的,改为3。
if int(ttl) != 3:
print('%s,%s,%s' % (projectName,logstoreName,ttl))

# 系统生产的特定logstore,无权修改ttl值,需排除
if logstoreName in ['internal-diagnostic_log','internal-operation_log']:
pass
else:
client.update_logstore(projectName,logstoreName,ttl=3)