欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ElasticSearch | Hot & Warm 架构 | Shard Filtering

程序员文章站 2022-03-15 17:32:50
...

Hot Node

  • 用于数据的写入;
  • Indexing 对 CPU 和 IO 都有很高的要求,所以需要使用高配置的机器;
  • 存储的性能要好,建议使用 SSD;

Warm Node

  • 用于保存只读的数据,比较旧的数据;
  • 同行使用大容量的磁盘,比如 Spinning Disks;

配置 Hot & Warm 架构 | 举个栗子

标记一个 Hot 节点
  • node.attr.my_node_type=hot 中的 my_node_type 和 hot 是可以任意指定的;

bin/elasticsearch -E node.name=hotnode -E cluster.name=geektime -E path.data=hot_data -E node.attr.my_node_type=hot

标记一个 Warm 节点
  • node.attr.my_node_type=hot 中的 my_node_type 和 warm 是可以任意指定的;

bin/elasticsearch -E node.name=warmnode -E cluster.name=geektime -E path.data=warm_data -E node.attr.my_node_type=warm

查看集群信息
GET /_cat/nodeattrs?v
配置索引到 Hot Node
PUT logs-2019-06-27
{
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":0,
    "index.routing.allocation.require.my_node_type":"hot"
  }
}

PUT my_index1/_doc/1
{
  "key":"value"
}
查看索引 logs-2019-06-27 的 Shard 分布
  • 分布在了 hotnode 上;
GET _cat/shards?v
移动索引到 Warm 节点
PUT PUT logs-2019-06-27/_settings
{  
  "index.routing.allocation.require.my_node_type":"warm"
}
查看索引 logs-2019-06-27 的 Shard 分布
  • 分布在了 warmnode 上;
GET _cat/shards?v

Rack Awareness

ElasticSearch | Hot & Warm 架构 | Shard Filtering
Rack Awareness.png
  • ElasticSearch 的节点可能分布在不同的机架;
  • 当一个机架断电,可能同时丢失几个节点;
  • 如果一个索引相同的主分片和副本分片,同时在这个机架上,就有可能导致数据的丢失;
  • 通过 Rack Awareness 的机制,就可以尽可能避免将同一个索引的主副分片同时分配在一个机架的节点上;

Rack Awareness | 举个栗子

启动第一个节点 | node.attr.my_rack_id=rack1

bin/elasticsearch -E node.name=node1 -E cluster.name=geektime -E path.data=node1_data -E node.attr.my_rack_id=rack1

启动第二个节点 | node.attr.my_rack_id=rack2

bin/elasticsearch -E node.name=node2 -E cluster.name=geektime -E path.data=node2_data -E node.attr.my_rack_id=rack2

告诉 ElasticSearch 用于 Rack Awareness 的 attribute 是哪个
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.awareness.attributes": "my_rack_id"
  }
}
创建索引 my_index1
PUT my_index1
{
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":1
  }
}
查看索引 my_index1 的 Shard 分布
  • 索引的主副分片都分布在了不同的节点上;
GET _cat/shards?v

Force Rack Awareness | 举个栗子

启动第一个节点 | node.attr.my_rack_id=rack1

bin/elasticsearch -E node.name=node1 -E cluster.name=geektime -E path.data=node1_data -E node.attr.my_rack_id=rack1

启动第二个节点 | node.attr.my_rack_id=rack1

bin/elasticsearch -E node.name=node2 -E cluster.name=geektime -E path.data=node2_data -E node.attr.my_rack_id=rack1

必须把主副本分片分布在 rack1 和 rack2 上面
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.awareness.attributes": "my_rack_id",
    "cluster.routing.allocation.awareness.force.my_rack_id.values": "rack1,rack2"
  }
}
创建索引 my_index1
PUT my_index1
{
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":1
  }
}

PUT my_index1/_doc/1
{
  "key":"value"
}
查看集群的健康状态
  • 黄色的,副本分片未能成功分配;
GET _cluster/health
查看黄色的原因
  • 两个节点都分布在了一个机架上,副本分片要和主分片分配在不同的机架上,但是只有机架 rack1,所以副本分片无法分配;
GET _cluster/allocation/explain?pretty

Shard Filtering

设置 分配索引到节点,节点的属性规则
index.routing.allocation.include.{attr} 集群的属性中至少包含 {attr} 中的一个值
index.routing.allocation.exclude.{attr} 集群的属性中不能包含 {attr} 中的任何一个值
index.routing.allocation.require.{attr} 集群的属性中需要包含 {attr} 的所有值