面试题答案
一键面试基于节点属性过滤
- 实现原理:通过在节点配置文件(如
elasticsearch.yml
)中定义自定义属性,例如node.attr.rack: rack1
,在创建索引或执行操作时,可以使用这些属性来指定目标节点。比如在创建索引时,设置index.routing.allocation.require.rack: rack1
,就只会将分片分配到具有rack1
属性的节点上。 - 应用场景:适用于数据中心有多机架、多机房等物理环境划分场景,希望按照物理位置等属性来分配数据分片,以提高数据的可用性和读写性能。例如,在跨机房的集群中,根据机房属性进行节点过滤,确保不同机房都有数据副本,降低机房故障带来的数据丢失风险。
基于负载过滤
- 实现原理:Elasticsearch 内部会监控节点的负载指标,如 CPU 使用率、内存使用率、磁盘 I/O 等。可以设置相关的负载阈值,当节点负载超过阈值时,会减少新分片分配到该节点。例如通过动态配置
cluster.routing.allocation.node_concurrent_recoveries
(节点同时恢复的分片数),根据节点负载动态调整,负载高时减少该值,降低节点压力。 - 应用场景:当集群中部分节点性能较弱,或者希望在整体负载均衡的情况下,避免某些节点负载过高影响服务质量时使用。比如在混合了高性能和低性能服务器的集群中,通过负载过滤,防止低性能节点因过载而响应缓慢甚至崩溃。
基于角色过滤
- 实现原理:Elasticsearch 支持为节点定义不同角色,如
master
、data
、ingest
等。可以基于这些角色来过滤节点,例如只允许data
角色的节点参与数据存储和检索操作。在节点配置文件中设置node.master: false
和node.data: true
来定义该节点为纯数据节点,然后在操作时可指定仅对数据节点进行操作。 - 应用场景:在大型集群中,为了实现职责分离,提高集群的稳定性和管理效率。例如将数据处理和索引管理等不同功能分配到不同角色的节点上,通过基于角色过滤确保操作只在合适角色的节点上执行。例如,只在
ingest
角色节点上进行数据预处理,避免在其他角色节点上执行不必要的操作。