【中间件设计 集群设计大横评 一】ElasticSearch、Redis和Kafka—集群架构

在现代分布式系统中,集群架构是保证高可用、可扩展和高性能的核心。Elasticsearch、Redis和Kafka作为各自领域的代表,其集群设计体现了不同的分布式系统哲学。本文将详细剖析这三种组件的集群架构,并横向对比它们的设计理念与异同。


一、ElasticSearch 集群基础架构

1 集群组成结构

  • 集群(Cluster):由一个或多个节点组成,通过集群名称组织在一起,共同承担数据存储与搜索任务。
  • 节点(Node):集群中的单个服务器,参与数据存储与查询。每个节点都有唯一标识(节点 ID)。
  • 索引(Index):具有相似特征的文档集合,类似于关系数据库中的表。
  • 分片(Shard):索引被拆分成多个物理单元,每个分片是一个独立的 Lucene 索引。分片分为主分片(Primary Shard)和副本分片(Replica Shard)。
  • 副本(Replica):主分片的拷贝,用于提高数据可用性和查询并发能力。副本分片不能与主分片分配在同一节点。

2 节点类型与角色

ES 节点通过配置文件中的角色标识决定其职责。主要节点类型如下:

节点类型 角色标识 作用
候选主节点 node.master: true 参与主节点选举,持有集群状态。生产环境通常配置多个,形成高可用“裁决团”。
数据节点 node.data: true 存储数据分片,执行数据相关的 CRUD、聚合等操作,对 CPU、内存、IO 要求较高。
协调节点 node.master: false
node.data: false
接收客户端请求,路由到数据节点,合并结果返回。不存储数据,不参与选举。可作为专用节点独立部署。
Ingest 节点 node.ingest: true 数据预处理节点,可在索引前对文档进行转换、 enrichment 等。生产可按需开启。

默认情况下,未显式配置的节点会同时具备 master(候选)、dataingest 角色。但在生产环境中,强烈建议角色分离,以避免主节点因数据负载过重而变得不稳定。


3 生产实践中的节点配置

专用主节点,专用数据节点,专用协调节点

1 专用主节点(Master-eligible Nodes)

  • 作用:组成“裁决团”,负责集群元数据管理、分片分配、节点加入/离开等。它们不存储数据,仅维护集群状态并参与选主。
  • 配置示例elasticsearch.yml):

    node.master: true
    node.data: false
    node.ingest: false
    
  • 数量与规格

    • 通常部署 3 台(奇数,保证多数派),可容忍 1 台故障。
    • 规格要求:CPU 中等,内存不必太大(8-16GB 足够),磁盘不需要大容量(仅存日志和元数据)。
    • JVM 堆内存设置为物理内存的一半,不超过 32GB。

2 专用数据节点(Data Nodes)

  • 作用:承担所有数据存储与查询负载。
  • 配置示例

    node.master: false
    node.data: true
    node.ingest
© 版权声明

相关文章