【ElasticSearch7.X】学习笔记
- 五、集群部署
- 5.1、相关概念
- 5.1.1、集群 Cluster
- 3.1.2、节点 Node
- 5.2、下载安装
- 5.3、 启动
- 5.4、 测试
- 六、进阶
- 6.1、核心概念
- 6.1.1、索引(Index)
- 6.1.2、类型(Type)
- 6.1.3、文档(Document)
- 6.1.4、字段(Field)
- 6.1.5、映射(Mapping)
- 6.1.6、分片(Shards)
- 6.1.7、副本(Replicas)
- 6.1.8、分配(Allocation)
- 6.2、分布式集群
- 6.2.1、集群分片与副本
- 6.2.2、吞吐
- 6.2.3、故障
- 6.2.5、路由计算、分片控制
- 2.7、数据流程
- 6.7.1、写流程
- 6.7.2、读流程
- 6.7.3、 更新流程
- 6.7.4、 多文档操作流程
- 6.8、 倒排索引
- 七、Kibana可视化
五、集群部署
5.1、相关概念
5.1.1、集群 Cluster
一个集群就是由一个或多个服务器节点组织在一起,共同持有整个的数据,并一起提供索引和搜索功能。一个 Elasticsearch 集群有一个唯一的名字标识,这个名字默认就是”elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。
3.1.2、节点 Node
集群中包含很多服务器,一个节点就是其中的一个服务器。作为集群的一部分,它存储
数据,参与集群的索引和搜索功能
一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于 Elasticsearch 集群中的哪些节点。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。
5.2、下载安装
除了elasticsearch-7.8.0/config/elasticsearch.yml 不一样 其他的单机部署一样
单机部署教程
elasticsearch.yml
#集群名称
cluster.name: elk
#节点名称,每个节点的名称不能重复
node.name: master
#ip 地址,每个节点的地址不能重复
network.host: master
# 日志数据路径
path.data: /usr/soft/elasticsearch/data
# 日志路径
path.logs: /usr/soft/elasticsearch/logs
# 是否开始内存交换
bootstrap.memory_lock: false
#是不是有资格主节点
node.master: true
node.data: true
http.port: 9200
# head 插件需要这打开这两个配置
http.cors.allow-origin: "*"
http.cors.enabled: true
http.max_content_length: 200mb
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["master"]
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts: ["master:9300","slave1:9300","slave2:9300"]
gateway.recover_after_nodes: 2
network.tcp.keep_alive: true
network.tcp.no_delay: true
transport.tcp.compress: true
#集群内同时启动的数据任务个数,默认是 2 个
cluster.routing.allocation.cluster_concurrent_rebalance: 16
#添加或删除节点及负载均衡时并发恢复的线程个数,默认 4 个
cluster.routing.allocation.node_concurrent_recoveries: 16
#初始化数据恢复时,并发恢复线程的个数,默认 4 个
cluster.routing.allocation.node_initial_primaries_recoveries: 16
5.3、 启动
#在不同服务器上执行
#切换成elkb用户
su elkb
#进入bin目录下执行
./elasticsearch
5.4、 测试
输入网址 http://192.168.3.34:9200/_cat/nodes
六、进阶
6.1、核心概念
6.1.1、索引(Index)
能搜索的数据必须索引,这样的好处是可以提高查询速度,比如:新华字典前面的目录就是索引的意思,目录可以提高查询速度。
Elasticsearch 索引的精髓:一切设计都是为了提高搜索的性能
6.1.2、类型(Type)
一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。不同的版本,类型发生了不同的变化
版本 | Type |
---|---|
5.x | 支持多种 type |
6.x | 只能有一种 type |
7.x | 默认不再支持自定义索引类型(默认类型为:_doc) |
6.1.3、文档(Document)
一个文档是一个可被索引的基础信息单元,也就是一条数据
文档以 JSON(Javascript Object Notation)格式来表示,而 JSON 是一个到处存在的互联网数据交互格式。
在一个 index/type 里面,你可以存储任意多的文档。
6.1.4、字段(Field)
相当于是数据表的字段,对文档数据根据不同属性进行的分类标识
6.1.5、映射(Mapping)
mapping 是处理数据的方式和规则方面做一些限制,如:某个字段的数据类型、默认值、分析器、是否被索引等等。这些都是映射里面可以设置的,其它就是处理 ES 里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。
6.1.6、分片(Shards)
一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有 10 亿文档数据的索引占据 1TB 的磁盘空间,而任一节点都可能没有这样大的磁盘空间。或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力,每一份就称之为分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。
分片很重要,主要有两方面的原因:
1)允许你水平分割 / 扩展你的内容容量。
2)允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。
6.1.7、副本(Replicas)
在一个网络 / 云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch 允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片(副本)
6.1.8、分配(Allocation)
将分片分配给某个节点的过程,包括分配主分片或者副本。如果是副本,还包含从主分片复制数据的过程。这个过程是由 master 节点完成的。
6.2、分布式集群
6.2.1、集群分片与副本
创建索引
{
"settings" : {
"number_of_shards" : 3, //主分片(每个主分片拥有一个副本分片)
"number_of_replicas" : 1 //副本
}
}
6.2.2、吞吐
但是如果我们想要扩容超过 6 个节点怎么办呢?
主分片的数目在索引创建时就已经确定了下来。实际上,这个数目定义了这个索引能够存储 的最大数据量。(实际大小取决于你的数据、硬件和使用场景。) 但是,读操作——搜索和返回数据——可以同时被主分片 或 副本分片所处理,所以当你拥有越多的副本分片时,也将拥有越高的吞吐量。
PUThttp://192.168.3.34:9200/users/_settings
//更改副本数
"number_of_replicas" : 2
6.2.3、故障
关闭一个主节点。而集群必须拥有一个主节点来保证正常工作,所以发生的第一件事情就是选举一个新的主节点: slave2 。在我们关闭 slave1 的同时也失去了主分片,并且在缺失主分片的时候索引也不能正常工作。 如果此时来检查集群的状我们看到的状态将会为 yellow:不是所有主分片都在正常工作
6.2.5、路由计算、分片控制
路由计算:hash( id ) %主分片数量
分片控制:用户可以访问任何一个节点获取数据,这个节点称之为协调节点【一般是轮询】
2.7、数据流程
6.7.1、写流程
新建、索引和删除 请求都是写操作, 必须在主分片上面完成之后才能被复制到相关的副本分片
新建,索引和删除文档所需要的步骤顺序:
- 客户端向 Node 1 发送新建、索引或者删除请求。
- 节点使用文档的 _id 确定文档属于分片 0 。请求会被转发到 Node 3,因为分片 0 的主分片目前被分配在 Node 3 上。
- Node 3 在主分片上面执行请求。如果成功了,它将请求并行转发到 Node 1 和 Node 2 的副本分片上。一旦所有的副本分片都报告成功, Node 3 将向协调节点报告成功,协调节点向客户端报告成功。
参数 | 含义 |
---|---|
consistency | 一致性。consistency 参数的值可以设为 one (只要主分片状态 ok 就允许执行写操作),all(必须要主分片和所有副本分片的状态没问题才允许执行写操作), 或quorum 。默认值为 quorum , 即大多数的分片副本状态没问题就允许执行写操作。规定数量:int( (primary + number_of_replicas) / 2 ) + 1 |
6.7.2、读流程
从主分片或者副本分片检索文档的步骤顺序:
- 客户端向 Node 1 发送获取请求。
- 节点使用文档的 _id 来确定文档属于分片 0 。分片 0 的副本分片存在于所有的三个
节点上。 在这种情况下,它将请求转发到 Node 2 。 - Node 2 将文档返回给 Node 1 ,然后将文档返回给客户端。在处理读取请求时,协调结点在每次请求的时候都会通过轮询所有的副本分片来达到负载均衡。在文档被检索时,已经被索引的文档可能已经存在于主分片上但是还没有复制到副本分片。 在这种情况下,副本分片可能会报告文档不存在,但是主分片可能成功返回文档。 一旦索引请求成功返回给用户,文档在主分片和副本分片都是可用的
6.7.3、 更新流程
部分更新一个文档的步骤如下:
- 客户端向 Node 1 发送更新请求。
- 它将请求转发到主分片所在的 Node 3 。
- Node 3 从主分片检索文档,修改 _source 字段中的 JSON ,并且尝试重新索引主分片
的文档。如果文档已经被另一个进程修改,它会重试步骤 3 ,超过 retry_on_conflict 次
后放弃。 - 如果 Node 3 成功地更新文档,它将新版本的文档并行转发到 Node 1 和 Node 2 上的
副本分片,重新建立索引。一旦所有副本分片都返回成功, Node 3 向协调节点也返回
成功,协调节点向客户端返回成功。
6.7.4、 多文档操作流程
用单个 mget 请求取回多个文档所需的步骤顺序:
- 客户端向 Node 1 发送 mget 请求
- Node 1 为每个分片构建多文档获取请求,然后并行转发这些请求到托管在每个所需的
主分片或者副本分片的节点上。一旦收到所有答复, Node 1 构建响应并将其返回给客
户端。
bulk API 允许在单个批量请求中执行多个创建、索引、删除和更新请求。
bulk API 按如下步骤顺序执行:
- 客户端向 Node 1 发送 bulk 请求。
- Node 1 为每个节点创建一个批量请求,并将这些请求并行转发到每个包含主分片的节
点主机。 - 主分片一个接一个按顺序执行每个操作。当每个操作成功时,主分片并行转发新文档(或
删除)到副本分片,然后执行下一个操作。 一旦所有的副本分片报告所有操作成功,
该节点将向协调节点报告成功,协调节点将这些响应收集整理并返回给客户端
6.8、 倒排索引
Elasticsearch 使用一种称为倒排索引的结构,它适用于快速的全文搜索。
见其名,知其意,有倒排索引,肯定会对应有正向索引。正向索引(forward index),反向索引(inverted index)更熟悉的名字是倒排索引。所谓的正向索引,就是搜索引擎会将待搜索的文件都对应一个文件 ID,搜索时将这个ID 和搜索关键字进行对应,形成 K-V 对,然后对关键字进行统计计数
将正向索引重新构建为倒排索引,即把文件ID对应到关键词的映射转换为关键词到文件ID的映射,每个关键词都对应着一系列的文件,这些文件中都出现这个关键词。
七、Kibana可视化
Kibana 是一个免费且开放的用户界面,能够让你对 Elasticsearch 数据进行可视化,并让你在 Elastic Stack 中进行导航。你可以进行各种操作,从跟踪查询负载,到理解请求如何流经你的整个应用,都能轻松完成。
官网
配套本文的Kibana下载地址
将上传的压缩包上传到服务器上
解压
tar -zxvf kibana-7.8.0-linux-x86_64.tar.gz
修改 config/kibana.yml 文件
# 默认端口
server.port: 5601
# ip
server.host: 192.168.3.34
# ES 服务器的地址
elasticsearch.hosts: ["http://192.168.3.34:9200"]
# 索引名
kibana.index: ".kibana"
# 支持中文
i18n.locale: "zh-CN"
到bin目录下执行
./kibana
# kibana 不支持root用户启动 如果想root用户启动使用下面语句
./kibana --allow-root
测试访问
http://192.168.3.34:5601/