美文网首页
ElasticSearch | Hot & Warm 架构 |

ElasticSearch | Hot & Warm 架构 |

作者: 乌鲁木齐001号程序员 | 来源:发表于2020-06-01 17:22 被阅读0次

    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

    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} 的所有值

    相关文章

      网友评论

          本文标题:ElasticSearch | Hot & Warm 架构 |

          本文链接:https://www.haomeiwen.com/subject/bndszhtx.html