笔记五十三:Hot & Warm 架构与 Shard Filtering
日志类应用的部署结构
什么是 Hot & Warm Architecture
- 什么是 Hot & Warm Architecture
- 数据通常不会有 Update 操作;适用于 Time based 索引数据(生命周期管理),同时数据量比较大的
场景 - 引入 Warm 节点,低配置大容量的机器存放老数据,以降低部署成本
- 数据通常不会有 Update 操作;适用于 Time based 索引数据(生命周期管理),同时数据量比较大的
- 两类数据节点, 不同的硬件配置
- Hot 节点(通常使用 SSD):索引有不断有新文档写入。通常使用 SSD
- Warm 节点(通常使用 HDD):索引不存在新数据的写入;同时也不存在大量的数据查询
Hot Nodes
- 用于数据的写入
- Indexing 对 CPU 和 IO 都有很高的要求。所以需要使用高配置的机器
- 存储的性能要好。建议使用 SSD
Warm Nodes
- 用于保存只读的索引,比较旧的数据
- 通常使用大容量的磁盘(通常是 Spinning Disks)
配置 Hot & Warm Architecture
- 使用 Shard Filtering,步骤分为以下几步
- 标记节点 (Tagging)
- 配置索引到 Hot Node
- 配置索引到 Warm 节点
标记节点
- 需要通过 “node.attr” 来标记一个节点
- 节点的 attribute可以是任何的 key/value
- 可以通过 elasticsearch.yml 或者通过 –E 命 令指定
GET /_cat/nodeattrs?v
node host ip attr value
es7_01 172.28.0.2 172.28.0.2 ml.machine_memory 3973386240
es7_01 172.28.0.2 172.28.0.2 xpack.installed true
es7_01 172.28.0.2 172.28.0.2 ml.max_open_jobs 20
配置 Hot 数据
- 创建索引时候,指定将其创建在 hot 节点上
PUT log-2020-03-04 { "settings": { "number_of_shards": 2, "number_of_replicas": 0, "index.routing.allocation.require.my_node_type":"hot" } } //return index shard prirep state docs store ip node log-2020-03-04 1 p STARTED 0 230b 172.18.0.6 es7_hot log-2020-03-04 0 p STARTED 0 230b 172.18.0.6 es7_hot
旧数据移动到 Warm 节点
Index.routing.allocation
是一个索引级的 dynamic setting,可以通过 API 在后期进行设定- Curator / Index Life Cycle Management Tool
PUT log-2020-03-04/_settings { "index.routing.allocation.require.my_node_type":"warm" } //return index shard prirep state docs store ip node log-2020-03-04 1 p STARTED 0 230b 172.18.0.4 es7_warm log-2020-03-04 0 p STARTED 0 230b 172.18.0.2 es7_warm
- Curator / Index Life Cycle Management Tool
Rack Awareness
- ES 的节点可能分布在不同的机架
- 当一个机架断电,可能会同时丢失几个节点
- 如果一个索引相同的主分片和副本分片,同时在这个机架上,就 有可能导致数据的丢失
- 通过 Rack Awareness 的机制,就可以尽可能避免将同一个索引 的主副分片同时分配在一个机架的节点上
- 一个机架断电,数据可以恢复
标记 Rack 节点 + 配置集群
Shard Filtering
- Shard Filtering
node.attr
- 标记节点index.routing.allocation
– 分配索引到节点
设置 | 分配索引到节点,节点的属性规则 |
---|---|
Index.routing.allocation.include.{attr} |
至少包含一个值 |
Index.routing.allocation.exclude.{attr} |
不能包含任何一个值 |
Index.routing.allocation.require.{attr} |
所有值都需要包含 |
本作品采用《CC 协议》,转载必须注明作者和本文链接