elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数 据大小,分片有多少,以及一些调优手段 。
比如:
ES
集群架构
13
个节点,索引根据通道不同共
20+
索引,根据日期,每日递增
20+
,索引:
10
分片,每日递增
1
亿
+
数据,每个通道每天索引大小控制:
150GB
之内。
仅索引层面调优手段:
1.1
、设计阶段调优
(
1
)根据业务增量需求,采取基于日期模板创建索引,通过
roll over API
滚动索引;
(
2
)使用别名进行索引管理;
(
3
)每天凌晨定时对索引做
force_merge
操作,以释放空间;
(
4
)采取冷热分离机制,热数据存储到
SSD
,提高检索效率;冷数据定期进行
shrink
操作,以缩减存
储;
(
5
)采取
curator
进行索引的生命周期管理;
(
6
)仅针对需要分词的字段,合理的设置分词器;
(
7
)
Mapping
阶段充分结合各个字段的属性,是否需要检索、是否需要存储等。
……..
1.2
、写入调优
(
1
)写入前副本数设置为
0
;
(
2
)写入前关闭
refresh_interval
设置为
-1
,禁用刷新机制;
(
3
)写入过程中:采取
bulk
批量写入;
(
4
)写入后恢复副本数和刷新间隔;
(
5
)尽量使用自动生成的
id
。
1.3
、查询调优
(
1
)禁用
wildcard
;
(
2
)禁用批量
terms
(成百上千的场景);
(
3
)充分利用倒排索引机制,能
keyword
类型尽量
keyword
;
(
4
)数据量大时候,可以先基于时间敲定索引再检索;
(
5
)设置合理的路由机制。
1.4
、其他调优
部署调优,业务调优等。
![](https://img-blog.csdnimg.cn/15eefccaf3a2470e96cec6503de2f4bb.png)
elasticsearch
索引数据多了怎么办,如何调优,部署
面试官:想了解大数据量的运维能力。
解答:索引数据的规划,应在前期做好规划,正所谓
“
设计先行,编码在后
”
,这样才能有效的避免突如
其来的数据激增导致集群处理能力不足引发的线上客户检索或者其他业务受到影响。
如何调优,正如问题
1
所说,这里细化一下:
3.1
动态索引层面
基于模板
+
时间
+rollover api
滚动创建索引,举例:设计阶段定义:
blog
索引的模板格式为:
blog_index_
时间戳的形式,每天递增数据。这样做的好处:不至于数据量激增导致单个索引数据量非
常大,接近于上线
2
的
32
次幂
-1
,索引存储达到了
TB+
甚至更大。
一旦单个索引很大,存储等各种风险也随之而来,所以要提前考虑
+
及早避免。
3.2
存储层面
冷热数据分离存储,热数据(比如最近
3
天或者一周的数据),其余为冷数据。
对于冷数据不会再写入新数据,可以考虑定期
force_merge
加
shrink
压缩操作,节省存储空间和检索
效率。
3.3
部署层面
一旦之前没有规划,这里就属于应急策略。
结合
ES
自身的支持动态扩展的特点,动态新增机器的方式可以缓解集群压力,注意:如果之前主节点
等规划合理,不需要重启集群也能完成动态新增的。
![](https://img-blog.csdnimg.cn/040813dc48c84b9a898f6f1c54bd0a1b.png)
第一步:客户写集群某节点写入数据,发送请求。(如果没有指定路由
/
协调节点,请求的节点扮演路
由节点的角色。)
第二步:节点
1
接受到请求后,使用文档
_id
来确定文档属于分片
0
。请求会被转到另外的节点,假定
节点
3
。因此分片
0
的主分片分配到节点
3
上。
第三步:节点
3
在主分片上执行写操作,如果成功,则将请求并行转发到节点
1
和节点
2
的副本分片
上,等待结果返回。所有的副本分片都报告成功,节点
3
将向协调节点(节点
1
)报告成功,节点
1
向
请求客户端报告写入成功。
如果面试官再问:第二步中的文档获取分片的过程?
回答:借助路由算法获取,路由算法就是根据路由和文档
id
计算目标的分片
id
的过程。
1shard = hash(_routing) % (num_of_primary_shards)
详细描述一下
Elasticsearch
搜索的过程?
解答:
搜索拆解为
“query then fetch”
两个阶段。
query
阶段的目的:定位到位置,但不取。
步骤拆解如下:
(
1
)假设一个索引数据有
5
主
+1
副本 共
10
分片,一次请求会命中(主或者副本分片中)的一个。
(
2
)每个分片在本地进行查询,结果返回到本地有序的优先队列中。
(
3
)第
2
)步骤的结果发送到协调节点,协调节点产生一个全局的排序列表。
fetch
阶段的目的:取数据。
路由节点获取所有文档,返回给客户端。
Elasticsearch
在部署时,对
Linux
的设置有哪些优化方法
解答:
(
1
)关闭缓存
swap;
(
2
)堆内存设置为:
Min
(节点内存
/2, 32GB
)
;
(
3
)设置最大文件句柄数;
(
4
)线程池
+
队列大小根据业务需要做调整;
(
5
)磁盘存储
raid
方式
——
存储有条件使用
RAID10
,增加单节点性能以及避免单节点存储故障。