本章基于:RHELinux v8+,ELK Stack v8.x,Docker v23.x,VS2022,.NET6,Postman v10.x,Microsoft Edge v124.x

希望我能讲明白,有不妥,请告诉我,让我纠正更多。

一、ELK Stack 介绍

Elasticsearch、Logstash 和 Kibana。也可称为 Elastic Stack。

Elasticsearch 是一个分布式、RESTful 风格的、并且拥有极佳的 查询能力、数据分析、统计能力,每个数据都被编入索引,包括全文检索/地理位置/列存储等。能够水平扩展集群,每秒处理海量事件,自动管理索引和分布式集群中的查询,以惊叹的速度实现极其流畅的操作。

Kibana 则可以进行全面透彻的分析后,从一个 UI 中进行监督和管理,并从多个用例和团队中透视出大量信息,发现洞察/调查威胁/监测系统/评估搜索性能等。也就是将数据转变为结果,使你快速做出响应以解决。所有这些都基于Elasticsearch上完成。

Logstash 是服务器端数据处理管道,在数据传输过程中,能够解析其中的各个事件,识别已命名的字段或以重新构建结构,比如把相似的数据从新划分或组装,也可同时从多个来源采集数据,并将它们转换成通用格式,发送到(ES)存储库中,以便进行更强大的分析和实现更大价值。

也就是说:Logstash 采集数据 >> Elasticsearch 数据分析 >> Kibana 呈现结果,不如看下官网对于ELK的架构图:

上面介绍的好像有点。。。好理解么???

️特点与应用

:这主要是针对 Elasticsearch 来说,可以做数据的搜索引擎,这比一般的关系型DB可快多了。但搜索的结果可能会有些许的偏差,因为反向索引,就像百度一样,结果中也有不一定是自己想要的信息,但它足够快。

分析:由于快,可以时时分析出一些状态数值等的变化,比如某应用的运行状况/某业务的处理能力波动/或者任何运行指标等,参考这些结果,就可以去采集/发现/预知/可能/洞察/扩展/优化等。这是 ELK Stack 套件的价值所在。

进入本章的重点,Elasticsearch,那它能做什么?

存储数据,快速搜索,一个特别的 DataBase,除 CURD 外,就是快。

我们暂且以这样的认识,往下看。

把 Elasticsearch 部署起来,完成它的 CRUD,这是本篇文章的主要任务。

作者:[Sol·wang] - 博客园,原文出处:https://www.cnblogs.com/Sol-wang/p/17490582.html

二、Elasticsearch 部署

搜索引擎 Elasticsearch,它是用JAVA写的,所以默认自带JDK,不用再部署JAVA环境。或者通过 elasticsearch-env 文件修改为指定的JAVA环境。

2.1 系统准备

1、应ES要求,在 Linux 创建用来运行ES的系统自定义用户:useradd elk

2、应ES要求,提升单进程可允许的最大内存:文件/etc/sysctl.conf追加vm.max_map_count=262144再执行命令sysctl -p后生效

3、应ES要求,为用户调整系统并发限制:vim /etc/security/limits.conf(关于Limits可参考

elk              soft    nofile          65536
elk hard nofile 65536

4、开放ES用到的9200/9300端口(可参考);测试环境可直接关闭防火墙:systemctl stop firewalld

2.2 部署启动

️去官网找源码下载地址:https://www.elastic.co/cn/downloads/elasticsearch

# 官网源码下载
curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.7.1-linux-x86_64.tar.gz
# 源码包解压缩
tar -zxvf elasticsearch-8.7.1-linux-x86_64.tar.gz
# 为主目录赋予运行用户(els)的权限(可读可写可执行)
# - 默认情况下,Elasticsearch的data数据文件/logs日志文件 都在主目录下;
# - 倘若计划将数据文件/日志文件配置到其它目录,也要为运行用户赋予响应权限。
chown -R els {path} && chmod -R 754 {path}
# 切换到解压包下的主目录
cd elasticsearch-8.7.1

️编辑配置文件:vim config/elasticsearch.yml

# 单机基础配置项:
cluster.name: my-elasticsearch # 自定义集群名称
node.name: node-a # 自定义节点名称
network.host: 0.0.0.0 # 外部可访问的IP
http.port: 9200 # 对外开放的端口
cluster.initial_master_nodes: ["node-a"] # 集群初始化节点

️Linux命令行指定用户启动

# 切换至创建的系统用户
su elk
# 主目录下启动 [p:存储进程号] [d:后台启动]
bin/elasticsearch [-p /tmp/es.pid] [-d]

首次启动 Elasticsearch 时,默认情况下会启用和配置以下安全功能:

- 启用身份验证和授权,为 Elasticsearch 内置超级账号 elastic 并生成密码。
- 为传输层和HTTP层生成TLS的证书和密钥,并使用这些密钥和证书启用和配置TLS。
- 为 Kibana 生成一个注册令牌,是为需要接入 Kibana 的凭证,有效期为30分钟。

(记住以上[密码/密钥/令牌]等信息,后续会用到;当是后台方式 -d 启动时,信息存于日志文件)

️部署效果预览

浏览器SSL访问:https://{IP}:9200(8.x默认开启SSL)

输入默认账号 elastic 和生成的密码(建议及时变更密码)

重新初始化 Elasticsearch

删除 data 文件夹,删除 logs 内所有文件,再启动。

️停止运行ES

- 摧毁进程方式

  先查找ES的进程号PIDps aux | grep elastic 再依PID毁掉进程kill -15 {PID}
  如果启动时-p指定了PID的存储,更便捷/更动态的停止方式:pkill -F /tmp/es.pid

2.3 重设密码

重新生成随机密码:bin/elasticsearch-reset-password -u {uname}

或者自定义新密码:bin/elasticsearch-reset-password -u {uname} -i

2.4 容器方式

当然,任何东西,Docker 容器方式就很便捷了;测试用的「单节点模式」如下:

# 启动 ES 容器
docker run -dit --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:8.10.3
# 查看启动日志〔超级用户密码/HTTP证书密钥/Kibana令牌〕等
docker logs es
# 在容器内,为 ES 的超级用户 elastic 自动重设密码,取出已生成的密码〔后续连接登录用〕
docker exec -it es /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

2.5 登录到ES

上小节操作ES启动完成后,就可以通过多种连接方式进行登录,比如浏览器,比如Postman工具,比如某开发语言,都能连到已有节点实例上。

️浏览器访问ES首页:https://{address}:9200/〔它会弹框让你输入默认超级账号elastic和启动时生成的密码〕

看呢,登录成功了,它的首页给出了ES实例的基本信息。

️浏览器查看ES所有节点的健康检测信息:https://{address}:9200/_cat/health?v

看呢,它出现了,部署的单节点,当前的健康检测信息。

关于健康检测,首要关注的,当然是每个节点实例的运行状况 status 了,这里的状态分哪几种呢?

  • green:正常,所有分片均已分配。
  • yellow:可用,主分片已分配,但副本存在隐患,当发生隐患时,可能会丢失数据。
  • red:不可用,未分配一个或多个主分片,因此某些数据不可用。

️浏览器查看所有节点信息:https://{address}:9200/_cat/nodes?v

看呢,它出现了,各节点的信息,之前单节点启动,所以只有一条节点信息了。

️用Postman工具创建一个自定义索引,https://{address}:9200/{索引名称}

看呢,它创建成功了,当输入账号密码,以 PUT 方式,创建了一个名为「myfirstindex」的索引。

️浏览器已创建的索引:

看呢,它出现了,刚创建的索引名称「myfirstindex」。

Elasticsearch 默认是开启 SSL 的,所以应该用 HTTPS 方式访问它。

2.6 管理ES的工具与插件

当我们做一些基本的操作时,尤其是在开发测试环境,比如数据的维护,比如节点运行状态,比如后续的集群管理,等等,通过命令行操作,很不方便。

通过工具就很直观了,鼠标点点,就很快捷方便,比较受欢迎的浏览器插件:

  • 老牌浏览器插件:Multi Elasticsearch Head
  • 不轻易告诉别人的后来者优秀插件:Elasticsearch Tools
  • 应该是国人开发的浏览器插件(包括不限于插件):es-client

去搜吧,Chrome 应用市场

三、Elasticsearch 应用

在早前,我记得有过这样的方式辅助数据搜索:
在关系型 DataBase 中,为每笔数据贴上标签,你认为这条数据可以想象到的标签,都可以贴上,标签数量自己控制;或者在该表中追加几列,每列存一个标签,或者关联标签表等等。搜索时先用字符==匹配标签,再关联出对应数据集。个人认为 Elasticsearch 也是类似这种思路的系统化的具体实现。

3.1 内部特征

  • 索引 Index:相当于关系型DB的库或表都可以,是一组数据的集合。
  • 文档 Document:于Index上的一条数据,表示一个数据对象,相当于关系型DB中的行。
  • 栏位 Field:于Document上的一个数据属性。相当于关系型DB中的列。
  • 分词器 analyzer:将文本内容中的 词语/短语/语义 等提炼出为关键字后存储,用于全文检索很合适。
  • 这里提一下正排索引:这个应用的非常常见;就比如关系型DB,有索引列,通过索引值找对应数据的原理。
  • 倒排索引:事先提炼出的多个关键字,关键字再与此数据的Id标识对应起来,甚至对应多个数据的Id标识。

搜索的执行过程

按输入的内容,匹配到提炼出的关键字,会找到对应的一些数据索引,再通过Id值找到对应的数据。
也就是说:比关系型DB多出了 提炼关键字/关键字与索引标识列 Mapping。这也就是倒排索引的体现。

3.2 REST APIs

常见的基础操作,更多操作方式于后续的 Kibana 中详解。

ACTION Method URL Body
ES首页 GET :9200/  
健康检测 GET :9200/_cat/health?v  
节点列表 GET :9200/_cat/nodes?v  
查看所有索引 GET :9200/_cat/indices?v  
创建一个索引 PUT :9200/<index-name>  
查看单个索引 GET  
移除一个索引 DELETE  
修改数据 POST :9200/<index-name>/_update/<ID> {"doc":{<列>:<值>}}
追加数据 POST :9200/<index-name>/_doc/<ID> <JSON-Entity>
取单数据 GET  
覆盖数据 PUT  
移除数据 DELETE  
模糊搜索数据 GET :9200/<index-name>/_search?q=<列>:<值>  
全量查询数据 GET/POST :9200/<index-name>/_search  
模糊查询数据 GET/POST {"query":{"match":{<列>:<值>}}}
全字等于查询 GET/POST {"query":{"match_phrase":{<列>:<值>}}}
分页排序查询 GET/POST { "query":{"match":{}},
  "from":0, "size":10,
  "_source":["<指明结果字段>"],
  "sort":{"<列>":{"order":"asc"}}
}

关于排序

默认请求下,Elasticsearch 仅支持 数据 / 布尔 / 日期 等的排序,不支持 text 类型的字段进行排序。

如果需要 text 类型字段的排序,需要在 sort 中的 排序列名加上后缀.keyword
比如 "sort":{ "title.keyword" : {"order":"asc"}}
一般不会这样做,个人认为,是否需要回头看看或调整方案,生产环境不推荐吧。

另一种方式,改变字段属性 fielddata=true,使其不使用倒排索引,以将数据加载到内存中检索的方式。
官网不推荐这种方式,随着数据量的积累,它会占用大量的内存空间。

3.3 .NET 接入

为某种语言,用来连接到Elasticsearch服务及管理数据的客户端程序包,比较常用的,官网提供的NEST,在NuGet中搜索NEST,NEST仅支持7.x及以下版本的ES。。。然而现在,NEST已经有了替代品,官网提供的Elastic.Clients.Elasticsearch,仅针对新版ES8+的客户端,在NuGet中搜索即可;可能也是未来的客户端。

Elastic.Clients.Elasticsearch 与 NEST 的使用基本相似,NuGet 安装 Elastic.Clients.Elasticsearch。实现如下样例:

️Connecting

# 单节点连接
var es_c_settings = new ElasticsearchClientSettings(new Uri("https://localhost:9200"))
# 证书密钥(HTTP CA certificate SHA-256 fingerprint)
.CertificateFingerprint("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
# 账号密钥(Password for the elastic user)
.Authentication(new BasicAuthentication("elastic", "*******************"));
# 创建客户端
var client = new ElasticsearchClient(es_c_settings);

️集群连接

# 多节点连接 集群
# 默认情况下,通过循环以轮循方式请求节点。自动排除不正常的节点,直到恢复正常。
var es_node_pool = new StaticNodePool(new Uri[]{
new Uri("https://myserver1:9200"),
new Uri("https://myserver2:9200"),
new Uri("https://myserver3:9200")
});
var es_c_settings = new ElasticsearchClientSettings(es_node_pool)
# 证书密钥(HTTP CA certificate SHA-256 fingerprint)
.CertificateFingerprint("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
# 账号密钥(Password for the elastic user)
.Authentication(new BasicAuthentication("elastic", "*******************"));
# # 创建客户端
var client = new ElasticsearchClient(es_c_settings);

️Create index

# 创建指定名称的索引(必须小写)
CreateIndexResponse index_resp = client.Indices.Create("beautifulcity");
if (index_resp.IsValidResponse) {
Console.WriteLine($"Index name {index_resp.Index.ToString()} succeeded.");
}

️Insert data

# Entity
var m_city = new BeautifulCity() {
name = "杭州",
postcode = 310000,
attractions = new string[] { "江南", "宋韵" },
describe = "杭州市地处中国华东地区、钱塘江下游、杭州湾西端、京杭大运河南端,属亚热带季风气候,四季分明,雨量充沛。市境西部属浙西丘陵区,东部属浙北平原,水网密布,物产丰富。",
};
# Insert to index
IndexResponse index_resp = client.Index(m_city, "beautifulcity");
if (index_resp.IsValidResponse) {
Console.WriteLine($"Index document with ID {index_resp.Id} succeeded.");
}

️Query single

# From index by ID
var index_resp = client.Get<BeautifulCity>("1001", idx => idx.Index("beautifulcity"));
if (index_resp.IsValidResponse) {
Console.WriteLine(JsonSerializer.Serialize(index_resp.Source));
}

️Change entity

# Entity
var m_city = new BeautifulCity() {
attractions = new string[] { "江南", "宋韵", "临安" }
};
# From index by ID
var response = client.Update<BeautifulCity, BeautifulCity>("beautifulcity", "1001", u => u.Doc(m_city));
if (response.IsValidResponse) {
Console.WriteLine("Update document succeeded.");
}

️Remove entity

# From index by ID
var response = client.Delete("beautifulcity", "1001");
if (response.IsValidResponse) {
Console.WriteLine("Delete document succeeded.");
}

️分页匹配搜索

# from index by name
var response = client.Search<BeautifulCity>(s => s.Index("beautifulcity")
.From(0).Size(10)
.Query(q => q.Match(t => t.Field(f => f.name).Query("杭州")))
);
if (response.IsValidResponse) {
Console.WriteLine(JsonSerializer.Serialize(response.Documents));
}

️分页包含搜索

var response = client.Search<BeautifulCity>(s => s.Index("beautifulcity")
.From(0).Size(10).Query(q => q.Term(t => t.name, "杭"))
);
if (response.IsValidResponse) {
Console.WriteLine(JsonSerializer.Serialize(response.Documents));
}

️聚合查询

var response = client.Search<BeautifulCity>(s => s.Index("beautifulcity")
.Aggregations(aggs => aggs
.Max("my-max", max => max.Field(f => f.name))
.Avg("my-avg", avg => avg.Field(f => f.postcode))
.Sum("my-sum", sum => sum.Field(f => f.postcode))
)
);
if (response.IsValidResponse) {
Console.WriteLine(JsonSerializer.Serialize(response.Documents));
}

是不是有点类似,实现了一个 DBHelper 或者 ORM。

ELK Stack - Elasticsearch · 搜索引擎 · 部署应用 · 内部结构 · 倒排索引 · 服务接入的更多相关文章

  1. ELK stack elasticsearch/logstash/kibana 关系和介绍

    ELK stack elasticsearch 后续简称ES logstack 简称LS kibana 简称K 日志分析利器 elasticsearch 是索引集群系统 logstash 是日志归集集 ...

  2. Kubernetes实战之部署ELK Stack收集平台日志

    主要内容 1 ELK概念 2 K8S需要收集哪些日志 3 ELK Stack日志方案 4 容器中的日志怎么收集 5 K8S平台中应用日志收集 准备环境 一套正常运行的k8s集群,kubeadm安装部署 ...

  3. ELK Stack部署

    部署ELK Stack 官网:https://www.elastic.co 环境准备: ip hostname 服务 用户.组 192.168.20.3 node2003 kibana6.5,file ...

  4. 被一位读者赶超,手摸手 Docker 部署 ELK Stack

    被一位读者赶超,容器化部署 ELK Stack 你好,我是悟空. 被奇幻"催更" 最近有个读者,他叫"老王",外号"茴香豆泡酒",找我崔更 ...

  5. ELK日志监控平台安装部署简介--Elasticsearch安装部署

    最近由于工作需要,需要搭建一个ELK日志监控平台,本次采用Filebeat(采集数据)+Elasticsearch(建立索引)+Kibana(展示)架构,实现日志搜索展示功能. 一.安装环境描述: 1 ...

  6. 第三百六十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)倒排索引

    第三百六十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)倒排索引 倒排索引 倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包 ...

  7. 四十 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)倒排索引

    倒排索引 倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引 ...

  8. 宜人贷蜂巢ELK Stack之elasticsearch权限探索

    前言 上文<宜人贷蜂巢API网关技术解密之Netty使用实践>提到了,API网关“承外对内”,将外部请求,转发到内部各个抓取服务.在网关中,不仅可以做鉴权.加解密.路由.限流功能:如果想了 ...

  9. 快速搭建日志系统——ELK STACK

    什么是ELK STACK ELK Stack是Elasticserach.Logstash.Kibana三种工具组合而成的一个日志解决方案.ELK可以将我们的系统日志.访问日志.运行日志.错误日志等进 ...

  10. Elastic Stack之搜索引擎基础

    Elastic Stack之搜索引擎基础 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.搜索引擎概述 1>.什么是搜索引擎 搜索引擎(Search Engine)是指根 ...

随机推荐

  1. IDEA的Ctrl+Enter补全代码失效

    前景提示 IDEA有个ctrl+enter可以补全代码的功能,但是,今天突然失效了,原来是这个问题. 修改配置 进入setting修改 进入Edit-->找到Intertions,搜素Intro ...

  2. VRRP 虚拟路由器冗余协议

    目录 文章目录 目录 为什么要使用 VRRP 技术? VRRP VRRP 的概念 VRRP 的工作原理 VRRP 的状态机 VRRP 的工作过程 VRRP 的选举机制 VRRP 的报文格式 VRRP ...

  3. 大数据Hadoop集群的扩容及缩容(动态添加删除节点)

    添加白名单和黑名单 白名单,表示在白名单的主机IP地址可以用来存储数据 企业中:配置白名单,可以尽量防止黑客恶意访问攻击. 配置白名单步骤如下:原文:sw-code 1)在NameNode节点的/op ...

  4. PStorm 安装与破解

    官方下载地址: https://www.jetbrains.com/zh-cn/phpstorm/promo/?utm_source=baidu&utm_medium=cpc&utm_ ...

  5. golang http client 长连接vs短连接基准测试

    package main import ( "io/ioutil" "net/http" "strings" "testing&q ...

  6. aardio桌面软件开发 简单,打包后文件小,支持 .net python 和 众多插件

    aardio 编程语言 - 官网 aardio  专注于桌面软件开发,17年一直保持非常活跃地更新( 更新日志 ),aardio 被多年用于生产项目实践,久经测试和锤炼.aardio 在诞生之初就设计 ...

  7. 最好的在线PDF转换工具服务

    工作中有时候会碰到需要转换PDF文件的情况,现在网上就要很多免费的在线工具,可以进行PDF文件的转换,下面就来介绍一些可以直接在浏览器中将文档.电子表格.和图片转换为PDF或者互相转换的服务工具. ​ ...

  8. itest(爱测试)开源接口测试&敏捷测试&极简项目管理 8.0.0 发布,测试重大升级

    (一)itest 简介及更新说明 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock 6合1,又有丰富的统计分析.可按测试包 ...

  9. 题目:SHMIP The subglacial hydrology model intercomparison Project

    SHMIP(冰下水文模型比较计划)是一个致力于解决冰下水文多种理论方法问题的项目.该计划通过构建一系列综合模拟实验,并对运行这些模拟的各参与模型的结果进行比较,以达到其目标.这将有助于潜在的模型用户更 ...

  10. jsp表单提交中的逻辑判断

    针对于表单 通常情况下  我们都是表单提交 提交的路径为以下: 提交的按钮的type="submit" 当我们想在表单提交前增加一个逻辑判断   我们就需要把button中的typ ...