首页 > 其他分享 >个人技能总结-ES集群部分技能总结

个人技能总结-ES集群部分技能总结

时间:2024-08-13 14:06:19浏览次数:7  
标签:总结 index cluster 索引 集群 分片 节点 ES 技能

ES集群架构总结规划
ES 应用场景
Elasticsearch(ES)是一款功能强大的分布式搜索引擎,广泛应用于各种场景。以下是其主要应用场景的详细介绍:
Elasticsearch被广泛用于构建全文搜索引擎,能够快速而准确地搜索大量的文本数据,并提供高效的分析和聚合功能。例如,维基百科和百度百科使用ES进行高亮和搜索推荐。
Elasticsearch在日志管理、日志分析、日志安全指标监控、应用性能监控等方面有广泛应用。它支持近实时的存储和检索数据,可以处理大规模的日志数据。例如,在京东到家订单系统中,ES集群存储了超过10亿个文档的数据。
Elasticsearch可以作为数据库的加速层,提高查询性能和系统吞吐量。
Elasticsearch被用于基础设施指标和容器监测、应用程序性能监测等场景。它可以对各种监控数据进行实时分析和可视化。
Elasticsearch支持地理空间数据的存储和查询,适用于地图服务、位置数据分析等场景。
Elasticsearch还支持机器学习功能,可以用于数据分析、模式识别和预测模型的训练。
Elasticsearch 5.3及以后版本引入了跨集群搜索功能(CCS),允许用户通过当前ES集群去查询远程ES集群中的数据,这在多集群部署的环境中非常有用。
在金融领域,Elasticsearch利用其高效搜索与聚合特性,用于处理和分析大量的金融数据,帮助金融机构实现数据驱动的决策。
Elasticsearch独特的向量检索功能可以帮助构建基于语义、图像的AI深度应用。
Elasticsearch支持多租户模式,可以在同一个集群中创建多个独立的索引,实现数据的隔离和共享。此外,它还支持故障转移和自动恢复,可以实现无缝的集群管理和维护。
总之,Elasticsearch以其强大的搜索能力、灵活的数据处理能力和广泛的应用场景,成为企业级搜索和数据分析的重要工具。
ES 容量规划
如果你真的担心数据的快速增长, 我们建议你多关心这条限制: ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 我们推荐你最多分配7到8个分片.
JVM 1G -> 5-25shard -> 10-30G /20-50G

  1. 确定单个节点上的最大分片数量
    根据Elasticsearch官方文档和社区经验,每个节点上可以存储的分片数量与可用的堆内存大小成正比关系。一个常见的经验法则是确保每个节点的分片数量低于每GB堆内存配置20到25个分片。例如,如果一个节点有8GB的堆内存,则该节点最多可以容纳200到250个分片。
  2. 分片大小的确定
    分片的大小应保持在合理范围内,以避免因过大的分片导致恢复速度变慢或查询性能下降。通常情况下,业务场景下建议单个分片大小保持在10-30GB之间,日志场景则可以保持在20-50GB之间。
  3. 副本设置
    副本用于提高系统的容错性和查询效率。一般情况下,生产环境中至少需要设置一个副本。对于数据量较小且写入压力较低的索引,可以设置3~5个分片并配置1个副本(即一主一从,共两副本)。对于大型商业应用,建议至少设置2个副本,以确保高可用性。
  4. 分片分配策略
    为了保证集群的平衡性,Elasticsearch运行了一个名为rebalance的自动过程,它会将分片在集群中的节点之间移动以改善其平衡。此外,可以通过显式控制分片和副本的分配位置来进一步优化性能。
  5. 动态调整限制
    虽然Elasticsearch允许动态调整分片数量,但这种操作会非常耗时且可能影响集群的稳定性。因此,建议在创建索引时就做好充分的规划,并尽量避免后期频繁调整。
    ES 整体架构
  6. 集群基本组成
    一个ES集群由多个节点(Node)组成,每个节点是一个独立的服务器,运行着Elasticsearch的实例。这些节点通过互相通信来实现数据的分发和同步。
  7. 节点角色
    在ES集群中,节点可以分为以下几种角色:
    Master节点:负责集群的管理和元数据维护,如索引创建、删除等操作。通常需要至少三个节点来避免脑裂现象。
    Data节点:主要负责存储和处理数据,包括文档的读写、搜索和聚合等操作。
    Ingest节点:用于数据转换和预处理,提高查询效率。
  8. 分片与副本
    ES中的数据索引由多个分片(Shard)组成,每个分片又分为主分片(Primary Shard)和副分片(Replica Shard)。主分片可以进行读写操作,而副分片仅提供读功能。分片的分布策略确保了数据的高可用性和负载均衡。
  9. 数据存储与持久化
    ES默认将索引存储在内存中,当内存满时,再持久化到Gateway里。这样设计既提高了性能,又保证了数据的安全性。
  10. 高可用性与扩展性
    ES集群具有很好的高可用性和扩展性。即使部分节点停止服务,整个集群的服务也不会受到影响。此外,通过水平扩容,可以轻松增加节点数量以应对更大的数据量和更高的并发请求。
  11. 发现机制
    ES内置了自动发现机制,通过配置elasticsearch.yml 文件中的cluster.name 参数,可以将不同的节点连接到同一个集群中。这种机制支持多种插件方式,以适应不同的网络环境和需求。
  12. 系统架构层次
    ES的五层架构设计图显示了其基于Lucene架构实现的核心层,以及支持HTTP、Thrift、Memcache等多种协议的接口层。
  13. 实战应用与优化
    在实际应用中,需要根据具体业务场景对ES集群进行容量规划、性能调优和生命周期管理。例如,合理设计索引mapping、实施镜像备份策略、开发中间层屏蔽管理细节等
    ES 配置文件详解
    Elasticsearch 有三个配置文件:
    elasticsearch.yml 用于配置 Elasticsearch
    jvm.options 用于配置 Elasticsearch JVM 设置
    log4j2.properties 用于配置 Elasticsearch 日志记录
    重要的elasticsearch配置项
    path.data: es索引的数据流写入的目录。多路径配置会在未来版本删除
    path.logs: es索引的日志写入的目录。 多路径配置会在未来版本删除
    cluster.name: logging-prod 只有同一个集群名称, 才能加入同一个集群。
    node.name 用作 Elasticsearch 特定实例的人类可读标识符。
    network.host: 192.168.1.10
    discovery.seed_hosts 开箱即用,无需任何网络配置,Elasticsearch 将绑定到可用的环回地址,并扫描本地端口 9300 至 9305,以与运行在同一服务器上的其他节点连接。这种行为提供了一种无需进行任何配置的自动集群体验
    cluster.initial_master_nodes 集群首次成功形成后,删除每个节点配置中的 cluster.initial_master_nodes 设置。重新启动集群或向现有集群添加新节点时,不要使用此设置。
    http.max_content_length: 200mb
    gateway.expected_nodes: 2
    indices.breaker.request.limit: 30%
    indices.queries.cache.size: 20%
    indices.requests.cache.size: 2%
    xpack.security.enabled: true
    xpack.license.self_generated.type: basic
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
    cluster.routing.allocation.enable
    logger.org.elasticsearch.discovery: DEBUG
    要获取更多或更少的详细日志,请使用集群更新设置 API 更改相关记录器的日志级别。每个记录器都接受 Log4j 2 的内置日志级别,从最低到最详细:OFF、FATAL、ERROR、WARN、INFO、DEBUG 和 TRACE。默认日志级别为 INFO。以较高详细级别(DEBUG 和 TRACE)记录的消息仅供专家使用。
    可以通过在 elasticsearch.yml 中设置 node.role 来定义节点的角色。如果设置 node.roles,则仅为节点分配指定的角色。如果不设置 node.role,则会为节点指定以下角色:
    node.role:
    master
    data
    data_content
    data_hot
    data_warm
    data_cold
    data_frozen
    ingest
    ml
    remote_cluster_client
    transform
    node.roles: [ master ]
    主资格节点
    主节点负责轻量级集群范围的操作,例如创建或删除索引、跟踪哪些节点是集群的一部分,以及决定将哪些分片分配给哪些节点。拥有一个稳定的主节点对集群健康非常重要。
    任何不是仅投票节点的主资格节点都可以通过主选举过程被选为主节点。
    node.roles: [ data ]
    数据节点
    数据节点保存包含已编制索引的文档的分片。数据节点处理与数据相关的操作,如 CRUD、搜索和聚合。这些操作是 I/O 密集、内存密集和 CPU 密集型的。监视这些资源并在它们过载时添加更多数据节点非常重要。
    拥有专用数据节点的主要好处是主角色和数据角色的分离。
    node.roles: [ data_content ]
    内容数据节点
    内容数据节点是内容层的一部分。存储在内容层中的数据通常是产品目录或文章归档等项目的集合。与时间序列数据不同,随着时间的推移,内容的价值保持相对恒定,因此随着时间的增长,将其移动到具有不同性能特征的层是没有意义的。内容数据通常具有较长的数据保留期要求,你希望能够快速检索项目,而不管项目的使用年限如何。
    内容层节点通常针对查询性能进行优化-它们将处理能力优先于 IO 吞吐量,以便能够处理复杂的搜索和聚合,并快速返回结果。虽然他们也负责索引,但内容数据的摄取率通常不如日志和度量等时间序列数据高。从弹性角度来看,应将此层中的索引配置为使用一个或多个副本。
    需要内容层。不属于数据流的系统索引和其他索引将自动分配给内容层。
    node.roles: [ data_hot ]
    热门数据节点
    热门数据节点是热层的一部分。热层是时间序列数据的 Elasticsearch 入口点,保存最新、最频繁搜索的时间序列数据。热层中的节点需要快速读取和写入,这需要更多的硬件资源和更快的存储(SSD)。为了恢复,应将热层中的索引配置为使用一个或多个副本。
    热层是必需的。作为数据流一部分的新索引将自动分配给热层。
    node.roles: [ data_warm ]
    温数据节点
    温数据节点是热层的一部分。一旦时间序列数据的查询频率低于热层中最近索引的数据,它就可以移动到温层。温层通常保存最近几周的数据。仍然允许更新,但可能不频繁。温层中的节点通常不需要像热层中那样快。为了恢复,应将温层中的索引配置为使用一个或多个副本。
    node.roles: [ data_cold ]
    冷数据节点
    冷数据节点是冷层的一部分。当你不再需要定期搜索时间序列数据时,它可以从温层移动到冷层。虽然仍然可以搜索,但这一层通常是为了降低存储成本而不是搜索速度而优化的。
    为了更好地节省存储空间,你可以在冷层保留可搜索快照的完全挂载索引。与常规索引不同,这些完全装载的索引不需要副本以提高可靠性。如果发生故障,他们可以从基础快照恢复数据。这可能会使数据所需的本地存储减半。需要快照存储库才能在冷层中使用完全装载的索引。完全装入的索引是只读的。
    或者,你可以使用冷层来存储带有副本的常规索引,而不是使用可搜索的快照。这允许你在较便宜的硬件上存储较旧的数据,但与热层相比,不会减少所需的磁盘空间。
    node.roles: [ data_frozen ]
    冻结数据节点
    冻结数据节点是冻结层的一部分。一旦数据不再被查询,或者很少被查询,它可能会从冷层移动到冻结层,在那里它会一直保存。
    冻结层需要快照存储库。冻结层使用部分挂载的索引来存储和加载快照存储库中的数据。这降低了本地存储和操作成本,同时仍允许你搜索冻结的数据。由于 Elasticsearch 有时必须从快照存储库获取冻结数据,因此冻结层上的搜索通常比冷层上的慢。
    node.roles: [ ingest ]
    摄取节点
    摄取节点可以执行由一个或多个摄取处理器组成的预处理管道。根据摄取处理器执行的操作类型和所需的资源,使用专用的摄取节点可能是有意义的,这些节点将仅执行此特定任务。
    node.roles: [ remote_cluster_client ]
    远程资格节点
    符合条件的远程节点充当跨集群客户端并连接到远程集群。连接后,可以使用跨集群搜索来搜索远程集群。你还可以使用跨集群复制在集群之间同步数据。
    node.roles: [ ml, remote_cluster_client]
    机器学习节点
    机器学习节点运行作业并处理机器学习 API 请求。有关更多信息,参阅机器学习设置。
    要创建专用机器学习节点,请设置:
    node.roles: [ ml, remote_cluster_client]
    remote_cluster_client 角色是可选的,但强烈建议使用。否则,在机器学习作业或数据反馈中使用跨集群搜索时会失败。如果在异常检测作业中使用跨集群搜索,则所有符合条件的主节点上也需要 remote_cluster_client 角色。否则,无法启动数据馈送。参阅远程资格节点。
    ES数据分层实践
    在Elasticsearch中设置数据分层,可以参考以下步骤和最佳实践:
  14. 创建Policy:
    首先,需要定义一个Policy来控制索引的生命周期。这个Policy将决定索引从创建到删除的各个阶段以及每个阶段持续的时间。
  15. 创建索引模板:
    使用Policy创建索引模板,这样可以在集群中自动应用这些规则。例如,可以设置3天后进入warm阶段,7天后进入delete阶段,并最终执行删除操作。
  16. 创建初始索引:
    在实际操作中,首先创建一个新的索引,并将其写入到热节点上。当索引达到特定条件后,数据会滚动(Rollover)写入到新索引。
  17. 迁移与调整:
    索引在热节点上滚动完成后,在hot阶段停留三天后,会迁移到温节点(warm阶段)。在warm阶段将索引设置为只读,并减少副本数量和主分片个数。
    在暖节点上停留七天后,索引将进入delete阶段,并最终被删除。
  18. 配置数据分层检查器:
    数据分层检查器用于规范目标分层中表的命名格式,便于后期管理。通过配置检查器,可以确保同一分层中的表名称具有统一的命名格式,从而帮助理解该表所属的业务类型、作用功能和数据粒度等信息。
  19. 个性化处理:
    如果有特殊需求,可以抽象出临时表层(TMP层),并在创建表时严格地将表归属到对应的分层中。对每个分层设定一些标准和校验规则,如命名规范、生命周期设置等。
    通过以上步骤,可以有效地在Elasticsearch中实现数据分层管理,从而提高数据的可维护性和查询效率
  20. 样例
    索引的生命周期分为四个阶段:HOT->WARM->COLD->DELETE。
    上面除了HOT为必须的阶段外,其他为非必须阶段,可以任意选择配置。因为日志索引只要满足自己删除功能,所以下文只配置了HOT与DELETE阶段。
    三步实现完成es生命周期管理
    配置策略(policy)、索引模版(template)、索引(index)
    1, 配置策略(policy)
    PUT _ilm/policy/datastream_policy
    {
    "policy": {
    "phases": {
    "hot": {
    "actions": {
    "rollover":{
    "max_docs":1
    }
    }
    },
    "delete": {
    "min_age": "30s",
    "actions": {
    "delete": {}
    }
    }
    }
    }
    }
    创建了一个 “datastream_policy”策略,策略含义是:当hot阶段索引文档超过一条,就会发生rollover——便于测试,
    delete阶段,超过30s执行删除动作。
    还可以选择其它维度控制,索引大小,索引时间:
    "max_size": "50GB"
    "max_age": "30d"
    2, 索引模版(template)
    PUT _template/datastream_template
    {
    "index_patterns": ["datastream-"],
    "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "datastream_policy",
    "index.lifecycle.rollover_alias": "datastream"
    }
    }
    创建了一个索引模板,"index_patterns": ["datastream-
    "],索引以datastream-开头的则自动采用setting的配置;
    "index.lifecycle.name": "datastream_policy", 采用”datastream_policy“的策略;
    "index.lifecycle.rollover_alias": "datastream",创建使用该模版创建的索引统一用”datastream“的别名进行管理
    3, 索引(index)
    PUT datastream-000001
    {
    "aliases": {
    "datastream": {
    "is_write_index": true
    }
    }
    }
    创建一个初始索引,并设置索引可写入。
    4, 配置lifecycle检测时间
    PUT /_cluster/settings{
    "transient": {
    "indices.lifecycle.poll_interval": "10s"
    }
    }
    默认十分钟,便于测试,改为10s。
    5, 验证
    POST datastream/_doc
    {
    "message":"hello world"
    }
    通常对外暴露别名,所以索引采用别名写入数据,
    因为,别名”datastream“匹配index_patterns,写入后,es根据配置的策略“datastream_policy”进行rollover。
    用以下命令查看索引rollover进度。
    GET datastream-*/_ilm/explain
    {
    "indices" : {
    "datastream-000002" : {
    "index" : "datastream-000002",
    "managed" : true,
    "policy" : "datastream_policy",
    "lifecycle_date_millis" : 1596442291089,
    "age" : "43.77s",
    "phase" : "hot",
    "phase_time_millis" : 1596442292420,
    "action" : "rollover",
    "action_time_millis" : 1596442301555,
    "step" : "check-rollover-ready",
    "step_time_millis" : 1596442301555,
    "phase_execution" : {
    "policy" : "datastream_policy",
    "phase_definition" : {
    "min_age" : "0ms",
    "actions" : {
    "rollover" : {
    "max_docs" : 1
    }
    }
    },
    "version" : 1,
    "modified_date_in_millis" : 1596441845846
    }
    },
    "datastream-000001" : {
    "index" : "datastream-000001",
    "managed" : true,
    "policy" : "datastream_policy",
    "lifecycle_date_millis" : 1596442291025,
    "age" : "43.83s",
    "phase" : "delete",
    "phase_time_millis" : 1596442330859,
    "action" : "delete",
    "action_time_millis" : 1596442330859,
    "step" : "wait-for-shard-history-leases",
    "step_time_millis" : 1596442330859,
    "phase_execution" : {
    "policy" : "datastream_policy",
    "phase_definition" : {
    "min_age" : "30s",
    "actions" : {
    "delete" : { }
    }
    },
    "version" : 1,
    "modified_date_in_millis" : 1596441845846
    }
    }
    }
    }
    索引自动创建了一个新的"datastream-000002",旧的索引”datastream-000001“ action变成DELETE。
    再过一段时间再次查看索引
    旧的索引已经删除,在做日志查询时,我们只需要使用别名”datastream“进行日志查询即可,es便可无感知完成日志存储删除动作。

ES数据索引操作

  1. 创建索引和mapping
    创建索引和mapping:
    curl -XPUT http://192.168.0.110:19200/position/?pretty -H 'content-Type:application/json' -d ' {
    "mappings":{
    "properties":{
    "title":{
    "type":"text"
    },
    "description":{
    "type":"text"
    },
    "price":{
    "type":"double"
    },
    "onSale":{
    "type":"boolean"
    },
    "type":{
    "type":"integer"
    },
    "createDate":{
    "type":"date"
    }
    }
    }
    }'
    分阶段创建:先单独创建index, 再基于此index创建mapping,语法如下
    创建索引名称为position1:
    curl -XPUT http://192.168.0.110:19200/position1?pretty
    创建mapping
    curl -u elastic:123456 -XPUT http://192.168.173.20:9200/position1/_mappings?pretty -H 'content-Type:application/json' -d ' {"properties": {"name":{"type":"text"},"gender":{"type":"boolean"},"age":{"type":"integer"},"adress":{"type":"text"},"phone":{"type": "keyword"},"updatetime":{"type": "date"}}}'
    ES字段数据类型
    ES 支持非常多的字段数据类型:
    text:默认会进行分词,支持模糊查询(5.x之后版本string类型已废弃,请大家使用text)。
    keyword:不进行分词;keyword类型默认开启doc_values来加速聚合排序操作,占用了大量磁盘io 如非必须可以禁用doc_values。
    number:如果只有过滤场景 用不到range查询的话,使用keyword性能更佳,另外数字类型的doc_values比字符串更容易压缩。
    array:es不需要显示定义数组类型,只需要在插入数据时用'[]'表示即可,'[]'中的元素类型需保持一致。
    range:对数据的范围进行索引;目前支持 number range、date range 、ip range。
    boolean: 只接受true、false 也可以是字符串类型的“true”、“false”
    date:支持毫秒、根据指定的format解析对应的日期格式,内部以long类型存储。
    geo_point:存储经纬度数据对。
    ip:将ip数据存储在这种数据类型中,方便后期对ip字段的模糊与范围查询。
    nested:嵌套类型,一种特殊的object类型,存储object数组,可检索内部子
  2. 创建别名:
    我们为索引my_index创建一个别名my_index_alias,这样我们对my_index_alias的操作就像对my_index的操作一样
    POST /_aliases
    {
    "actions": [
    {
    "add": {
    "index": "my_index",
    "alias": "my_index_alias"
    }
    }
    ]
    }
    别名不仅仅可以关联一个索引,它能聚合多个索引
    我们为索引my_index_1 和 my_index_2 创建一个别名my_index_alias,这样对my_index_alias的操作(仅限读操作),会操作my_index_1和my_index_2,类似于聚合了my_index_1和my_index_2.我们是不能对my_index_alias进行写操作,当有多个索引时alias,不能区分到底操作哪一个。
    POST /_aliases
    {
    "actions": [
    {
    "add": {
    "index": "my_index_1",
    "alias": "my_index_alias"
    }
    },
    {
    "add": {
    "index": "my_index_2",
    "alias": "my_index_alias"
    }
    }
    ]
    }
  3. 创建索引模版
    以动态索引模板创建索引和mapping
    curl -XPUT http://192.168.0.110:19200/template/collegejob_template_1?pretty -H 'content-Type:application/json' -d '{
    "index_patterns":[
    "collegejob
    "
    ],
    "order":0,
    "settings":{
    "number_of_shards":5,
    "number_of_replicas":1,
    "analysis":{
    "analyzer":{
    "comma":{
    "pattern":",",
    "type":"pattern"
    }
    }
    }
    },
    "mappings":{
    "_source":{
    "enabled":true
    },
    "dynamic":"true",
    "date_detection":false,
    "numeric_detection":true,
    "properties":{
    "id":{
    "type":"keyword"
    },
    "recruitment_id":{
    "type":"keyword"
    },
    "demand_number":{
    "type":"text",
    "index":"true",
    "analyzer":"ik_max_word",
    "search_analyzer":"ik_smart",
    "fields":{
    "raw":{
    "type":"keyword",
    "index":true,
    "ignore_above":1024
    }
    }
    },
    "major":{
    "type":"text",
    "analyzer":"comma",
    "search_analyzer":"comma"
    },
    "city":{
    "type":"text",
    "analyzer":"comma",
    "search_analyzer":"comma"
    },
    "updatetime":{
    "type":"date",
    "format":"epoch_millis"
    }
    },
    "dynamic_templates":[
    {
    "string_fields":{
    "match":"
    ",
    "match_mapping_type":"string",
    "mapping":{
    "type":"text",
    "index":"true",
    "analyzer":"ik_max_word",
    "search_analyzer":"ik_smart",
    "fields":{
    "raw":{
    "type":"keyword",
    "index":true,
    "ignore_above":32766
    }
    }
    }
    }
    }
    ]
    },
    "aliases":{
    "{index}-alias":{
    }
    }
    }'
    查看索引模版的位置
    curl -XGET http://192.168.0.110:19200/_template/collegejob_template_1?pretty
    删除索引模板的命令是:
    curl -XDELETE http://192.168.0.110:19200/_template/collegejob_template_1?pretty
    创建索引匹配index
    curl -XPUT http://192.168.0.110:19200/collegejob_position_v20200712_1?pretty
    再次查看索引:curl http://192.168.0.110:19200/_cat/indices?v
    查看索引collegejob_position_v20200712_1的mapping:
    curl http://192.168.0.110:19200/collegejob_position_v20200712_1/_mappings?pretty
  4. ES重建索引实现无缝数据迁移
    基本流程如下
    已经有别名的流程如下
    创新新索引需要指定新的mapping和shard 数量 -> reindex 源到目的->taskid判断迁移完成之后->已有别名的add一条新的index,然后测试新的数据没有问题别名种删除老的index-> 删除旧的index->完成 整个过程业务通过别名访问index 无感知
    没有别名的reindex
    创新新索引需要指定新的mapping和shard 数量 -> reindex 源到目的->taskid判断迁移完成之后->新建别名为老的index 同时add 新的index -> 删除旧的index
    索引重建背景
     集群版本升级:
    当在同一大版本范围内进行升级时,索引读写是兼容的,不需要重建索引。
    不同大版本之间的升级会导致索引读写不兼容,因此需要重建索引。
     集群迁移:
    在集群迁移过程中,为了保证服务的连续性和数据的一致性,可以使用Reindex来实现索引的平滑迁移。这样可以在不停机的情况下完成数据的迁移。
     分片数量调整:
    当最初创建的索引分片数量不足,导致数据入库较慢时,可以通过增加分片数量来提高性能。此时也可以使用Reindex来扩大分片的数量。
     文档结构变更:
    当需要修改已存在的数据结构,例如字段类型或映射(mapping)的变化时,也需要重新建立索引以确保数据的一致性和正确性。
     跨集群数据迁移:
    在不同集群之间进行数据迁移时,可以通过配置reindex远程白名单,将远程集群的访问地址添加到当前集群的远程访问白名单中,从而实现跨集群的数据迁移和索引重建。
     应对高数据量和复杂查询需求:
    对于需要处理大量数据并提供高效搜索服务的场景,通过调整索引的配置和分片数量,可以显著提升系统的性能和响应速度。
     特定业务需求:
    某些特定业务场景下,如更换分词器、优化搜索算法等,可能需要对现有索引进行重建,以便支持新的业务需求和规则。
    综上所述,ES集群索引重建的背景多种多样,主要集中在版本升级、集群迁移、分片调整、文档结构变更以及跨集群数据迁移等方面。这些背景因素共同推动了对ES集群索引重建的需求,并且在实际操作中需要根据具体情况进行详细的规划和实施
     具体步骤如下
    假设之前我们已经存在一个blog索引,因为更换分词器需要对该索引中的数据进行重建索引,以便支持业务使用新的分词规则搜索数据,并且尽可能使这个变化对外服务没有感知,大概分为以下几个步骤:
    新增⼀个索引blog_lastest,Mapping数据结构与blog索引一致
    将blog数据同步至blog_lastest
    删除blog索引
    数据同步后给blog_lastest添加别名blog
    新建索引
    put /blog_lastest/
    {
    "mappings":{
    "properties":{
    "title":{
    "type":"text",
    "analyzer":"ik_max_word"
    },
    "author":{
    "type":"keyword",
    "fields":{
    "seg":{
    "type":"text",
    "analyzer":"ik_max_word"
    }
    }
    }
    }
    },
    "settings": {
    "number_of_shards": 3
    }

}
同步等待
接口将会在 reindex 结束后返回
POST /_reindex
{
"source": {
"index": "blog"
},
"dest": {
"index": "blog_lastest"
}
}
异步执行 直接返回taskid
POST /_reindex?wait_for_completion=false
{
"source": {
"index": "blog"
},
"dest": {
"index": "blog_lastest"
}
}
op_type 参数
op_type 参数控制着写入数据的冲突处理方式,
如果把 op_type 设置为 create【默认值】,在 _reindex API 中,表示写入时只在 dest index中添加不存在的 doucment,如果相同的 document 已经存在,则会报 version confilct 的错误,那么索引操作就会失败。【这种方式与使用 _create API 时效果一致】
如果这样设置了,也就不存在更新数据的场景了【冲突数据无法写入】,我们也可以把 op_type 设置为 index,表示所有的数据全部重新索引创建。
POST _reindex
{
"source": {
"index": "blog"
},
"dest": {
"index": "blog_lastest",
"op_type": "create"
}
}
conflicts 配置
默认情况下,当发生 version conflict 的时候,_reindex 会被 abort,任务终止【此时数据还没有 reindex 完成】,在返回体中的 failures 指标中会包含冲突的数据【有时候数据会非常多】,除非把 conflicts 设置为 proceed。
关于 abort 的说明,如果产生了 abort,已经执行的数据【例如更新写入的】仍然存在于目标索引,此时任务终止,还会有数据没有被执行,也就是漏数了。换句话说,该执行过程不会回滚,只会终止。如果设置了 proceed,任务在检测到数据冲突的情况下,不会终止,会跳过冲突数据继续执行,直到所有数据执行完成,此时不会漏掉正常的数据,只会漏掉有冲突的数据。
POST _reindex
{
"source": {
"index": "blog"
},
"dest": {
"index": "blog_lastest",
"op_type": "create"
},
"conflicts": "proceed"
}
我们可以故意把 op_type 设置为 create,人为制造数据冲突的场景,测试时更容易观察到冲突现象。如果把 conflicts 设置为 proceed,在返回体结果中不会再出现 failures 的信息,但是通过 version_conflicts 指标可以看到具体的数量。
批次大小配置
当你发现reindex的速度有些慢的时候,可以在 query 参数的同一层次【即 source 参数中】添加 size 参数,表示 scroll size 的大小【会影响批次的次数,进而影响整体的速度】,如果不显式设置,默认是一批 1000 条数据,在一开始的简单示例中也看到了。
如下,设置 scroll size 为 5000:
POST /_reindex?wait_for_completion=false
{
"source": {
"index": "blog",
"size":5000
},
"dest": {
"index": "blog_lastest",
"op_type": "create"
},
"conflicts": "proceed"
}
测试后,速度达到了 30 分钟 500 万左右,明显提升了很多。
根据taskId可以实时查看任务的执行状态
一般来说,如果我们的 source index 很大【比如几百万数据量】,则可能需要比较长的时间来完成 _reindex 的工作,可能需要几十分钟。而在此期间不可能一直等待结果返回,可以去做其它事情,如果中途需要查看进度,可以通过 _tasks API 进行查看。
GET /_tasks/{taskId}
{
"completed" : false,
"task" : {
"node" : "dpBihNSMQfSlboMGlTgCBA",
"id" : 4704218,
"type" : "transport",
"action" : "indices:data/write/reindex",
……
}
当执行完毕时,completed为true查看任务进度以及取消任务,
除了根据taskId查看以外,我们还可以通过查看所有的任务中筛选本次reindex的任务。
GET _tasks?detailed=true&actions=*reindex
取消任务
POST _tasks/task_id/_cancel
删除旧索引
当我们通过 API 查询发现任务完成后,就可以进行后续操作,我这里是要删除旧索引,然后再给新索引起别名,用于替换旧索引,这样才能保证对外服务没有任何感知。
DELETE /blog
使用别名
POST /_aliases
{
"actions":[
{
"add":{
"index":"blog_lastest",
"alias":"blog"
}
}
]
}
通过别名访问新索引
POST /blog/_search
{
"query": {
"match": {
"author": "james"
}
}
}
如果搜索结果达到我们的预期目标,至此,数据索引重建迁移完成。
5. ES索引常见操作

  1. 查询相关
    1.实现select功能:_source
    GET dws_person_info/_search
    {
    "_source": ["name","phone_number","address"]
    }
    1.2 剔除不需要的字段
    GET dws_person_info/_search
    {
    "_source": {
    "excludes": ["age","email"]
    }
    }
    1.3 选择需要的,剔除不需要的
    GET dws_person_info/_search
    {
    "_source": {
    "includes": ["name","phone_number","address"],
    "excludes": ["age","email"]
    }
    }
    2.1 模数匹配
    GET dws_person_info/_search
    {
    "query":{
    "match": {
    "address": "成都市"
    }
    }
    }
    2.2 精确匹配
    GET dws_person_info/_search
    {
    "query":{
    "match": {
    "address.keyword": "成都市高新区"
    }
    }
    }
    当然,term也可以实现精确查询。
    GET dws_person_info/_search
    {
    "query":{
    "term": {
    "address": "成都市高新区"
    }
    }
    }
    多值精确匹配,类似于SQL中的in功能。
    GET dws_person_info/_search
    {
    "query": {
    "terms": {
    "address": ["成都市高新区", "成都市锦江区", "成都市成华区"]
    }
    }
    }
    3.1 范围查询
    gte大于等于,g为greatest首字母;lte小于等于,l为least首字母。
    GET dws_person_info/_search
    {
    "query":{
    "range": {
    "age": {
    "gte": 23,
    "lte": 30
    }
    }
    }
    }
    4.1 must
    必须匹配,类似于and。must_not 为不匹配。
    GET dws_person_info/_search
    {
    "query": {
    "bool": {
    "must": [
    {
    "match": {
    "gender": "男性"
    }
    },
    {
    "match": {
    "address": "成都市成华区"
    }
    }
    ]
    }
    }
    }
    4.2 should
    类似于or功能
    GET dws_person_info/_search
    {
    "query": {
    "bool": {
    "minimum_should_match": 1, --满足任意一个即可
    "should": [
    {
    "match": {
    "age": 28
    }
    },
    {
    "match": {
    "gender": "男性"
    }
    },
    {
    "match": {
    "address": "成都市金牛区"
    }
    }
    ]
    }
    }
    }
    5.实现group by 功能:aggs
    5.1 分组聚合
    GET dws_person_info/_search
    {
    "query":{
    "match": {
    "address": "成都市"
    }
    },
    "aggs": {
    "addressAgg": {
    "terms": {
    "field": "address", --按地址分组
    "size": 10,
    "min_doc_count": 55
    }
    },
    "ageAvg":{
    "avg": {
    "field": "age" --年龄平均值
    }
    }
    },
    "size": 20
    }
  2. 排序
    按照age降序,height升序。
    GET dws_person_info/_search
    {
    "query": {
    "match_all": {}
    },
    "sort":[ {
    "age": "desc"
    },{
    "height": "asc"
    }]
    }
    7.实现limit功能:from size
    7.1 从哪条开始查询多少条
    GET dws_person_info/_search
    {
    "query": {
    "match_all": {}
    },
    "from": 1, --从1开始
    "size": 10 --查10条
    }
    8.实现count功能:_count
    8.1 查询表中有多少条数据
    GET dws_person_info/_count
  3. 更新
    新增文档

插入文档

POST /heima/_doc/1
{
"info":"黑马",
"email":"[email protected]",
"name":{
"firstName":"云",
"lastName":"赵"
}
}

修改文档(覆盖)

PUT /heima/_doc/1
{
"info":"黑马",
"email":"[email protected]",
"name":{
"firstName":"云",
"lastName":"赵"
}
}

修改 部分更新

POST /heima/_update/1
{
"doc": {
"email":"zy@qq。com"
}
}

  1. 删除

删除文档

DELETE /heima/_doc/1
ES常见运维管理命令
管理常用命令
 检查ES版本信息
curl IP:9200
 查看集群是否健康
http://IP:9200/_cat/health?v
curl -s -XGET 'http://IP:9200/_cat/health?v'
1 绿色,最健康的状态,代表所有的分片包括备份都可用
2 黄色,预警状态,所有主分片功能正常,但至少有一个副本是不能正常工作的。此时集群是可以正常工作的,但是高可用性在某种程度上会受影响。
3 红色,集群不可正常使用。某个或某些分片及其副本异常不可用,这时集群的查询操作还能执行,但是返回的结果会不准确。对于分配到这个分片的写入请求将会报错,最终会导致数据的丢失。
 查看节点列表
http://IP:9200/_cat/nodes?v
curl 'IP:9200/_cat/nodes?v'
 列出所有索引及存储大小
http://IP:9200/_cat/indices?v
curl 'IP:9200/_cat/indices?v'--查询所有索引及数据大小
 查看任务堆积详情
GET /_cat/pending_tasks
 查看集群元数据状态信息
GET /_cluster/state//
 查看集群指标统计信息
GET /_cluster/stats
 查看集群分片分配详情
GET _cluster/allocation/explain
 更改分片分配
POST /_cluster/reroute
该命令允许我们手动改变集群中某些分片的分配策略。例如我们可以通过该API来将部分分片从指定节点上移动到其他节点,以平衡节点之间分片的数量和磁盘的使用率。
POST/_cluster/rerouteAPI的请求体commands参数中,定义了支持执行的几种属性,分别是move、cancel、allocate_replica、allocate_stale_primary和allocate_empty_primary。下面分别介绍:
1)move,移动分片
move属性可以将一个已经正常分配的分片,从一个节点移动到另外一个节点上。move属性的请求体中接收index名称和要移动的分片号,以及该分片源节点名称和目标节点名称。例如,下面的命令就是向将测试索引wr_index_1的0号分片从节点1626803143110145332中迁移到节点1626803143110145432上。
POST /_cluster/reroute
{
"commands": [
{
"move": {
"index": "wr_index_1",
"shard": 0,
"from_node": "1626803143110145332",
"to_node": "1626803143110145432"
}
}
]
}
2)cancel,取消搬迁或恢复
该属性可以可以分片的恢复或者分配。接收index名称、要取消分片的分片号以及需要取消分配的节点的名称。通常该属性只能取消副本分片的分配或者恢复。如果需要取消主分片的分配,则需要在请求中包含allow_primary标志
POST /_cluster/reroute
{
"commands": [
{
"cancel": {
"index": "wr_index_1",
"shard": 0,
"node": "1626803143110145332"
}
}
]
}
其中node的值不是分片源节点名称,而是目标节点名称。
3)allocate_stale_primary,分配陈旧主分片
该属性的作用是当主分片由于version较旧原因未能正常分配的时候。可以通过allocate_stale_primary属性来使处于stale的主分片正常分配,但是有可能会丢失部分数据,因此需要将accept_data_loss参数设置为true。
POST /_cluster/reroute
{
"commands" : [
{
"allocate_stale_primary" : {
"index" : "wr_index_1",
"shard" : 0,
"node" : "1596598365000222032",
"accept_data_loss": true
}
}
]
}
在执行该命令的时候,需要通过GET _shard_stores?pretty查找stale主分片所在的节点,查找到相关的节点后,然后再进行allocate_stale_primary,也就是说必须是保存了stale分片的节点,而不是其他节点。否则会导致完全丢失数据。
需要注意的是,如果该名称执行成功后,保存了更新副本分片的节点重新加入了集群后,那么该更新副本分片上的数据可能会被删除或者被覆盖。
4)allocate_empty_primary,分配空主分片
allocate_empty_primary属性的作用是可以分配一个空数据的主分片到一个节点上。我们在平常的集群运维工作中,经常会遇到有些索引由于没有设置副本,又遇到文件损坏,导致主分片分配不了的情况。那么针对这种情况,如果客户能够接收丢失一个分片数据,则可以通过如下API来分片一个空数据的主分片,以让集群恢复green。该属性接收的参数信息如下:
POST _cluster/reroute
{
"commands": [
{
"allocate_empty_primary": {
"index": "wr_index_1",
"shard": 0,
"node": "1582165889001471732",
"accept_data_loss": true
}
}
]
}
 查看和设置集群settings信息
GET /_cluster/settings
当我们需要知道集群设置了哪些settings信息时,可以通过GET /_cluster/settingsAPI进行查看,例如我们先设置集群的并发度和迁移速度后,然后执行查看API,则可以看到返回的Response如下:
通过该API,我们能够很清晰得看到手动设置了哪些集群属性信息。
而如果需要修改某些settings属性时,则可以统一使用PUT /_cluster/settingsAPI。下面我们介绍几种常见的属性设置API
1)设置集群分片搬迁并发度和速度
PUT /_cluster/settings
{
"persistent" : {
"cluster.routing.allocation.node_concurrent_recoveries": "8",
"cluster.routing.allocation.cluster_concurrent_rebalance": "8",
"indices.recovery.max_bytes_per_sec": "80mb"
},
"transient" : {
"cluster.routing.allocation.node_concurrent_recoveries": "8",
"cluster.routing.allocation.cluster_concurrent_rebalance": "8",
"indices.recovery.max_bytes_per_sec": "80mb"
}
}
2)设置集群磁盘使用率水位线
PUT /_cluster/settings
{
"persistent": {
"cluster.routing.allocation.disk.watermark.high":"95%",
"cluster.routing.allocation.disk.watermark.low":"93%"
},
"transient": {
"cluster.routing.allocation.disk.watermark.high":"95%",
"cluster.routing.allocation.disk.watermark.low":"93%"
}
}
3)将某个节点上的数据驱逐
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.exclude._name": "161070127670100270532"
},
"transient": {
"cluster.routing.allocation.exclude._name": "161070127670100270532"
}
}
4)设置集群最小选主节点数
PUT _cluster/settings
{
"persistent": {
"discovery.zen.minimum_master_nodes": 2
},
"transient": {
"discovery.zen.minimum_master_nodes": 2
}
}
5)将集群设置为只读
PUT _cluster/settings
{
"transient": {
"cluster.blocks.read_only_allow_delete": true
}
}
6)开启/关闭xpack集群监控采集
PUT _cluster/settings
{
"persistent": {
"xpack.monitoring.collection.enabled": true,
"xpack.monitoring.collection.interval": "10s" // 设置采集周期
}
}
7)开启/关闭集群通配符模式
PUT _cluster/settings
{
"transient": {
"action.destructive_requires_name": "false"
}
}
8)设置集群中每个节点的总分片数
PUT _cluster/settings
{
"transient": {
"cluster.max_shards_per_node": 10000
}
}
9)设置集群mapping更新超时时间
PUT _cluster/settings
{
"transient": {
"indices.mapping.dynamic_timeout": "20s"
}
}
10)开启/关闭集群自动创建索引
PUT _cluster/settings
{
"transient": {
"action.auto_create_index": true
}
}

 集群运维常用命令总结
命令 API命令说明
GET /_cluster/health 查看集群健康状态等信息
GET /_cat/pending_tasks 查看集群任务堆积情况
GET /_cluster/state// 查看集群详细的元数据信息
GET /_cluster/stats 查看集群各维度的统计信息,包括节点CPU、JVM等使用率情况
GET _cluster/allocation/explain 查看集群分片分配详情
POST /_cluster/reroute 更改分片分配策略
GET /_cluster/settings 查看集群层面settings设置信息
GET /_tasks 查看集群中正在执行的task信息

5、创建索引
创建索引名为XX,默认会有5个分片,1个索引
curl -XPUT 'IP:9200/XX?pretty'
curl -k -uelastic:RKnzx1R0NXVoYc2AdCCI -XPUT 'https://172.31.1.4:9201/vehicle?pretty' -H "Content-Type: application/json" -d '{"settings": {"number_of_shards": 3,"number_of_replicas": 1},"mappings": {"properties": {"position": { "type": "geo_point" },"vin": { "type": "keyword" },"userId": { "type": "keyword" },"modelCode":{"type": "keyword" }}}}'
curl -XPUT 'http://192.168.1.2:9200/vehicle?pretty' -H "Content-Type: application/json" -d '{"mappings" : {"status" : {"properties" : {"aveFuelConsumption" : {"type" : "double"},"aveFuelConsumption_ts" : {"type" : "long"},"eventId" : {"type" : "long"},"modelCode" : {"type" : "string","index" : "not_analyzed"},"odometer" : {"type" : "integer"},"odometer_ts" : {"type" : "long"},"position" : {"type" : "geo_point"},"position_ts" : {"type" : "long"},"userId" : {"type" : "string"},"vin" : {"type" : "string"}}}}}'
6、添加一个类型
curl -XPUT 'IP:9200/XX/external/2?pretty' -d '
{
"gwyy": "John"
}'
7、更新一个类型
curl -XPOST 'IP:9200/XX/external/1/_update?pretty' -d '
{
"doc": {"name": "Jaf"}
}'
8、删除指定索引
curl -XDELETE 'IP:9200/_index?pretty' 
9、ES数据定期删除

!/bin/bash

es-index-clear

只保留20天内的日志索引

ip="192.168.1.211 192.168.1.212 192.168.1.213 192.168.1.214 192.168.1.215 192.168.1.216"
LAST_DATA=date -d "-20 days" "+%Y.%m.%d"

删除上个月份所有的索引(根据自己的索引格式编写)

for i in ${ip}
do
curl -XDELETE -uelastic:XleBzj3GmE http://${i}:9200/-${LAST_DATA}.
echo "curl -XDELETE -uelastic:XleBzj3GmE http://${i}:9200/-${LAST_DATA}."
done
10、查看分片状态
curl -XGET http://localhost:9200/_cat/shards
11、查看群集状态
curl -s -XGET 'http://localhost:9200/_cluster/stats?pretty'
12、索引管理
查询全部索引状态
curl 'localhost:9200/_cat/indices?v'
查询状态为red的索引
curl -s -XGET 'http://IP:9200/_cat/indices?health=red
创建索引
curl -XPUT 'localhost:9200/goods_v1?pretty'
14、查看索引
curl '172.31.15.228:9200/goods_v1?pretty'
15、删除索引
curl -XDELETE 'localhost:9200/goods_v1?pretty'
16、优化索引
curl -XPOST "http://127.0.0.1:9200/logstash-2015.10.28/_optimize"
curl -XGET 'http://localhost:9200/logstash-2015.10.28/_search?pretty=true' -d '
{
"query" : {
"matchAll" : {}
}
}' 
curl -XPOST 'http://127.0.0.1:9200/index_name/_refresh' #单个索引刷新
curl -XPOST 'http://127.0.0.1:9200/_refresh' #全部索引刷新
flush释放该索引所占用的内存,并将索引数据保存在磁盘
curl -XPOST 'http://127.0.0.1:9200/index_name/_flush?force'
curl -XPOST 'http://127.0.0.1:9200/_cache/clear'
17、创建别名
curl -XPOST localhost:9200/_aliases -d '
{
"actions": [
{ "add": {
"alias": "goods",
"index": "goods_v1"
}}
]
}'
curl -XPOST "http://192.168.1.2:9200/_aliases" -d '{"actions": [{ "add": {"alias": "vehicle","index": "vehicle1"}}]}'
18、删除并更新别名
curl -XPOST 'http://localhost:9200/_aliases' -d '
{
"actions" : [
{ "remove" : { "index" : "goods_v2", "alias" : "goods" } },
{ "add" : { "index" : "goods_v1", "alias" : "goods" } }
]
}'
19、查看已有别名
curl -XGET 'localhost:9200/_cat/aliases'
20、查看别名对应的索引
curl -XGET 'localhost:9200/_alias/help'
21、查看文件描述符打开数量
curl -s -XGET '127.0.0.1:9200/_nodes/stats/process/?pretty'
22、查看分片状态
curl -XGET "http://127.0.0.1:9200/_cat/shards"
23、查看热点线程 
curl -XGET 'http://127.0.0.1:9200/_nodes/hot_threads'
24、针对不使用的index,进行close。我们需要的时候再进行open,可以节约内存和减轻系统的压力
curl -XPOST 127.0.0.1:9200/index_name/_close
curl -XPOST 127.0.0.1:9200/index_name/_open 25 18520796770
25、查看线程状态
curl -XGET "http://127.0.0.1:9200/_nodes/thread_pool/"
26、修改密码
curl -H "Content-Type:application/json" -XPOST -u elastic 'http://192.168.36.61:9200/_xpack/security/user/elastic/_password' -d '{ "password" : "123456" }'
27、开启关闭索引生命周期策略
GET _ilm/status
POST _ilm/stop
POST _ilm/start
28、索引
curl -XGET -H 'Content-Type: application/json' -uelastic:******* 'http://192.168.1.1:9200/index/_count' -H "Content-Type: application/json" -d '{"query": {"match": {"title":"中国"}}}'
curl -XGET 192.168.1.1:9200/vehicle/_search?pretty -H "Content-Type: application/json" -d '{"query": {"match": {"modelCode": "xxx"}},"sort":{ "odometer": { "order": "desc" }},"size":5}'
29、跨集群单个索引迁移
curl -k -uelastic:RKnzx1R0N -XPOST "https://new_ip:9200/_reindex" -H 'Content-Type:application/json' -d '{"source":{"remote":{"host":"http://ip:9200/","username": "user","password": "password"},"index":"old_index"},"dest":{"index":"new_index"}}'
单个索引迁移
curl -k --user elastic:RKnzx1 -XPOST https://192.168.11.1:9201/_reindex -H "Content-Type: application/json" -d '{"source":{"index":"vehicle"},"dest":{"index":"vehicle_s35"}}'
30、查询单个数据
curl -XGET http://192.168.115.1:9200/index/_search?pretty -H "Content-Type: application/json" -d '{"query": {"match": {"target": "LB37824Z9JH044891"}}}'
31、索引新增数据,通过POST请求,向索引库中添加数据
curl -k --user elastic: -XPOST https://192.168.1.1:9200/index_s35/_doc?pretty -H "Content-Type: application/json" -d '{"userId" : "13777490635","odometer" : 9998,"odometer_ts" : 1634832264006,"position" : {"lat" : 30.337351003008273,"lon" : 121.24645278960611},"position_ts" : 1634832264006}'
查询:GET /索引库名/类型名/id名
curl -k --user elastic: -XGET https://192.168.1.1:9200/index_s35/_doc/NqSjcX8BH3vDcqxRjd3o?pretty
ES面试问题总结(你不知道的事情)
问题一:我们需要多大规模的集群?
需要从以下两个方面考虑:
1.1 当前的数据量有多大?数据增长情况如何?
1.2 你的机器配置如何?cpu、多大内存、多大硬盘容量?
推算的依据:
ES JVM heap 最大可以设置32G 。
30G heap 大概能处理的数据量 10 T。如果内存很大如128G,可在一台机器上运行多个ES节点实例
备注:集群规划满足当前数据规模+适量增长规模即可,后续可按需扩展。
两类应用场景:
A. 用于构建业务搜索功能模块,且多是垂直领域的搜索。数据量级几千万到数十亿级别。一般2-4台机器的规模。
B. 用于大规模数据的实时OLAP(联机处理分析),经典的如ELK Stack,数据规模可能达到千亿或更多。几十到上百节点的规模
问题二:集群中的节点角色如何分配?
节点角色:
Master
node.master: true 节点可以作为主节点
DataNode
node.data: true 默认是数据节点。
Coordinate node 协调节点
如果仅担任协调节点,将上两个配置设为false。
2.2 如何分配:
A. 小规模集群,不需严格区分。
B. 中大规模集群(十个以上节点),应考虑单独的角色充当。特别并发查询量大,查询的合并量大,可以增加独立的协调节点。角色分开的好处是分工分开,不互影响。如不会因协调角色负载过高而影响数据节点的能力。
问题二: 如何避免脑裂问题?
discovery.zen.minimum_master_nodes: (有master资格节点数/2) + 1
这个参数控制的是,选举主节点时需要看到最少多少个具有master资格的活节点,才能进行选举。官方的推荐值是(N/2)+1,其中N是具有master资格的节点的数量。
常用做法(中大规模集群):

  1. Master 和 dataNode 角色分开,配置奇数个master,如3
  2. 单播发现机制,配置master资格节点:
    discovery.zen.ping.multicast.enabled: false —— 关闭多播发现机制,默认是关闭的
    discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"] —— 配置单播发现的主节点ip地址,其他从节点要加入进来,就得去询问单播发现机制里面配置的主节点我要加入到集群里面了,主节点同意以后才能加入,然后主节点再通知集群中的其他节点有新节点加入
  3. 配置选举发现数,及延长ping master的等待时长
    discovery.zen.ping_timeout: 30(默认值是3秒)——其他节点ping主节点多久时间没有响应就认为主节点不可用了
    discovery.zen.minimum_master_nodes: 2 —— 选举主节点时需要看到最少多少个具有master资格的活节点,才能进行选举
    问题三:索引应该设置多少个分片?
    说明:分片数指定后不可变,除非重索引。
    思考:
    分片对应的存储实体是什么?
    存储的实体是索引
    分片是不是越多越好?
    不是
    分片多有什么影响?
    分片多浪费存储空间、占用资源、影响性能
    分片过多的影响:
    每个分片本质上就是一个Lucene索引, 因此会消耗相应的文件句柄, 内存和CPU资源。
    每个搜索请求会调度到索引的每个分片中. 如果分片分散在不同的节点倒是问题不太. 但当分片开始竞争相同的硬件资源时, 性能便会逐步下降。
    ES使用词频统计来计算相关性. 当然这些统计也会分配到各个分片上. 如果在大量分片上只维护了很少的数据, 则将导致最终的文档相关性较差。
    分片设置的可参考原则:
    ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 推荐你最多分配7到8个分片。
    在开始阶段, 一个好的方案是根据你的节点数量按照1.5~3倍的原则来创建分片. 例如,如果你有3个节点, 则推荐你创建的分片数最多不超过9(3x3)个。当性能下降时,增加节点,ES会平衡分片的放置。
    对于基于日期的索引需求, 并且对索引数据的搜索场景非常少. 也许这些索引量将达到成百上千, 但每个索引的数据量只有1GB甚至更小. 对于这种类似场景, 建议只需要为索引分配1个分片。如日志管理就是一个日期的索引需求,日期索引会很多,但每个索引存放的日志数据量就很少。
    问题四: 分片应该设置几个副本?
    说明:副本数是可以随时调整的!
    思考:
    副本的用途是什么?
    备份数据保证高可用数据不丢失,高并发的时候参与数据查询
    针对它的用途,我们该如何设置它的副本数?
    一般一个分片有1-2个副本即可保证高可用
    集群规模没变的情况下副本过多会有什么影响?
    副本多浪费存储空间、占用资源、影响性能
    副本设置基本原则:
    为保证高可用,副本数设置为2即可。要求集群至少要有3个节点,来分开存放主分片、副本。
    如发现并发量大时,查询性能会下降,可增加副本数,来提升并发查询能力。
    注意:新增副本时主节点会自动协调,然后拷贝数据到新增的副本节点

标签:总结,index,cluster,索引,集群,分片,节点,ES,技能
From: https://www.cnblogs.com/huang-1123/p/18356776

相关文章

  • 个人技能总结-kafka部分
    kafka集群部分技能总结kafka集群架构Kafka集群的规划和架构设计是构建高性能、高可用性和可扩展性的分布式消息系统的关键。以下是关于Kafka集群规划和架构的详细说明:Kafka集群的基本组成Kafka集群主要由以下几个核心组件构成:生产者(Producer):负责向Kafka主题(Topic)发送消息的......
  • 掌握 schtasks 的高级功能,并有效管理和调度复杂任务。深入的 schtasks 使用指导,帮助用
    schtasks是一个Windows命令行工具,用于创建、删除、配置或显示计划任务。你可以用它来安排任务的自动执行,比如运行脚本或程序。schtasks的功能可以分为以下几类:创建任务:设定新任务的执行时间、频率和程序。删除任务:移除已存在的任务。修改任务:更新任务的执行时间、条件或......
  • 揭开 PostgreSQL 默认权限的神秘面纱
    alterdefaultprivileges命令允许我们设置将应用于将来创建的对象的权限。需要注意的是,这不会影响分配给现有对象的权限;默认权限可以全局设置在当前数据库上,或者指定的schema上。 数据库使用者对默认权限的行为有很多误解,我经常听到一些抱怨,说即使为特定schema分配了默认......
  • CSS笔记总结(Xmind格式):第二天
    Xmind鸟瞰图:简单文字总结:css知识总结:复合选择器:  1.交集选择器:在一个选择器的基础上,再增加一个选择器来增加条件(中间不能有任何符号包括空格)  2.并集选择器:多个选择器之间用逗号隔开,表示同时选择多个标签使用样式  3.后代选择器:使用空格分隔  4.子元......
  • JavaScript高阶笔记总结(Xmind格式):第三天
    Xmind鸟瞰图:简单文字总结:js高阶笔记总结:严格模式:  1.开启严格模式:"usestrict"  2.不使用var关键字声明会报错  3.严格模式下普通函数的this指向undefined高阶函数:  满足其中之一即高阶函数:    1.函数作为参数    2.函数作为返回值......
  • 智能汽车技能矩阵(1)——从系统到领域
    智能汽车技能矩阵(1)——从系统到领域从业智能汽车需要具备什么技能?聚焦这个问题准备开启一个新的系列,即所谓的“技能矩阵”——SkillMatrix。附赠自动驾驶最全的学习资料和量产经验:链接插件概念ASPICE3.1图示中的插件概念,如下图。来自ASPICE3.1如上图,产品分解为不......
  • PostgreSQL Linux下安装与配置
    1.PostgreSQL安装Linux版本这里使用的是7.x版本,最好是7.6或者7.8。下载地址:https://www.postgresql.org/download/选择好PGSQL的版本,Linux的发行版本直接执行命令即可:#下载PGSQL的rpm包sudoyuminstall-yhttps://download.postgresql.org/pub/repos/yum/reporp......
  • Codeforces Round 903 (Div. 3) F. Minimum Maximum Distance
    https://codeforces.com/contest/1881/problem/F不难发现一件事情,我们这里最后的答案所在的点是1和3号点。我们有没有发现一个性质:就是这两个点都是红点间的路径上的,而且最后的答案就是最长的红点间的距离的长度除以二上取整。那么,我们怎么找到最长的红点间的距离呢?很显......
  • Kubernetes 中必备的 10 个告警处置方法
    本文翻译自:https://sematext.com/blog/top-10-must-have-alerts-for-kubernetes/运行Kubernetes集群,显然不止是启动,还需要持续监控,以确保Kubernetes中的服务能正常运行。不过,您不想整天盯着一堆Kubernetes仪表板(即便仪表板再多么美观)。您希望使用适当的警报来设置Kuber......
  • KingbaseES RAC运维案例之---集群及数据库管理
    案例说明:KingbaseESRAC在部署完成后,进行日常的集群及数据库管理。适用版本:KingbaseESV008R006C008M030B0010操作系统版本:[root@node201KingbaseHA]#cat/etc/centos-releaseCentOSLinuxrelease7.9.2009(Core)集群架构:如下所示,node1和node2为集群节点:节点信息:......