【中间件设计 集群设计大横评 一】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: falsenode.data: false
|
接收客户端请求,路由到数据节点,合并结果返回。不存储数据,不参与选举。可作为专用节点独立部署。 |
| Ingest 节点 | node.ingest: true |
数据预处理节点,可在索引前对文档进行转换、 enrichment 等。生产可按需开启。 |
默认情况下,未显式配置的节点会同时具备 master(候选)、data、ingest 角色。但在生产环境中,强烈建议角色分离,以避免主节点因数据负载过重而变得不稳定。
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
© 版权声明
文章版权归作者所有,未经允许请勿转载。