存储层面
冷热数据分离存储,热数据(比如最近 3 天或者一周的数据),其余为冷数据。对于冷数据不会再写
入新数据,可以考虑定期 force_merge 加 shrink 压缩操作,节省存储空间和检索效率。
部署层面
一旦之前没有规划,这里就属于应急策略。
结合 ES 自身的支持动态扩展的特点,动态新增机器的方式可以缓解集群压力,注意:如果之前主
节点等规划合理,不需要重启集群也能完成动态新增的。
elasticsearch 是如何实现 master 选举的
面试官:想了解 ES 集群的底层原理,不再只关注业务层面了。
前置前提:
1、只有候选主节点(master:true)的节点才能成为主节点。
2、最小主节点数( min masternodes)的目的是防止脑裂。
这个我看了各种网上分析的版本和源码分析的书籍,云里雾里。
核对了一下代码,核心入口为 findMaster,选择主节点成功返回对应 Master,否则返回 null。选举
流程大致描述如下:
第一步:确认候选主节点数达标,elasticsearch. yml 设置的值 discovery. zen. minimum_master_nodes;
第二步:比较:先判定是否具备 master 资格,具备候选主节点资格的优先返回;若两节点都为候
选主节点,则 id 小的值会主节点。注意这里的 id 为 string 类型。
题外话:获取节点 id 的方法。
1GET/_cat/ nodes?v&h= ip, port,heapPercent,heapMax, id, name 2ip port heapPercent heapMax id
name
详细描述一下 Elasticsearch 索引文档的过程
面试官:想了解 ES 的底层原理,不再只关注业务层面了。
这里的索引文档应该理解为文档写入 ES,创建索引的过程。
文档写入包含:单文档写入和批量 bulk 写入,这里只解释一下:单文档写入流程。
第一步:客户写集群某节点写入数据,发送请求。(如果没有指定路由/协调节点,请求的节点扮演
路由节点的角色。)
第二步:节点 1接受到请求后,使用文档_id 来确定文档属于分片 0。请求会被转到另外的节点,假
定节点 3。因此分片 0 的主分片分配到节点 3 上。