ELK:
Elasticsearch 搜索
Logstash 日志
kibana 可视化
基于lucene实现的,
lucene数据类型层次可以分为:
Index索引,Segment片段,Document文章(index和search最小单位),field域(包括field name & field value), term(最小单位,分词后的词)
倒排索引:
每个文章分词后会包含很多词,根据词为key来索引包含这些词的文章。
索引的文章ID可以压缩,比如增量存储或取余存储(除以65535即2的16次方-1)
term可以进行排序后形成term dictionary,然后term dictionary可以进一步通过hashmap生成index,比如A前缀的在一个。
或者用FST来存储term字典,FST在范围、前缀搜索、压缩率性能高。
skiplist跳表快速查找docid
联合查找在FST找到倒排链后,根据倒排链,先取第一个的一个值,在从第二个找此值,在第三个找,都有了就记录一个,没有则跳过此值
Elastic防止脑裂:
设置最小节点个数。
比如只有两个节点,当之间通信中断时,从节点会认为主节点不可用了,这样就会导致有双主节点不一致,就是脑裂。
如果设置最小节点个数为2,当有两个节点通信中断,服务直接出问题会被感知到。但是有3个节点时服务依然可用。
Elasticsearch搜索:
Query then fetch/
请求通过节点发送给所有分片,然后每个分片查询最相似字典把ID+ 分值传回node,搜索会查询filesystem cache的。
然后在node根据所有传回全局排序在传给对应shard,多个get请求数据。
Elasticsearch索引:
协调节点node通过hash字典ID+shard数来找到对应分片,
分片接到请求会同时给memory cache & trans log 写一份, memory cache默认1s会写道filesystem, filesystem写到磁盘或半小时translog会清一遍。
优化:
使用SSD,热数据存储SSD,冷数据压缩磁盘
集群都在一个机房
把内存少于一半给lucene
检索批量请求
如何监控集群状态?
Marvel可以简单通过Kibana监控集群状态
更新删除文档:
删除时候.del文件会对文档标记删除,检索还会检索到,只是结果被过滤。
更新时候旧版本在.del被标记删除,新版本生成新ID,同样被删除能被检索会被过滤。
Logstash:
三部分:数据采集、数据解析/转换,数据输出
解析:
利用grok从非结构化数据中派生出结构;
从IP地址中破译出地理坐标
将PII数据匿名化,去敏感信息
input --- codec --- event --- queue --- batcher --- filter --- output
queue分类:
in memory:
宕机时候会造成数据丢失
persistent queue in disk:
不会丢失,保证数据至少被消费一次,在从input 到PQ时候,PQ把数据备份在disk,然后PQ响应已经收到数据;
数据从PQ到达下一个处理单元如filter/output时候,返回ACK到PQ,PQ收到后删除磁盘备份数据,