Elasticsearch
Elasticsearch的功能
(1)分布式搜索和分析引擎
(2)全文检索,结构化检索,数据分析
(3)对海量数据进行近实时的处理
分布式:ES自动可以将海量数据分散到多台服务器上存储和检索
海量数据的处理:分布式以后,就可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理了
跟分布式/海量数据相反的,lucene,单机应用,只能在单台服务器上使用,最多只能处理单台服务器可以处理的数据量。
近实时:在秒级别对数据进行搜索和分析
Elasticsearch的适用场景
(1)维基百科,全文检索,高亮,搜索推荐
(2)新闻网站,用户日志+社交网络数据,分析
(3)Stack Overflow(国外的程序异常讨论论坛),全文检索,搜索相关问题和答案
(4)GitHub(开源代码管理),搜索上亿行代码
(5)电商网站,检索商品
(6)日志数据分析,logstash采集日志,ES进行复杂的数据分析
(7)商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发视消息给用户
(8)BI系统,ES执行数据分析和挖掘,Kibana进行数据可视化
(9)国内,站内搜索(电商,招聘,门户)
(10)BI 系统,商业智能,分析用户消费趋势和用户群体的组成构成。
Elasticsearch的特点
(1)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司,也可以运行在单机上,服务小公司
(2)Elasticsearch不是什么新技术,主要是将全文检索,数据分析以及分布式技术,合并在一起,才形成了独一无二的ES,lucene(全文检索)
(3)对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂
(4)数据库的功能面对很多领域是不够的,优势:事务,各种联机事务型的操作,特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理,Elasticsearch作为传统数据库的一个补充,提供了数据库所不能提供的很多功能。
Elasticsearch术语及概念
#索引词
在elastiasearch中索引词(term)是一个能够被索引的精确值。foo,Foo,FOO几个单词是不同的索引词。索引词(term)是可以通过term查询进行准确的搜索。
#文本(text)
文本是一段普通的非结构化文字。通常,文本会被分拆成一个个的索引词,存储在elasticsearch的索引库中。为了让文本能够进行搜索,文本字段需要事先进行分析了;当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本。
#分析(analysis)
分析是将文本转换为索引词的过程,分析的结果依赖于分词器。比如:FOO BAR,Foo-Bar和foo bar这几个词有可能会被分析成相同的索引词foo和bar,这些索引词存储在Elasticsearch的索引库中。
#集群(cluster)
集群由一个或多个节点组成,对外提供服务,对外提供索引和搜索功能。在所有节点,一个集群有一个唯一的名称默认为“elasticsearch”.此名称是很重要的,因为每个节点只能是集群的一部分,当该节点被设置为相同的集群名称时,就会自动加入集群。当需要有多个集群的时候,要确保每个集群的名称不能重复,,否则节点可能会加入到错误的集群。请注意,一个节点只能加入到一个集群。此外,你还可以拥有多个独立的集群,每个集群都有其不同的集群名称。
#节点(node)
一个节点是一个逻辑上独立的服务,它是集群的一部分,可以存储数据,并参与集群的索引和搜索功能。就像集群一样,节点也有唯一的名字,在启动的时候分配。如果你不想要默认名称,你可以定义任何你想要的节点名.这个名字在理中很重要,在Elasticsearch集群通过节点名称进行管理和通信.一个节点可以被配置加入到一个特定的集群。默认情况下,每个节点会加人名为Elasticsearch 的集祥中,这意味着如果你在网热动多个节点,如果网络畅通,他们能彼此发现井自动加人名为Elasticsearch 的一个集群中,你可以拥有多个你想要的节点。当网络没有集祥运行的时候,只要启动一个节点,这个节点会默认生成一个新的集群,这个集群会有一个节点。
#分片(shard)
分片是单个Lucene 实例,这是Elasticsearch管理的比较底层的功能。索引是指向主分片和副本分片的逻辑空间。 对于使用,只需要指定分片的数量,其他不需要做过多的事情。在开发使用的过程中,我们对应的对象都是索引,Elasticsearch 会自动管理集群中所有的分片,当发生故障的时候,Elasticsearch 会把分片移动到不同的节点或者添加新的节点。
一个索引可以存储很大的数据,这些空间可以超过一个节点的物理存储的限制。例如,十亿个文档占用磁盘空间为1TB。仅从单个节点搜索可能会很慢,还有一台物理机器也不一定能存储这么多的数据。为了解决这一问题,Elasticsearch将索引分解成多个分片。当你创建一个索引,你可以简单地定义你想要的分片数量。每个分片本身是一个全功能的、独立的单元,可以托管在集群中的任何节点。
#主分片
每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后会复制到不同的副本中。默认情况下,一个索引有5个主分片。 你可以事先制定分片的数量,当分片一旦建立,则分片的数量不能修改。
#副本分片
每一个分片有零个或多个副本。副本主要是主分片的复制,其中有两个目的:
- 增加高可用性:当主分片失败的时候,可以从副本分片中选择一个作为主分片。
- 提高性能:当查询的时候可以到主分片或者副本分片中进行查询。默认情況下,一个主分片配有一个副本,但副本的数量可以在后面动态地配置增加。副本分片必部署在不同的节点上,不能部署在和主分片相同的节点上。
分片主要有两个很重要的原因是:
- 允许水平分割扩展数据。
- 允许分配和井行操作(可能在多个节点上)从而提高性能和吞吐量。
这些很强大的功能对用户来说是透明的,你不需要做什么操作,系统会自动处理。
#索引(index)
索引是具有相同结构的文档集合。例如,可以有一个客户信息的索引,包括一个产品目录的索引,一个订单数据的索引。 在系统上索引的名字全部小写,通过这个名字可以用来执行索引、搜索、更新和删除操作等。在单个集群中,可以定义多个你想要的索引。
#类型(type)
在索引中,可以定义一个或多个类型,类型是索引的逻辑分区。在一般情况下,一种类型被定义为具有一组公共字段的文档。例如,让我们假设你运行一个博客平台,并把所有的数据存储在一个索引中。在这个索引中,你可以定义一种类型为用户数据,一种类型为博客数据,另一种类型为评论数据。
#文档(doc)
文档是存储在Elasticsearch中的一个JSON格式的字符串。它就像在关系数据库中表的一行。每个存储在索引中的一个文档都有一个类型和一个ID,每个文档都是一个JSON对象,存储了零个或者多个字段,或者键值对。原始的JSON 文档假存储在一个叫作Sour的字段中。当搜索文档的时候默认返回的就是这个字段。
#映射
映射像关系数据库中的表结构,每一个索引都有一个映射,它定义了索引中的每一个字段类型,以及一个索引范围内的设置。一个映射可以事先被定义,或者在第一次存储文档的时候自动识别。
#字段
文档中包含零个或者多个字段,字段可以是一个简单的值(例如字符串、整数、日期),也可以是一个数组或对象的嵌套结构。字段类似于关系数据库中表的列。每个字段都对应一个字段类型,例如整数、字符串、对象等。字段还可以指定如何分析该字段的值。
#主键
ID是一个文件的唯一标识,如果在存库的时候没有提供ID,系统会自动生成一个ID,文档的 index/type/id必须是唯一的。
#复制
复制是一个非常有用的功能,不然会有单点问题。 当网络中的某个节点出现问题的时
候,复制可以对故障进行转移,保证系统的高可用。因此,Elasticsearch 允许你创建一个或多个拷贝,你的索引分片就形成了所谓的副本或副本分片。
复制是重要的,主要的原因有:
- 它提供丁高可用性,当节点失败的时候不受影响。需要注意的是,一个复制的分片
不会存储在同一个节点中。
它允许你扩展搜索量,提高并发量,因为搜索可以在所有副本上并行执行。
每个索引可以拆分成多个分片。索引可以复制零个或者多个分片.一旦复制,每个索引就有了主分片和副本分片.分片的数量和副本的数量可以在创建索引时定义.当创建索引后,你可以随时改变副本的数量,但你不能改变分片的数量.
默认情況下,每个索引分配5个分片和一个副本,这意味着你的集群节点至少要有两个节点,你将拥有5个主要的分片和5个副本分片共计10个分片.
每个Elasticsearch分片是一个Lucene 的索引。有文档存储数量限制,你可以在一个
单一的Lucene索引中存储的最大值为lucene-5843,极限是2147483519(=integer.max_value-128)个文档。你可以使用cat/shards API监控分片的大小。
所有其他语言可以使用RESTful API通过端口9200和Elasticsearch进行通信,你可以用你最喜爱的web客户端访问Elasticsearch.事实上,你甚至可以使用curl命令和Elasticsearch交互 。
一个 Elasticsearch 请求和任何 HTTP 请求一样由若干相同的部件组成:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>’
VERB: 适当的 HTTP 方法 或 谓词 : GET`、 `POST`、 `PUT`、 `HEAD 或者 `DELETE`。 PROTOCOL http 或者 https`(如果你在 Elasticsearch 前面有一个 `https 代理)
HOST : Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。
PORT : 运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。
PATH : API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如: _cluster/stats和_nodes/stats/jvm 。
QUERY_STRING: 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)
BODY : 一个 JSON 格式的请求体 (如果请求需要的话)
Elasticsearch-交互
#三种交互方式
curl命令:
最繁琐
最复杂
最容易出错
不需要安装任何软件,只需要有curl命令
es-head插件
查看数据方便
操作相对容易
需要node环境
kibana
查看数据以及报表格式丰富
操作很简单
需要java环境和安装配置kibana
Elasticsearch安装部署
#安装java
[root@elast01 ~]# yum -y install java-1.8.0
#上传rpm包
[root@elast01 ~]# mkdir -p /server/tools
[root@elast01 tools]# ll
total 111388
-rw-r--r-- 1 root root 114059630 Feb 25 2019 elasticsearch-6.6.0.rpm
[root@elast01 tools]#
#安装rpm包
[root@elast01 tools]# rpm -ivh elasticsearch-6.6.0.rpm
[root@elast01 tools]# systemctl daemon-reload
[root@elast01 tools]# systemctl enable elasticsearch.service
[root@elast01 tools]# systemctl start elasticsearch.service
[root@elast01 tools]#
#检查是否启动成功
[root@elast01 tools]# netstat -lntup|grep 9200
tcp6 0 0 127.0.0.1:9200 :::* LISTEN 1556/java
tcp6 0 0 ::1:9200 :::* LISTEN 1556/java
[root@elast01 tools]#
#ES目录介绍
[root@elast01 tools]# rpm -ql elasticsearch
/etc/elasticsearch/elasticsearch.yml #ES主配置文件
/etc/elasticsearch/jvm.options #jvm虚拟机配置
/etc/init.d/elasticsearch #init的启动
/etc/sysconfig/elasticsearch #环境变量相关的参数
/usr/lib/sysctl.d/elasticsearch.conf #jvm相关配置
/usr/lib/systemd/system/elasticsearch.service #system启动文件
/var/lib/elasticsearch # 数据目录
/var/log/elasticsearch #日志目录
/var/run/elasticsearch #pid目录
[root@elast01 tools]#
#ES主配置文件介绍
cluster.name: dba5 #集群名称
node.name: node-1 #节点名称
path.data: /data/elasticsearch #数据目录
path.logs: /var/log/elasticsearch #日志目录
bootstrap.memory_lock: true #锁定内存
network.host: localhost #绑定IP地址
http.port: 9200 #端口号
discovery.zen.ping.unicast.hosts: [“localhost”] #集群发现的通讯节点
discovery.zen.minimum_master_nodes: 2 #最小主节点数
配置ES
[root@elast01 tools]# grep -Ev '#|^$' /etc/elasticsearch/elasticsearch.yml
node.name: node-1
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.1.101
http.port: 9200
[root@elast01 tools]#
[root@elast01 ~]# mkdir -p /data/elasticsearch
[root@elast01 ~]# chown -R elasticsearch:elasticsearch /data/elasticsearch
[root@elast01 ~]# systemctl restart elasticsearch.service
ES启动失败解决
#这个时候可能会启动失败,查看日志可能会发现是锁定内存失败
[root@elast01 ~]# tail -f /var/log/elasticsearch/elasticsearch.log
[2019-10-03T00:34:28,571][ERROR][o.e.b.Bootstrap ] [node-1] node validation exception
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked
#解决
[root@elast01 ~]# systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity
[root@elast01 ~]# systemctl daemon-reload
[root@elast01 ~]# systemctl restart elasticsearch.service
[root@elast01 ~]#
[root@elast01 ~]# netstat -lntup |grep 9200
tcp6 0 0 10.0.1.101:9200 :::* LISTEN 2042/java
[root@elast01 ~]# curl 127.0.0.1:9200
curl: (7) Failed connect to 127.0.0.1:9200; Connection refused
[root@elast01 ~]# curl 10.0.1.101:9200
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "ROrjcxVdRVeQImoF_7SvWA",
"version" : {
"number" : "6.6.0",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "a9861f4",
"build_date" : "2019-01-24T11:27:09.439740Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
[root@elast01 ~]#
es-head交互插件安装
[root@elast01 ~]# yum install nodejs npm openssl screen -y
[root@elast01 ~]# npm install -g cnpm --registry=https://registry.npm.taobao.org
[root@elast01 ~]# cd /opt/
[root@elast01 opt]# git clone git://github.com/mobz/elasticsearch-head.git
[root@elast01 opt]# cd elasticsearch-head/
[root@elast01 elasticsearch-head]# cnpm install
[root@elast01 elasticsearch-head]# screen -S es-head
[root@elast01 elasticsearch-head]# cnpm run start
Ctrl+A+D
#修改ES主配置文件
[root@elast01 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
#浏览器输入ip地址:9100
Elasticsearch-API
一个文档不仅仅包含它的数据 ,也包含元数据 —— 有关文档的信息。
三个必须的元数据元素如下:
_index 文档在哪存放
_type 文档表示的对象类别
_id 文档唯一标识
_index
一个 索引 应该是因共同的特性被分组到一起的文档集合。 例如,你可能存储所有的产品在索引 products 中,而存储所有销售的交易到索引 sales 中
_type
数据可能在索引中只是松散的组合在一起,但是通常明确定义一些数据中的子分区是很有用的。 例如,所 有的产品都放在一个索引中,但是你有许多不同的产品类别,比如 "electronics" 、 "kitchen" 和 "lawn- care"。 这些文档共享一种相同的(或非常相似)的模式:他们有一个标题、描述、产品代码和价格。他们只是正 好属于“产品”下的一些子类。
Elasticsearch 公开了一个称为 types (类型)的特性,它允许您在索引中对数据进行逻辑分区。不同 types 的文档可能有不同的字段,但最好能够非常相似。
_id
ID 是一个字符串, 当它和 _index 以及 _type 组合就可以唯一确定 Elasticsearch 中的一个文档。 当你创 建一个新的文档,要么提供自己的 _id ,要么让 Elasticsearch 帮你生成
创建索引
curl -XPUT '10.0.1.101:9200/vipinfo?pretty'
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : ”vipinfo"
}
插入文档数据
curl -XPUT '10.0.1.101:9200/vipinfo/user/1?pretty' -H 'Content-Type: application/json' -d'
{
"first_name" : "John",
"last_name": "Smith",
"age" : 25,
"about" : "I love to go rock climbing", "interests": [ "sports", "music" ]
}'
curl -XPUT '10.0.1.101:9200/vipinfo/user/2?pretty' -H 'Content-Type: application/json' -d' {
"first_name": "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums", "interests": [ "music" ]
}'
curl -XPUT '10.0.1.101:9200/vipinfo/user/3?pretty' -H 'Content-Type: application/json' -d' {
"first_name": "Douglas", "last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets", "interests": [ "forestry" ]
}'
查询索引中所有的
curl -XGET 10.0.1.101:9200/vipinfo/user/_search?pretty
查询指定文档数据
curl -XGET '10.0.1.101:9200/vipinfo/user/1?pretty'
curl -XGET '10.0.1.101:9200/vipinfo/user/2?pretty’
按条件查询文档数据
查询索引中符合条件的数据:搜索姓氏为Smith的雇员
curl -XGET '10.0.1.101:9200/vipinfo/user/_search?q=last_name:Smith&pretty'
使用Query-string查询
curl -XGET '10.0.1.101:9200/vipinfo/user/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}'
使用过滤器查询
搜索姓氏为 Smith 的雇员,但这次我们只需要年龄大于 30 的。
查询需要稍作调整,使用过滤器 filter ,它支持高效地执行一个结构化查询
curl -XGET '10.0.1.101:9200/vipinfo/user/_search?pretty' -H 'Content-Type: application/json' -d'{
"query" : {
"bool": {
"must": {
"match" : {
"last_name" : "smith"
}
},
"filter": {
"range" : {"age" : { "gt" : 30 }
}
}
}
}
}'
更新数据的两种方式
#PUT更新,需要填写完整的信息
curl -XPUT '10.0.1.101:9200/vipinfo/user/1?pretty' -H 'Content-Type: application/json' -d'
{
"first_name" : "John",
"last_name": "Smith",
"age" : 27,
"about" : "I love to go rock climbing", "interests": [ "sports", "music" ]
}'
#POST更新,只需要填写需要更改的信息
curl -XPOST '10.0.1.101:9200/vipinfo/user/1?pretty' -H 'Content-Type: application/json' -d'
{
"age" : 29
}'
删除指定文档数据
curl -XDELETE '10.0.1.101:9200/vipinfo/user/1?pretty’
删除索引
curl -XDELETE '10.0.1.101:9200/vipinfo?pretty'
Elasticsearch集群
Elasticsearch 可以横向扩展至数百(甚至数千)的服务器节点,同时可以处理PB级数据 Elasticsearch 天生就是分布式的,并且在设计时屏蔽了分布式的复杂性。Elasticsearch 尽可能地屏蔽了分布式系统的复杂性。
这里列举了一些在后台自动执行的操作:
分配文档到不同的容器 或 分片中,文档可以储存在一个或多个节点中
按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡
复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失
将集群中任一节点的请求路由到存有相关数据的节点
集群扩容时无缝整合新节点,重新分配分片以便从离群节点恢复
一个运行中的 Elasticsearch 实例称为一个 节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成,它们共同承担数据和负载的压力。
当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。
当一个节点被选举成为主节点时,它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等.而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈.任何节点都可以成为主节点。我们的示例集群就只有一个节点,所以它同时也成为了主节点。
作为用户,我们可以将请求发送到 集群中的任何节点,包括主节点.每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点.无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端. Elasticsearch 对这一切的管理都是透明的。
Elasticsearch集群安装部署
主机名 | ip地址 |
---|---|
elast01 | 10.0.1.101 |
elast02 | 10.0.1.102 |
#集群的安装部署和单机没有什么区别,区别在于配置文件里配置上集群的相关参数
集群状态颜色:
绿色:所有条件都满足,数据完整,副本满足
黄色:数据完整,副本不满足
红色:有索引里的数据出现不完整了
紫色:有分片正在同步中
默认自己就是一个集群,默认的集群名称为:elasticsearch
#elast01
[root@elast01 ~]# grep -Ev '#|^$' /etc/elasticsearch/elasticsearch.yml
cluster.name: linux #集群名称,同一个集群内所有节点集群名称要一模一样
node.name: node-1 #节点名称,同一个集群内所有节点的节点名称不能重复
path.data: /data/elasticsearch #数据目录
path.logs: /var/log/elasticsearch #日志目录
bootstrap.memory_lock: true #内存锁定
network.host: 10.0.1.101,127.0.0.1 #绑定监听地址
http.port: 9200 #默认端口号
discovery.zen.ping.unicast.hosts: ["10.0.1.101", "10.0.1.102"] #集群发现节点配置
discovery.zen.minimum_master_nodes: 2 #选项相关参数,有公式 master/2 +1
[root@elast01 ~]#
[root@elast01 ~]# systemctl restart elasticsearch.service
#elast02
[root@elast02 tools]# grep -Ev '#|^$' /etc/elasticsearch/elasticsearch.yml
cluster.name: linux
node.name: node-2
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.1.102,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.1.101", "10.0.1.102"]
discovery.zen.minimum_master_nodes: 2
[root@elast02 tools]#
[root@elast02 tools]# systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity
[root@elast02 ~]# systemctl restart elasticsearch.service
节点角色:
主节点 :负责调度数据返回数据
工作节点 :负责处理数据
默认情况下:
1.所有节点都是工作节点
2.主节点即负责调度又负责处理数据
2个节点,master设置为2的时候,一台出现故障导致集群不可用
解决方案:
把还存活的节点的配置文件集群选举相关的选项注释掉或者改成1
discovery.zen.minimum_master_nodes: 1
重启服务
结论:
两个节点数据不一致会导致查询结果不一致
找出不一致的数据,清空一个节点,以另一个节点的数据为准
然后手动插入修改后的数据
增加第三台节点
![4](图片/4.png)[root@elast03 ~]# yum -y install java-1.8.0
[root@elast03 tools]# rpm -ivh elasticsearch-6.6.0.rpm
[root@elast03 tools]# grep '^[a-z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: linux
node.name: node-3
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.1.103,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.1.102", "10.0.1.103"]
discovery.zen.minimum_master_nodes: 2
[root@elast03 tools]#
[root@elast03 tools]# mkdir -p /data/elasticsearch
[root@elast03 tools]# chown -R elasticsearch:elasticsearch /data/elasticsearch
[root@elast03 tools]# systemctl daemon-reload
[root@elast03 tools]# systemctl enable elasticsearch.service
[root@elast03 tools]# systemctl start elasticsearch.service
[root@elast03 ~]# curl -XPUT 'localhost:9200/index1?pretty'
集群-查看集群信息
查看系统检索信息
Cluster Stats API允许从群集范围的角度检索统计信息。
官网地址:
https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-stats.html
操作命令:
curl -XGET 'http://localhost:9200/_cluster/stats?human&pretty'
查看集群的设置
官方地址:
https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-get-settings.html
操作命令:
curl -XGET 'http://localhost:9200/_cluster/settings?include_defaults=true&human&pretty'
查询节点的状态
官网地址:
https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-info.html
操作命令:
curl -XGET 'http://localhost:9200/_nodes/procese?human&pretty'
curl -XGET 'http://localhost:9200/_nodes/_all/info/jvm,process?human&pretty'
curl -XGET 'http://localhost:9200/_cat/nodes?human&pretty'
集群-分片与复制
#默认ES会创建5分片1副本的配置
[root@elast01 ~]# curl -XPUT 'localhost:9200/index1?pretty'
#同时我们也可以手动分配分片数和副本数
[root@elast01 ~]# curl -XPUT 'localhost:9200/index2?pretty' -H 'Content-Type: application/json' -d'
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}'
#调整福本数
#分片数一旦创建就不能再更改了,但是我们可以调整副本数
[root@elast01 ~]# curl -XPUT 'localhost:9200/index2/_settings?pretty' -H 'Content-Type: application/json' -d'
{
"settings" : {
"number_of_replicas" : 2
}
}'
此时如果我们关闭一个节点,会发现集群状态发生了改变
在我们关闭 Node 1 的同时也失去了主分片 1 和 2 ,并且在缺失主分片的时候索引也不能正常工作。 如果 此时来检查集群的状况,我们看到的状态将会为 red :不是所有主分片都在正常工作。 幸运的是,在其它节点上存在着这两个主分片的完整副本, 所以新的主节点立即将这些分片在 Node 2 和 Node 3 上对应的副本分片提升为主分片, 此时集群的状态将会为 yellow 。 这个提升主分片的过程是瞬间 发生的,如同按下一个开关一般。
为什么我们集群状态是 yellow 而不是 green 呢? 虽然我们拥有所有的三个主分片,但是同时设置了每个主 分片需要对应2份副本分片,而此时只存在一份副本分片。 所以集群不能为 green 的状态,不过我们不必 过于担心:如果我们同样关闭了 Node 2 ,我们的程序 依然 可以保持在不丢任何数据的情况下运行,因为 Node 3 为每一个分片都保留着一份副本。
如果我们重新启动 Node 1 ,集群可以将缺失的副本分片再次进行分配