欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

阿龙的学习笔记---ElasticSeach的学习与记录

发布时间:2023/12/14 编程问答 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 阿龙的学习笔记---ElasticSeach的学习与记录 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一些博客资料

  • APIDoc:https://elasticsearch-py.readthedocs.io/en/7.10.0/api.html#cluster

  • 官方集群相关startup文档:
    https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cluster.html

  • 知乎Es入门:
    https://zhuanlan.zhihu.com/p/104215274
    https://zhuanlan.zhihu.com/p/54384152

  • 深入分片:
    https://www.jianshu.com/p/cc06f9adbe82

  • 创建分片:
    https://www.elastic.co/guide/en/elasticsearch/reference/7.10/indices-split-index.html

  • 创建出错解决:{“acknowledged”=>true, “shards_acknowledged”=>false} 出错:
    blog.csdn.net/Richar1/article/details/78582653

  • 集群部署
    https://www.cnblogs.com/ljhdo/p/4959412.html
    https://cloud.tencent.com/developer/article/1189282
    https://elk.abcops.cn/elasticsearch_cluster_cert/

  • 移动分片:
    https://blog.csdn.net/qq_36666651/article/details/83865606
    https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-reroute.html

个人记录

  • 简述

    • Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。 使用Lucene库作为其核心来实现。封装了简易的REST API。
    • 全文搜索呢,大概是说非结构化数据,比如全文信息,相对于结构化的关系型数据库以及NoSQL来说检索较慢。那么将其中的一部分信息通过分词提取出来,重新组织,使其变得有一定结构的索引,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这种方式就构成了全文检索的基本思路。类似的开源搜索引擎还有Solr。
  • 节点(Node)

    • 一个节点是一个 Java 进程实例,一台机器可以运行多个实例,一般情况下一台机器只允许一个节点
    • 一个集群有一个或者多个节点
    • 通过启动参数 node.name 定义节点名称
    • 每个节点都保存了集群的状态信息,只有 Master 节点可以修改集群的状态信息
    • 集群状态信息包括:所有节点信息、索引、Mapping、Settings、分片路由等信息
    • Master-eligible 节点:
      • 每个节点启动,默认自己是一个 Master-eligible 节点
      • 可以通过启动参数 node.master: false 禁止当前启动节点是 Master-eligible 节点
      • 所有 Master-eligible 都可以参与选主流程,成为 Master 节点
    • Data 节点:
      • 保存分片数据的节点
      • 在数据扩展上起了很大的作用
      • 通过启动参数 node.data 设置
    • Coordinating 节点
      • 接收客户端请求,将请求分发到合适的节点,最终再对结果进行汇集
      • 每个节点默认都是 Coordinating 节点
  • 索引

    • 一个集群下面可以新建多个索引,索引体现了逻辑空间概念
    • 索引是一类相似文档的集合,是文档的容器,类比关系型数据库中的一张表的 Schema 的概念
    • 每个索引有自己的 Mapping 用于定义文档的字段名和字段类型
    • 每个索引有自己的 Settings 用于定义不同的数据分布,也就是索引使用分片的情况
  • 分片(Shard)

    • 分片是物理空间概念,索引中的数据都分布在分片上,把分片想象成数据的容器。文档存储在分片中,然后分片分配到集群中的节点上。当集群扩容或缩小,Elasticsearch 将会自动在节点间迁移分片,以使集群保持平衡。
    • 分片分为主分片和副分片(也叫复制分片),一般主分片和副分片应该分布在不同的节点上保证可用性。
    • 主分片用于解决数据水平扩展的问题,主分片的数目在索引创建后指定,后续不容许修改(number_of_shards)
    • 副分片用来解决数据高可用问题,是主分片的拷贝,数量可以动态调整(number_of_replicas)
    • 分片数的设定
      • 分片数设置太小,影响后续水平扩展,单个分片数据量太大将导致数据重新分配耗时
      • 分片数设置过大,影响搜索结果的相关性打分,影响搜索结果数据准确性
      • 分片数设置过大,导致单个节点上会有过多的分片,资源浪费,浪费性能
  • 文档(Document)

    • 文档是所有可搜索数据的最小单位,类似关系数据库中某张表中的一行记录
    • 文档会被序列化成 JSON 格式,JSON 对象由字段组成
    • 每个字段都有对应的字段类型,类型可以自己指定,也可以使用 ElasticSearch 自动推算
    • JSON 文档支持数组和嵌套
    • 每个文档都有一个唯一性 ID,可以自己指定,也可以系统自动生成

使用时遇到的一些问题及解决

  • es开启问题:采用mmapfs会检查虚拟内存容量,但系统无法更改那个内核变量,所以换一个文件系统:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-store.html

  • 如果两个机器,两个分片,那么会自动分配到两个机器上去,每个机器只占一个分片的硬盘容量。

  • 分片可以分布在不同机器上,但是大小不定,分片之后还有可能更大???还有可能两个分片加起来大于之前的一个???。原因跟segment有关。

  • 强制merge segments之后,4个分片的大小就变成了基本一致的。
    做法: 先分片,在强制merge

  • 有可能分片了,再强制合并之后,占用更大了,是delete_doc还在硬盘中,需要强制merge添加一个参数only_expunge_deletes=true,会对有删除过的segments进行合并,处理时间很长。

  • 在某一台机器上面进行分片,然后再将单个分片复制到集群机器中可以。启动es的时候,可能是有自动分配。

  • 2020.12.11:移动过去之后,开启并未载入那个索引,奇怪…是不是要加translog?

  • /data/es/data/nodes/0/_state 下保存了索引加载信息啥的,直接把索引的文件复制过来好像不太行,把_state复制过来,才会加载那个索引,但是这个机器之前的索引就没加载了。

  • 将所有_state都删除,则重启可以有两个node,但是没有索引加载进去。加了索引里面的两个_state,还是没有。

  • 成功的一个方法:将分片完成的索引带着translog和两个_state文件夹,拷贝到各个集群集群中。将原来机器nodes中的_state文件拷贝到某一个机子上作为master启动,然后其他机器从没有_state的状态启动。

  • 上面这个方法测试结果ok。

  • 在成功之后再设置复制分片就行。

一些用到的API操作命令:

  • cat
    curl -X GET “9.54.141.98:10207/_cat”

  • 获取setting信息:
    GET 索引名/_settings

  • 分片操作:
    curl -X POST “9.54.141.98:10207/douyin-index-test/_split/douyin-index-test-4?pretty” -H ‘Content-Type: application/json’ -d ‘{ “settings”: { “index.number_of_shards”: 4 , “number_of_replicas” : 0 } }’

  • 设置复制分片数:
    curl -X PUT “9.54.141.98:10207/douyin-index-test-split2/_settings?pretty” -H ‘Content-Type: application/json’ -d’ { “index” : { “number_of_replicas” : 0 } } ’

  • 取消索引只读:tmd要用null,而不能用false!!!
    curl -X PUT -H ‘Content-Type: application/json’ “9.54.141.98:10207/douyin-index-test-split2/_settings?pretty” -d ‘{“index.blocks.read_only”: null}’

  • 删除索引:
    curl -X DELETE “9.54.141.98:10207/douyin-index-test-split2/”

  • 对segment强制merge合并:
    curl -X POST “9.54.141.98:10207/douyin-index-test-4/_forcemerge”

  • 如果要把删除的remove掉,需要加上参数:
    curl -X POST “127.0.0.1:9200/douyin-index-20201118-2/_forcemerge?only_expunge_deletes=true”

  • 搜索:用赵博的python的测试demo

总结

以上是生活随笔为你收集整理的阿龙的学习笔记---ElasticSeach的学习与记录的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。