标签: elasticsearch

如何快速部署一个Elasticsearch集群?

Elasticsearch概述

Elasticsearch是一款非常强大的开源“搜索”及“分析”引擎。除了搜索,结合Kibana、Logstash、Beats,以及Elastic Stack的技术生态,Elasticsearch还被广泛运用在大数据实时分析领域——包括日志分析(ELK)、指标监控、信息安全等领域。

Elasticsearch起源于开源搜索引擎类库Lucene,Elasticsearch的创始人Shay Banon于2004年基于Lucene开发了“Compass”,并在2010年重写“Compass”项目之后,将其正式命名为“Elasticsearch”。

目前在搜索引擎分类排名中Elasticsearch名列*,除此之外,同类的产品还有Solor(Apache开源项目)和Splunk(商业项目),它们三者提供的功能非常相似。但是在程序员开源社区中Elasticsearch的活跃度*高。

Elasticsearch的功能特性

Elasticsearchs是一种典型的分布式系统,支持水平扩展。当数据规模变大的时候,Elasticsearch的集群节点可以从单个扩展到数百个。

Elasticsearch集群还支持设置不同的节点类型。例如针对日志类的应用可以支持Hot&Warm架构——冷热架构部署。Elasticsearch的分布式架构如下图所示:

%title插图%num

除此之外,Elasticsearch还支持多种方式集成接入。例如,可以被多种语言方便的集成(Java、.Net、Python、PHP..);灵活的RESTful API;*新版本甚至还支持JDBC&ODBC方式的接入。

Elastic Stack家族成员

Elasticsearch之所以如此流行,处理活跃的社区外,很重要的一点就在于其背后还有一个强大的商业公司——Elastic在支撑。Elastic Stack的生态圈,如下图所示:

%title插图%num

接下来分别介绍下Elastic Stack各技术组件的用途,具体如下:

Logstash

开源的服务器端数据处理管道,支持从不同来源采集数据,转换数据,并将数据发送到不同的存储库中。2013年被Elasticsearch收购。

Logstash支持实时解析和转换数据,例如,从IP地址破译出地理坐标,以及将PII数据匿名化,完全排除敏感字段等。此外,Logstash还支持插件的扩展方式,目前大约有200多个插件,可以解决日志、数据库等多种场景的实际需求。

另外,Logstash的可靠性及安全性也很高。Logstash会通过持久化队列来保证至少将运行中的事件送达一次,以及支持数据传输加密。

Kibana

基于Logstash的数据可视化分析工具。

Beats

轻量的数据采集器,Go语言开发,运行速度非常快。场景的Beats插件有:Filebeat(日志文件插件)、Packetbeat、Heartbeat等。

X-Pack(商业化套件-已开源)

X-Pack开源之后,部分X-Pack功能支持免费使用,例如6.8和7.1版本开始,Security功能可以免费使用。

Elastic Stack应用场景

Elastic Stack技术栈常见的应用场景如下:

(1)下载Kibana安装包,命令如下:

  1. $ wget https://artifacts.elastic.co/downloads/kibana/kibana-7.14.0-darwin-x86_64.tar.gz

下载*新的7.14.0版本的MacOS二进制安装包。之后解压下载的安装包,命令如下:

  1. $ tar zxvf kibana-7.14.0-darwin-x86_64.tar.gz

(2)编辑conf/kibana.yaml文件,指定elasticsearch集群实例的地址编辑配置文件,指定Elasticsearch的集群地址,修改的内容如下:

  1. # The URLs of the Elasticsearch instances to use for all your queries.
  2. elasticsearch.hosts: [“http://localhost:9204”,“http://localhost:9201”,“http://localhost:9203”]

(3)启动Kibana,命令如下:

  1. $ ./bin/kibana

此时,打开浏览器进入Kibana的首页,如下图所示:

%title插图%num

如上图所示,可以向Elasticsearch集群中添加Kibana提供的样例数据。

(4)使用Kibana的“Dev Tools”工具Kibana的“Dev Tools”工具,能够帮助我们很方便执行一些elasticsearch的API。如下图所示:

%title插图%num

具体的查询命令如下:

  1. #执行查询集群节点状态的API。
  2. get /_cat/nodes/?v

 

Elasticsearch 又双叒发生数据泄露了,近 200 万条“禁飞名单”被泄露

今年 7 月,Security Discovery网站总监鲍勃·迪亚琴科(Bob Diachenko) 在暴露的Elasticsearch集群中发现了大量JSON记录,近200万条信息被泄露,其中包含有关人员的敏感信息,包括姓名、国籍、性别、出生日期、护照详细信息和禁飞状态。暴露的服务器已被搜索引擎Censys和ZoomEye编入索引,这表明Diachenko可能不是唯一访问该列表的人。

%title插图%num

来源于网络

研究人员Bob Diachenko分析暴露字段的性质(例如护照详细信息和“no_fly_indicator”),发现这些信息似乎来自禁飞或类似的恐怖分子观察名单。此外,他还注意到一些难以理解的字段,例如“标签”、“提名类型”和“入选指标”等。

考虑到这些数据被视为高度机密,在协助国家安全和执法方面发挥着重要作用。于是在7月19日,Bob Diachenko急忙向美国国土安全部(DHS)报告了数据泄露事件。三周后,即2021年8月9日,暴露的服务器被关闭。

有趣的是,Bob Diachenko是在7月19日发现了暴露的数据库,但是该数据库位于巴林 IP 地址而非美国 IP 地址的服务器上。

%title插图%num

数据泄露的影响

“鉴于这些数据中存在一个‘TSC_ID’的特定字段,暗示这些数据来源可能来自恐怖分子筛查中心 (TSC)。”Bob Diachenko在后面的报告中解释道。FBI 的TSC 被多个联邦机构用于管理和共享用于反恐目的的综合信息,该机构维护着“恐怖分子筛查数据库”的机密观察名单,有时也称为“禁飞名单”,航空公司和多个机构(例如国务院、国防部、运输安全局 (TSA) 和海关和边境保护局 (CBP))会参考该列表,以检查乘客是否被允许乘飞机进入美国或评估他们危险级别。

%title插图%num

来源于网络

Bob Diachenko认为这次数据泄露是非常严重的事件,“如果落入坏人之手,后果不堪设想,坏人可能会利用名单来骚扰或迫害名单上的人及其家人。”

Bob Diachenko也表示:“这次泄密可能会对嫌疑人产生负面影响,也会给名单上的无辜者带来个人问题和职业困扰,比如那些因拒*成为线人而被列入“禁飞名单”。”

%title插图%num

ElasticSearch 为何频发数据泄露

Elasticsearch是现在的Elastic于2010年首次发布的分布式免费开源搜索和分析引擎,具有快速实时搜索和可靠稳定的特点。很多企业都用作检索公司机密信息,提高工作效率。但是近年来,Elasticsearch数据泄露事件却频繁发生。

%title插图%num

来源于Elastic官网

例如在2019 年 12 月 1 日,腾讯、新浪、搜狐和网易等公司,超过 27 亿个邮件地址数据被泄露。泰国移动运营商Advanced Info Service(AIS) 的Elasticsearch数据库于2020年5月1日被公开访问,数据库中包含了约83亿记录,数据体量约为4.7 TB。

Elasticsearch数据泄露发生的主要原因,在于Elasticsearch开源版本是不具备任何数据保护功能的,只有基本的攻击保护防火墙功能。

因此专家建议可以采取认证和授权、数据加密(通讯加密)、使用内部网络等方法避免发生数据泄露,或者加强预警,以便在安全事件发生的*时间感知并启动紧急预案,将损失降到*低。

参考链接:

  • https://www.bleepingcomputer.com/news/security/secret-terrorist-watchlist-with-2-million-records-exposed-online/
  • https://cloud.tencent.com/developer/article/1580423

elasticsearch持久化变更

如果没有用 fsync 把数据从文件系统缓存刷(flush)到硬盘,我们不能保证数据在断电甚至是程序正常退出之后依然存在。为了保证 Elasticsearch 的可靠性,需要确保数据变化被持久化到磁盘。

在 动态更新索引,我们说一次完整的提交会将段刷到磁盘,并写入一个包含所有段列表的提交点。Elasticsearch 在启动或重新打开一个索引的过程中使用这个提交点来判断哪些段隶属于当前分片。

即使通过每秒刷新(refresh)实现了近实时搜索,我们仍然需要经常进行完整提交来确保能从失败中恢复。但在两次提交之间发生变化的文档怎么办?我们也不希望丢失掉这些数据。

Elasticsearch 增加了一个 translog ,或者叫事务日志,在每一次对 Elasticsearch 进行操作时均进行了日志记录。通过 translog ,整个流程看起来是下面这样:

  1. 一个文档被索引之后,就会被添加到内存缓冲区,并且 追加到了 translog ,正如 图 21 “新的文档被添加到内存缓冲区并且被追加到了事务日志” 描述的一样。

    图 21. 新的文档被添加到内存缓冲区并且被追加到了事务日志%title插图%num

  2.  
  3. 刷新(refresh)使分片处于 图 22 “刷新(refresh)完成后, 缓存被清空但是事务日志不会” 描述的状态,分片每秒被刷新(refresh)一次:
    • 这些在内存缓冲区的文档被写入到一个新的段中,且没有进行 fsync 操作。
    • 这个段被打开,使其可被搜索。
    • 内存缓冲区被清空。

    图 22. 刷新(refresh)完成后, 缓存被清空但是事务日志不会%title插图%num

  4.  
  5. 这个进程继续工作,更多的文档被添加到内存缓冲区和追加到事务日志(见 图 23 “事务日志不断积累文档” )。

    图 23. 事务日志不断积累文档%title插图%num

  6.  
  7. 每隔一段时间—​例如 translog 变得越来越大—​索引被刷新(flush);一个新的 translog 被创建,并且一个全量提交被执行(见 图 24 “在刷新(flush)之后,段被全量提交,并且事务日志被清空” ):
    • 所有在内存缓冲区的文档都被写入一个新的段。
    • 缓冲区被清空。
    • 一个提交点被写入硬盘。
    • 文件系统缓存通过 fsync 被刷新(flush)。
    • 老的 translog 被删除。

translog 提供所有还没有被刷到磁盘的操作的一个持久化纪录。当 Elasticsearch 启动的时候, 它会从磁盘中使用*后一个提交点去恢复已知的段,并且会重放 translog 中所有在*后一次提交后发生的变更操作。

translog 也被用来提供实时 CRUD 。当你试着通过ID查询、更新、删除一个文档,它会在尝试从相应的段中检索之前, 首先检查 translog 任何*近的变更。这意味着它总是能够实时地获取到文档的*新版本。

图 24. 在刷新(flush)之后,段被全量提交,并且事务日志被清空

%title插图%num

flush API编辑

这个执行一个提交并且截断 translog 的行为在 Elasticsearch 被称作一次 flush 。 分片每30分钟被自动刷新(flush),或者在 translog 太大的时候也会刷新。请查看 translog 文档 来设置,它可以用来控制这些阈值:

flush API 可以被用来执行一个手工的刷新(flush):

POST /blogs/_flush 

POST /_flush?wait_for_ongoing
  刷新(flush) blogs 索引。
  刷新(flush)所有的索引并且并且等待所有刷新在返回前完成。

你很少需要自己手动执行 flush 操作;通常情况下,自动刷新就足够了。

这就是说,在重启节点或关闭索引之前执行 flush 有益于你的索引。当 Elasticsearch 尝试恢复或重新打开一个索引, 它需要重放 translog 中所有的操作,所以如果日志越短,恢复越快。

Translog 有多安全?

translog 的目的是保证操作不会丢失。这引出了这个问题: Translog 有多安全?

在文件被 fsync 到磁盘前,被写入的文件在重启之后就会丢失。默认 translog 是每 5 秒被 fsync 刷新到硬盘, 或者在每次写请求完成之后执行(e.g. index, delete, update, bulk)。这个过程在主分片和复制分片都会发生。*终, 基本上,这意味着在整个请求被 fsync 到主分片和复制分片的translog之前,你的客户端不会得到一个 200 OK 响应。

在每次请求后都执行一个 fsync 会带来一些性能损失,尽管实践表明这种损失相对较小(特别是bulk导入,它在一次请求中平摊了大量文档的开销)。

但是对于一些大容量的偶尔丢失几秒数据问题也并不严重的集群,使用异步的 fsync 还是比较有益的。比如,写入的数据被缓存到内存中,再每5秒执行一次 fsync 。

这个行为可以通过设置 durability 参数为 async 来启用:

PUT /my_index/_settings
{
    "index.translog.durability": "async",
    "index.translog.sync_interval": "5s"
}

这个选项可以针对索引单独设置,并且可以动态进行修改。如果你决定使用异步 translog 的话,你需要 保证 在发生crash时,丢失掉 sync_interval 时间段的数据也无所谓。请在决定前知晓这个特性。

如果你不确定这个行为的后果,*好是使用默认的参数( "index.translog.durability": "request" )来避免数据丢失。

mongodb 和 elasticsearch 怎么配合使用

mongodb 用来存储数据,elasticsearch 用做搜索引擎,看网上教程说,需要 mongodb 同步到 elasticsearch,
这样的话用 mongodb 存储数据有啥意义呢?往各位大佬赐教

6 条回复 • 2021-04-02 14:05:22 +08:00
Mithril 1
Mithril 3 小时 3 分钟前
– 你可能不是所有数据都需要扔到 ES 里面做检索,没必要的数据不要放进去。
– 你有可能需要保证一定程度上的一致性。
本质上 ES 就是个搜索引擎,你*好还是拿它当搜索引擎用。虽说一定程度上也可以当成 NoSQL 数据库,但实际使用的时候,除非你的应用场景非常合适,可以从需求上避开拿 ES 当数据库使用时的缺点,不然不要这么搞。
taomujian 2
taomujian 2 小时 52 分钟前
好的,谢谢解答
chendy 3
chendy 2 小时 50 分钟前
mongodb 做主数据库,es 做搜索,把需要搜索的数据从 mongodb 同步到 es
jun0205 4
jun0205 2 小时 49 分钟前
可以用 https://github.com/rwynn/monstache 同步数据,monstache 可以自己写脚本同步需要的数据。
libook 5
libook 2 小时 45 分钟前 ❤️ 2
ES 和 MongoDB 的而应用场景不一样,定位也不一样,各自擅长和不擅长的事情也不一样。

ES 不是数据库,没法保障数据一致性,因为存在刷新周期,所以你读取的数据总是上一次刷新的数据,如果在此期间有任何数据变化,你是拿不到*新的数据的,只能等下一个刷新周期。强一致性需求是数据库的强项,你查询 MongoDB 不可能返回一个过时的数据。

传统业务数据库的索引机制有个限制,就是索引越多写性能越差,而且每一条索引都有很高的专能性,所适用的查询场景*其有限。举个例子,后台一个表单有 20 个查询字段,用户会随机选取其中任意数量的字段组合查询,每种组合出现的概率相当且要求查询速度都要很快;如果用业务数据库设计索引的话,理论上可能需要 20 的全组合那么多的索引,都别说 20 的全组合了,常见的业务数据库一个表上有 20 条索引就很让人头疼了。这就是搜索引擎的用武之地了。

MongoDB 有一个 Change Streams 的机制,可以用程序监听表数据变化,这个机制可以用来同步 MongoDB 的数据到 ES,于是数据的写操作和强一致性读操作都在 MongoDB 上进行,不要求一致性的读操作(比如后台报表查询可以容忍几秒的数据滞后性的话)可以到 ES 里查。

Elasticsearch多索引查询搜索 排序异常问题方案

Elasticsearch6.8
HighLevel方式
场景:全局搜索,综合搜索,可能有帖子,产品,文章等,要倒序,哪个发布了就在*上面显示出来

问题
在多索引全局查询时,比如设置了sourceBuilder.sort(“字段名”, SortOrder.DESC);会报错如下
Elasticsearch exception [type=class_cast_exception, reason=java.lang.Long cannot be cast to org.apache.lucene.util.BytesRef

Elasticsearch exception [type=class_cast_exception, reason=java.lang.Long cannot be cast to org.apache.lucene.util.BytesRef

试了好几种解决方案没有办法打到自己想要的效果,后续研究下有没有好的解决方案和高版本是否支持

我的方案:
因为加入的顺序是顺序的,比如id为1,2,3,4,5……也有createTime字段
所以先查询符合条件的条数

restHighLevelClient.count(countRequest, RequestOptions.DEFAULT);

然后根据条数计算你要取的起始位置

sourceBuilder.from(count > 10 ? count – esSearchDTO.getFrom() * esSearchDTO.getSize() : 0);
sourceBuilder.size(esSearchDTO.getSize());

比如pageNum=1,pageSize=10,一共100条数据,你要取*后10条,则用100 – 110=90,从第90位置取10条到100
第二页为100-210=80,从第80取10到90

取出数据后有不同类型的对象怎么办?如何排序?
可以在各个索引中定义createTime
在*后得到的结果中使用Collections.sort取共同字段createTime进行比较排序
————————————————
版权声明:本文为CSDN博主「东北_老乡」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Goligory/article/details/115128595

 

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速