Elasticsearch,最初的设计是分布式搜索引擎。由于可以支持对海量数据的快速地进行筛选和统计,再加上可增量索引,伸缩性强,社区活跃,有商业公司维护等特性,很多人用来做实时的数据分析。例如要统计一批商品的销售数据,一群人的身份特征等等,以前都需要使用Hive,Impala等跑任务,现在数据可以所见即所得。
实时的数据分析,和搜索不一样,会有以下的特点:
1.查询速度不需要太快。不需要毫秒级别返回数据,有时候10秒内返回数据,也是可以接受的
2.很难进行Cache。因为可能每次查询的数据不一样,查询的数据字段不一样
3.负载变化大。因为有时候可能只是简单Trems查询,有时候是嵌套的AGG查询,很难控制对服务器的压力
4.字段不可控。因为数据分析可能会随时加入新的数据集,会出现不同的字段,进行不同的操作
5.需要灵活使用脚本。大量的数据分析需要进行多字段之间的运算来进行统计,这个时候脚本就必不可少
6.需要更细的分词粒度。对文本进行数据分析,最重要的两步就是选择时间范围,筛选包含某些关键词的数据,进行AGG统计。使用分词算法,例如ansj之类的,可能导致部分关键词没有切出来无法筛选的问题
正因为这些特点,我们可能会遇到以下问题(TODO):
1.大量查询请求堆积
2.FieldData占用过多内存
3.不可用影响数据写入丢失
4.深分页
5.单个索引过大
6.需要更新大量数据
7.唯一字段修改
8.表管理,版本管理
9.分词问题
10.对分布广的字段进行AGG查询
11.复杂查询影响简单查询
一些最佳实践(TODO):
1.设置独立master节点
2.滚动重启
3.使用模板、动态字段
4.使用别名
5.使用父子文档
6.必要的监控
7.考虑中间件
8.使用2.3版本
9.如何备份
10.提高入库稳定性
11.硬件参考
12.性能指标
网友评论