哪些建索引,哪些留在正文
目标
日志存储库变慢或变贵的理由几乎总是错误地索引什么 因为是选择的**。那个决定在数据积累之后很难撤销。
在这里实际统计日志后用数字来确定。
材料
/opt/lab/logidx/events.jsonl 로그 2만 줄 (약 4MB)
mkdir -p /root/logidx && cp /opt/lab/logidx/* /root/logidx/ && cd /root/logidx
head -1 events.jsonl | python3 -m json.tool
要留下的东西
01-cardinality.txt 필드마다 값이 몇 가지인가
02-labels.txt 라벨과 본문을 가른 결과
03-explode.txt 라벨 하나를 더하면 스트림이 몇 개가 되나
04-shards.txt 샤드 수
05-tiers.txt 보관 단계와 기간
06-cost.txt 색인과 검색의 비용
07-notes.md 왜 그런지
先数一下
各字段(service level env pod route request_id user_id)数一下有哪些不同的值01-cardinality.txt写在上面,将高低分开标记。
python3 - <<'PY'
import json
rows = [json.loads(l) for l in open('events.jsonl')]
for k in ('service','level','env','pod','route','request_id','user_id'):
print(k, len({r[k] for r in rows}))
PY
两位数以下和万单位会混合在一起。这个差异就是成本差异。
分开标签和正文
分开放在标签上和放在正文中02-labels.txt请写在上面。还会一起计算用标签选择的组合数。
标签就是流(或序列)。组合数就是个数。
service·level·env三个的话是5 × 3 × 2,但实际上只算出现过的组合,可能比这个还少。请用实际数据来算一下。
高位索引域放在正文中。然后通过标签先缩小范围,然后在其中进行搜索,这就是这种存储库的设计意图。
加一个看看
三个标签pod·route·request_id·user_id分别加一个后组合数有多少03-explode.txt写在上面,pod请写下一个变成几倍。
四次结账后再支付。pod因为每个服务有六个,所以乘起来。
“只要有一个标签就很方便”是交易的开始。便利是一个人的,成本是整个群集的。
要分成几个碎片呢?
报告说这个日志每秒500行进来,所以一天的存储量和碎片数04-shards.txt请计算。确定目标碎片大小,并写下如果一天比这个小怎么办。
一行的大小用文件大小÷行数来计算。
以一个碎片10~50GB为目标。如果碎片少得成千上万,那么内存和文件管理器就会消耗得更多,从而导致群集变慢。
如果一天数比目标小,则按周而不是按日期制作,或交给滚动条件**(以大小为标准)。
什么时候会扔什么
hot · warm · cold · delete设定四个阶段的时间,以及每个阶段积累多少钱05-tiers.txt请在上面结算。请写下warm和cold有什么不同。
hot 既可以写入又可以搜索,warm 只用于阅读,所以可以合并部分并减少副本。 cold 移到慢缓存或对象存储。
如果不确定的话,总有一天磁盘会满了,那时为了紧急删除,甚至会删除必要的东西。
费用从哪里来
把索引方面的费用和搜索方面的费用分开06-cost.txt写在上面,并一起写减少索引费的方法和如何处理不搜索的字段。
每秒文档数量就是CPU。如果在运营中直接发送调试级别日志,就会每天支付费用。
不搜索只看的字段是index: false这样的话,会提供索引费用和存储空间。相反,只统计的数字是doc_values只要有就行。
正常请求可以委托追踪,将日志改为只在异常情况下留存。
给下次读的人
从这里看到的中选择至少3个以上07-notes.md请整理一下。不要写做了什么,而是写为什么那样。
想想自己在考虑是否在标签上添加新字段。虽然“添加 Cardinality”没有帮助,但“在标签上添加 pod 会使流量增加六倍——便利性属于一个人,成本属于整个群集”是有帮助的。