Elasticsearch是什么
Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
但是,Lucene只是一个库。想要发挥其强大的作用,你需使用Java并要将其集成到你的应用中。Lucene非常复杂,你需要深入的了解检索相关知识来理解它是如何工作的。
Elasticsearch也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。
不过,Elasticsearch不仅仅是Lucene和全文搜索引擎,它还提供:
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 实时分析的分布式搜索引擎
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
而且,所有的这些功能被集成到一台服务器,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。上手Elasticsearch非常简单,它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它开箱即用(安装即可使用),只需很少的学习既可在生产环境中使用。Elasticsearch在Apache 2 license下许可使用,可以免费下载、使用和修改。
随着知识的积累,你可以根据不同的问题领域定制Elasticsearch的高级特性,这一切都是可配置的,并且配置非常灵活。
Elasticsearch的功能
分布式的搜索引擎和数据分析引擎
搜索:互联网搜索、电商网站站内搜索、OA系统查询。
数据分析:电商网站查询近1周哪些品类的图书销售前十;新闻网站最近三天阅读量最高的10个关键词;舆情分析。全文检索、结构化检索、数据分析
全文检索:搜索商品包含java的图书
结构化检索:搜索商品分类为Spring的图书有哪些
数据分析:分析每一个分类下有多少种图书对海量数据进行近实时的处理
分布式:ES自动可以将海量数据分散到多台服务器上去存储和检索,进行并行查询,提高检索效率。相对的Lucene是单机应用。
近实时:数据库上亿条数据查询,搜索一次耗时几个小时,是批处理(batch-processing)。而ES只需秒级即可查询海量数据,所以叫近实时,秒级。
Elasticsearch的使用场景
国外:
- 维基百科,类似百度百科,“网络七层协议”的维基百科,全文检索,高亮搜索推荐。
- Stack Overflow(国外的程序讨论论坛),相当于程序员的贴吧,遇到it问题去上面发帖,热心网友下面回答问题。
- GitHub(开源代码管理),搜索上千亿行代码。
- 电商网站,站内搜索,检索商品。
- 日志数据分析,logstash采集数据,ES进行复杂的数据分析(ELK技术,Elasticsearch+logstash+Kibana)
- 商品价格监控网站,用户设定某商品的价格阈值,当价格低于该阈值的时候,发送通知消息给用户。
- BI系统,商业智能(Business Intelligence)。大型连锁超市,分析全国网点传回的数据,分析各个商品在什么季节销售量最好、利润最高。成本管理、店面租金、员工工资、负债等信息进行分析,从而部署下一个阶段的战略目标。
国内:
- 百度搜索,第一次查询使用Elasticsearch找到相应的文档,第二次查询加入相应的广告之类的,然后返回给用户。
- OA、ERP、电商、站内搜索。
Elasticsearch的特点
- 可拓展性:大型分布式集群(数百台服务器)技术,处理PB级数据,大公司可以使用。小公司数据量小,也可以部署单机。且大数据领域使用广泛。
- 技术整合:将全文检索、数据分析、分布式相关技术整合在一起,Lucene(全文检索)、商用的数据分析软件(BI软件),分布式数据库。
- 接口简单:使用restful api进行交互,跨语言。
- 功能强大:Elasticsearch作为传统数据库的一个补充,提供了传统数据库所不能提供的很多功能,如全文检索、同义词处理、相关度排名等。
Elasticsearch和Lucene的关系
- Lucene:最先进,功能最强大的搜索库。如果直接基于Lucene开发,非常复杂,api复杂。
- Elasticsearch:基于Lucene,封装了许多Lucene的底层功能,提供简单易用的restful api接口和许多语言的客户端,如Java的高级客户端(Java High Level Rest Client)和底层客户端(Java Low Level Rest Client)
Elasticsearch的核心概念
NRT(Near Realtime):近实时
Elasticsearch是一个接近实时的搜索平台,这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)。主要体现在两个方面:
- 写入数据时,过1秒才会被搜索到,因为内部在分词、录入索引。
- ES搜索时,搜索和分析数据需要秒级出结果。
文档、索引
Document:文档
- Elasticsearch是面向文档的,文档是所有可搜索数据的最小基础信息单元。
- 一个Document就像数据库中的一行记录,文档会被序列化成JSON格式,保持在Elasticsearch中,多个Document存储于一个索引(Index)中。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。
- 每一个文档都有一个UniqueID
文档的元数据
- 元数据:用于标注稳定的相关信息
- _index:文档所属的索引名
- _type:文档所属的类型名
- _id:文档的主键,在写入的时候,可以指定该Doc的ID值,如果不指定,则系统自动生成一个唯一的UUID值。
- _source:文档的原始Json数据
- _version:文档的版本信息,Elasticsearch通过使用version来保证对文档的变更能以正确的顺序执行,避免乱序造成的数据丢失。
- _score:相关性打分。
- _seq_no:严格递增的顺序号,每个文档一个,Shard级别严格递增,保证后写入的Doc的_seq_no大于先写入的Doc的_seq_no。
- primary_term:primary_term也和_seq_no一样是一个整数,每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1。
- found:查询的ID正确那么ture, 如果 Id 不正确,就查不到数据,found字段就是false。
Index:索引
Index- 索引是文档的容器,是一类文档的结合,一个索引就是包含一堆有相似结构的文档数据。
- Index体现了逻辑空间的概念:每一个索引都有自己的Mapping定义,用于定义包含的文档的字段名和字段类型。
- Shard体现了物理空间的概念:索引中的数据分散在Shard上。
索引的Mapping与Settings
- Mapping定义文档字段的类型
- Setting定义不同的数据分布
索引创建规则
- 仅限小写字母
- 不能包含\、/、*、?、"、<、>、|、#以及空格符等 特殊符号。
- 从7.0版本开始不在包含冒号。
- 不能以-、_或+开头。
- 不能超过255个字节(注意是字节,因此多字节字符将计入255个限制)
当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。索引类似于关系型数据库中Database的概念。在一个集群中,如果你想,可以定义任意多的索引。
Type:类型
Type 可以理解成关系数据库中Table,之前的版本中,索引和文档中间还有个类型的概念,每个索引下可以建立多个类型,文档存储时需要指定index和type,一个type下的document,都有相同的field。从6.0.0开始单个索引中只能有一个类型,7.0.0以后将将不建议使用,8.0.0 以后完全不支持。
- 在7.0之前,一个index可以设置多个Types。
- 6.0开始,Type已经被Deprecated。7.0开始一个索引只能创建一个Type -"_doc"。
Field:字段
就像数据库中的列(Columns),定义每个document应该有的字段。
集群/节点/分片/副本
分布式系统的可用性与扩展性
- 高可用
- 服务可用性-允许有节点停止服务
- 数据可用性-部分节点丢失,不会丢失数据
- 可扩展性
- 存储的水平扩容 请求量提升/数据的不断增长(将数据分布到所用节点上)
Cluster:集群
一个集群包含一个或多个启动着es实例的机器群,通常一台机器起一个es实例,它们共同持有你整个的数据,并一起提供索引和搜索功能。同一网络下,集群名一样的多个es实例自动组成集群,自动均衡分片等行为,一个集群由一个唯一的名字标识,默认集群名为"elasticsearch"。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。在产品环境中显式地设定这个名字是一个好习惯,但是使用默认值来进行测试/开发也是不错的。
集群的健康状态
- Green:主分片与副本都正常分配。
- Yellow:主分片全部正常分配,有副本分片未能正常分配。
- Red:有主分片未能分配(例如 当服务器的磁盘容量超过85%时,去创建了一个新的索引)
节点:node
- 节点是一个Elasticsearch的实例,本质上就是一个JAVA进程
- 每一个节点都有名字,通过配置文件配置或自动分配,或者启动时候指定
- 每一个节点在启动之后,会分配一个UID,保存在data目录下
一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于Elasticsearch集群中的哪些节点。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。
Master-eligible nodes 和Master Node(主节点)
- 每个节点启动后,默认就是一个Master eligible节点(可以设置node.master:false禁止)
- Master-eligible节点可以参加选主流出,成为Master节点。
- 每个节点上都保存了集群的状态,只有Master节点才能修改集群的状态信息。
- 集群状态(cluster state)维护了一个集群中必要的信息所有节点的信息/所有的索引和其相关的Mapping与Setting信息/分片的路由信息。
- 任意节点都能修改信息会导致数据的不一致性。
DataNode(数据节点)
- 可以保存数据的节点。负责保存分片数据。在数据扩展上起到了至关重要的作用。
Coordination Node(协调节点)
- 负责接收Client的请求,将请求分发到合适的节点,最终把结果汇集到一起。
- 每个节点默认都起到了Coordination Node的职责。
Hot&Warm Node
- 不同硬件配置的Data Node,用来实现Hot&Warm架构,降低集群部署的成本。
Machine Learning Node
- 负责跑机器学习的Job,用来做异常检测。
Ingest Node
- Ingest Node 可以看作是数据前置处理转换的节点,支持pipeline管道 设置,可以使用ingest对数据进行过滤、转换等操作,类似于logstash中filter的作用。
Tribe Node
- 5.3开始使用Cross Cluster Search)TribeNode 连接到不同的Elasticsearch集群,并且支持将这些集群当成一个单独的集群处理。
节点角色划分及资源使用情况
角色 | 描述 | 存储 | 内存 | 计算 | 网络 |
---|---|---|---|---|---|
数据节点 | 存储和检索数据 | 极高 | 高 | 高 | 中 |
主节点 | 管理集群状态 | 低 | 低 | 低 | 低 |
Ingest 节点 | 转换输入数据 | 低 | 中 | 高 | 中 |
机器学习节点 | 机器学习 | 低 | 极高 | 极高 | 中 |
协调节点 | 请求转发和合并检索结果 | 低 | 中 | 中 | 中 |
Shard:分片
index数据过大时,将index里面的数据,分为多个shard,分布式的存储在各个服务器上面,可以支持海量数据和高并发,提升性能和吞吐量,充分利用多台机器的CPU。
replica:副本
在分布式环境下,任何一台机器都会随时宕机,如果宕机,index的一个分片没有导致此index不能搜索。所以为了保证数据安全,我们会将每个index的分片进行备份,存储在另外的机器上,保证少数机器宕机,ES集群仍然可以提供搜索服务。
能正常提供查询和插入的分片我们叫做主分片(primary shard),其余的我们就管它们叫做备份的分片(replica shard)。
ES6默认新建索引时,5分片,1副本,也就是一主一备,共10个分片。所以,ES集群最小规模为2台。ES7,默认1分片,1副本,一共2分片。
副本有两个重要作用
- 1、服务高可用:由于数据只有一份,如果一个node挂了,那存在上面的数据就都丢了,有了replicas,只要不是存储这条数据的node全挂了,数据就不会丢。因此分片副本不会与主分片分配到同一个节点。
- 2、扩展性能:通过在所有replicas上并行搜索提高搜索性能.由于replicas上的数据是近实时的(near realtime),因此所有replicas都能提供搜索功能,通过设置合理的replicas数量可以极高的提高搜索吞吐量。
分片的设定
对于生产环境中分片的设定,需要提前做好容量规划,因为主分片数是在索引创建时预先设定的,后续无法修改。
分片数设置过小
- 导致后续无法增加节点实现水平扩展。
- 单个分片的数据量太大,导致数据重新分配耗时。
分片数设置过大
- 影响搜索结构的相关性打分,影响统计结果的准确性。
- 单个节点上过多的分片,会导致资源浪费,同时也会影响性能。
分片为主分片和备份分片
- 副本分片数提高了数据冗余量。
- 主分片挂掉以后能够自动由副本分片升为主分片。
- 备份分片还能够降低主分片的查询压力(会消耗更多的系统性能)。
shard & replica说明
一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。
为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。
分片之所以重要,主要有两方面的原因:
允许你水平分割/扩展你的内容容量,允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量,至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户的你来说,这些都是透明的。
在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了。这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。复制之所以重要,主要有两方面的原因:
在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。
扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行
总之,每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制数量,但是不能改变分片的数量。
默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。一个索引的多个分片可以存放在集群中的一台主机上,也可以存放在多台主机上,这取决于你的集群机器数量。主分片和复制分片的具体位置是由ES内在的策略所决定的。
REST API
Elasticsearch提供了一个非常全面和强大的REST API,使用它与集群进行交互。
- 1、检查群集,节点和索引运行状况,状态和统计信息。
- 2、管理您的群集,节点和索引数据和元数据。
- 3、对索引执行CRUD(创建,读取,更新和删除)和搜索操作。
- 4、执行高级搜索操作,例如分页,排序,过滤,脚本编写,聚合等。
数据库核心概念 VS Elasticsearch核心概念
关系型数据库(MySQL) | 非关型数据库(Elasticsearch) |
---|---|
数据库Database | 索引Index |
表Table | 索引Index(原为Type) |
数据行Row | 文档Document |
数据列Column | 字段Field |
约束Schema | 映射Mapping |
Windows环境下Elasticsearch安装
安装JDK
Elasticsearch7.3.0需要安装JDK1.8.0_73以上版本
Elasticsearch下载地址:https://www.elastic.co/cn/downloads/past-releases
下载和解压Elasticsearch7.3.0
下载和解压Elasticsearch7.3.0目录:
bin:脚本目录,包括启动、停止等可执行脚本。
config:配置文件目录。
data:索引目录,存放索引文件的地方。
logs:日志目录。
modules:模块目录,包括了es的功能模块。
plugins:插件目录,es支持插件机制。
配置文件
ES的配置文件的地址根据安装形式的不同而不同:
- 使用zip、tar安装,配置文件的地址在安装目录下的config目录中。
- 使用RPM安装,配置文件在/etc/elasticsearch目录下。
- 使用MSI安装,配置文件的地址在安装目录的config下,并且会自动将config目录地址写入环境变量ES_PATH_CONF。
config/elasticsearch.yml 主配置文件
config/jvm.options jvm参数配置文件
cofnig/log4j2.properties 日志配置文件
elasticsearch.yml
配置格式YAML,可以采用如下两种方式
path:
data: /var/lib/elasticsearch
logs: /var/log/elasticsearch
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
elasticsearch.yml常用配置如下:
cluster.name:
# 配置elasticsearch的集群名称,默认是elasticsearch,建议修改成有意义的名字
node.name:
# 节点名称,通常一台物理机器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名字,方便管理。
# 一个或多个节点组成一个cluster集群,集群是一个逻辑的概念,节点是物理概念
path.conf:
# 设置配置文件的存储路径,tar或zip包安装默认在es的根目录下的config文件夹,rpm安装在/etc/elasticsearch
path.data:
# 设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个路径用,隔开
path.logs:
# 设置日志文件的存储路径,默认是es目录下的logs文件夹
path.plugins:
# 设置插件的存放路径,默认是es目录下的plugins文件夹
bootstrap.memory_lock: true
# 设置为true可以锁住es使用的内存,避免内存与swap分区交换数据
network.host:
# 设置绑定主机的ip地址,设置为0.0.0.0表示绑定任何ip,允许外网访问,生产环境建议设置为具体的ip
http.port: 9200
# 设置对外服务的http端口,默认为9200
transport.tcp.port: 9300
# 集群节点之间通信端口
node.master:
# 指定该节点是否有资格被选举成master节点,默认是true,如果原来的master宕机,会重新选举新的master
node.data:
# 指定该节点是否存储索引数据,默认为true
discovery.zen.ping.unicast.hosts: ["host1:port","host2:port",......]
# 设置集群中master节点的初始列表
discovery.zen.ping.timeout: 3s
# 设置es自动发现节点连接超时时间,默认为3秒,如果网络延迟高可设置大一些
discovery.zen.minimum_master_nodes:
# 主节点数量的最小值,此值得公式为:(master_eligible_nodes / 2) + 1
# 比如有3个符合要求的主节点,那么这里要设置为2
node.max_local_storage_nodes:
# 单机允许的最大存储节点数,通常单机启动一个节点建议设置为1,开发环境如果单机启动多个节点建议设置大于1
elasticsearch.yml详细配置如下:
##################### Elasticsearch Configuration Example #####################
#
# 只是挑些重要的配置选项进行注释,其实自带的已经有非常细致的英文注释了!
# https://www.elastic.co/guide/en/elasticsearch/reference/current/modules.html
#
################################### Cluster ###################################
# 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的.
# es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
# cluster.name可以确定你的集群名称,当你的elasticsearch集群在同一个网段中elasticsearch会自动的找到具有相同cluster.name的elasticsearch服务.
# 所以当同一个网段具有多个elasticsearch集群时cluster.name就成为同一个集群的标识.
# cluster.name: elasticsearch
#################################### Node #####################################
# https://www.elastic.co/guide/en/elasticsearch/reference/5.1/modules-node.html#master-node
# 节点名称同理,可自动生成也可手动配置.
# node.name: node-1
# 允许一个节点是否可以成为一个master节点,es是默认集群中的第一台机器为master,如果这台机器停止就会重新选举master.
# node.master: true
# 允许该节点存储数据(默认开启)
# node.data: true
# 配置文件中给出了三种配置高性能集群拓扑结构的模式,如下:
# 1. 如果你想让节点从不选举为主节点,只用来存储数据,可作为负载器
# node.master: false
# node.data: true
# node.ingest: true #默认true
# 2. 如果想让节点成为主节点,且不存储任何数据,并保有空闲资源,可作为协调器
# node.master: true
# node.data: false
# node.ingest: true
# 3. 如果想让节点既不称为主节点,又不成为数据节点,那么可将他作为搜索器,从节点中获取数据,生成搜索结果等
# node.master: false
# node.data: false
# node.ingest: true
#
# 4. 仅作为协调器
# node.master: false
# node.data: false
# node.ingest: false
# 监控集群状态有一下插件和API可以使用:
# Use the Cluster Health API [http://localhost:9200/_cluster/health], the
# Node Info API [http://localhost:9200/_nodes] or GUI tools # such as ,
# A node can have generic attributes associated with it, which can later be used
# for customized shard allocation filtering, or allocation awareness. An attribute
# is a simple key value pair, similar to node.key: value, here is an example:
# 每个节点都可以定义一些与之关联的通用属性,用于后期集群进行碎片分配时的过滤
# node.rack: rack314
# 默认情况下,多个节点可以在同一个安装路径启动,如果你想让你的es只启动一个节点,可以进行如下设置
# node.max_local_storage_nodes: 1
#################################### Index ####################################
# 设置索引的分片数,默认为5
#index.number_of_shards: 5
# 设置索引的副本数,默认为1:
#index.number_of_replicas: 1
# 配置文件中提到的最佳实践是,如果服务器够多,可以将分片提高,尽量将数据平均分布到大集群中去
# 同时,如果增加副本数量可以有效的提高搜索性能
# 需要注意的是,"number_of_shards" 是索引创建后一次生成的,后续不可更改设置
# "number_of_replicas" 是可以通过API去实时修改设置的
#################################### Paths ####################################
# 配置文件存储位置
# path.conf: /path/to/conf
# 数据存储位置(单个目录设置)
# path.data: /path/to/data
# 多个数据存储位置,有利于性能提升
# path.data: /path/to/data1,/path/to/data2
# 临时文件的路径
# path.work: /path/to/work
# 日志文件的路径
# path.logs: /path/to/logs
# 插件安装路径
# path.plugins: /path/to/plugins
#################################### Plugin ###################################
# 设置插件作为启动条件,如果一下插件没有安装,则该节点服务不会启动
# plugin.mandatory: mapper-attachments,lang-groovy
################################### Memory ####################################
# 当JVM开始写入交换空间时(swapping)ElasticSearch性能会低下,你应该保证它不会写入交换空间
# 设置这个属性为true来锁定内存,同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过 `ulimit -l unlimited` 命令
# bootstrap.mlockall: true
# 确保 ES_MIN_MEM 和 ES_MAX_MEM 环境变量设置为相同的值,以及机器有足够的内存分配给Elasticsearch
# 注意:内存也不是越大越好,一般64位机器,最大分配内存别才超过32G
############################## Network And HTTP ###############################
# 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0
# network.bind_host: 192.168.0.1 #只有本机可以访问http接口
# 设置其它节点和该节点交互的ip地址,如果不设置它会自动设置,值必须是个真实的ip地址
# network.publish_host: 192.168.0.1
# 同时设置bind_host和publish_host上面两个参数
# network.host: 192.168.0.1 #绑定监听IP
# 设置节点间交互的tcp端口,默认是9300
# transport.tcp.port: 9300
# 设置是否压缩tcp传输时的数据,默认为false,不压缩
# transport.tcp.compress: true
# 设置对外服务的http端口,默认为9200
# http.port: 9200
# 设置请求内容的最大容量,默认100mb
# http.max_content_length: 100mb
# 使用http协议对外提供服务,默认为true,开启
# http.enabled: false
###################### 使用head等插件监控集群信息,需要打开以下配置项 ###########
# http.cors.enabled: true
# http.cors.allow-origin: "*"
# http.cors.allow-credentials: true
################################### Gateway ###################################
# gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统
# gateway.type: local
# 下面的配置控制怎样以及何时启动一整个集群重启的初始化恢复过程
# (当使用shard gateway时,是为了尽可能的重用local data(本地数据))
# 一个集群中的N个节点启动后,才允许进行恢复处理
# gateway.recover_after_nodes: 1
# 设置初始化恢复过程的超时时间,超时时间从上一个配置中配置的N个节点启动后算起
# gateway.recover_after_time: 5m
# 设置这个集群中期望有多少个节点.一旦这N个节点启动(并且recover_after_nodes也符合),
# 立即开始恢复过程(不等待recover_after_time超时)
# gateway.expected_nodes: 2
############################# Recovery Throttling #############################
# 下面这些配置允许在初始化恢复,副本分配,再平衡,或者添加和删除节点时控制节点间的分片分配
# 设置一个节点的并行恢复数
# 1.初始化数据恢复时,并发恢复线程的个数,默认为4
# cluster.routing.allocation.node_initial_primaries_recoveries: 4
# 2.添加删除节点或负载均衡时并发恢复线程的个数,默认为2
# cluster.routing.allocation.node_concurrent_recoveries: 2
# 设置恢复时的吞吐量(例如:100mb,默认为0无限制.如果机器还有其他业务在跑的话还是限制一下的好)
# indices.recovery.max_bytes_per_sec: 20mb
# 设置来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5
# indices.recovery.concurrent_streams: 5
# 注意: 合理的设置以上参数能有效的提高集群节点的数据恢复以及初始化速度
################################## Discovery ##################################
# 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点.默认为1,对于大的集群来说,可以设置大一点的值(2-4)
# discovery.zen.minimum_master_nodes: 1
# 探查的超时时间,默认3秒,提高一点以应对网络不好的时候,防止脑裂
# discovery.zen.ping.timeout: 3s
# For more information, see
#
# 设置是否打开多播发现节点.默认是true.
# 当多播不可用或者集群跨网段的时候集群通信还是用单播吧
# discovery.zen.ping.multicast.enabled: false
# 这是一个集群中的主节点的初始列表,当节点(主节点或者数据节点)启动时使用这个列表进行探测
# discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
# Slow Log部分与GC log部分略,不过可以通过相关日志优化搜索查询速度
################ X-Pack ###########################################
# 官方插件 相关设置请查看此处
# https://www.elastic.co/guide/en/x-pack/current/xpack-settings.html
#
############## Memory(重点需要调优的部分) ################
# Cache部分:
# es有很多种方式来缓存其内部与索引有关的数据.其中包括filter cache
# filter cache部分:
# filter cache是用来缓存filters的结果的.默认的cache type是node type.node type的机制是所有的索引内部的分片共享filter cache.node type采用的方式是LRU方式.即:当缓存达到了某个临界值之后,es会将最近没有使用的数据清除出filter cache.使让新的数据进入es.
# 这个临界值的设置方法如下:indices.cache.filter.size 值类型:eg.:512mb 20%。默认的值是10%。
# out of memory错误避免过于频繁的查询时集群假死
# 1.设置es的缓存类型为Soft Reference,它的主要特点是据有较强的引用功能.只有当内存不够的时候,才进行回收这类内存,因此在内存足够的时候,它们通常不被回收.另外,这些引用对象还能保证在Java抛出OutOfMemory异常之前,被设置为null.它可以用于实现一些常用图片的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory.在es的配置文件加上index.cache.field.type: soft即可.
# 2.设置es最大缓存数据条数和缓存失效时间,通过设置index.cache.field.max_size: 50000来把缓存field的最大值设置为50000,设置index.cache.field.expire: 10m把过期时间设置成10分钟.
# index.cache.field.max_size: 50000
# index.cache.field.expire: 10m
# index.cache.field.type: soft
# field data部分&&circuit breaker部分:
# 用于fielddata缓存的内存数量,主要用于当使用排序,faceting操作时,elasticsearch会将一些热点数据加载到内存中来提供给客户端访问,但是这种缓存是比较珍贵的,所以对它进行合理的设置.
# 可以使用值:eg:50mb 或者 30%(节点 node heap内存量),默认是:unbounded #indices.fielddata.cache.size: unbounded
# field的超时时间.默认是-1,可以设置的值类型: 5m #indices.fielddata.cache.expire: -1
# circuit breaker部分:
# 断路器是elasticsearch为了防止内存溢出的一种操作,每一种circuit breaker都可以指定一个内存界限触发此操作,这种circuit breaker的设定有一个最高级别的设定:indices.breaker.total.limit 默认值是JVM heap的70%.当内存达到这个数量的时候会触发内存回收
# 另外还有两组子设置:
#indices.breaker.fielddata.limit:当系统发现fielddata的数量达到一定数量时会触发内存回收.默认值是JVM heap的70%
#indices.breaker.fielddata.overhead:在系统要加载fielddata时会进行预先估计,当系统发现要加载进内存的值超过limit * overhead时会进行进行内存回收.默认是1.03
#indices.breaker.request.limit:这种断路器是elasticsearch为了防止OOM(内存溢出),在每次请求数据时设定了一个固定的内存数量.默认值是40%
#indices.breaker.request.overhead:同上,也是elasticsearch在发送请求时设定的一个预估系数,用来防止内存溢出.默认值是1
# Translog部分:
# 每一个分片(shard)都有一个transaction log或者是与它有关的预写日志,(write log),在es进行索引(index)或者删除(delete)操作时会将没有提交的数据记录在translog之中,当进行flush 操作的时候会将tranlog中的数据发送给Lucene进行相关的操作.一次flush操作的发生基于如下的几个配置
#index.translog.flush_threshold_ops:当发生多少次操作时进行一次flush.默认是 unlimited #index.translog.flush_threshold_size:当translog的大小达到此值时会进行一次flush操作.默认是512mb
#index.translog.flush_threshold_period:在指定的时间间隔内如果没有进行flush操作,会进行一次强制flush操作.默认是30m #index.translog.interval:多少时间间隔内会检查一次translog,来进行一次flush操作.es会随机的在这个值到这个值的2倍大小之间进行一次操作,默认是5s
#index.gateway.local.sync:多少时间进行一次的写磁盘操作,默认是5s
# 以上的translog配置都可以通过API进行动态的设置
jvm.options
设置最小和最大的JVM堆内存大小
在jvm.options中设置-Xms和-Xmx
- 1、将两个值设置相等。
- 2、Xmx设置为不超过物理内存的一半
log4j2.properties
日志文件设置,ES使用log4j,注意日志级别的配置。
启动Elasticsearch
bin/elasticsearch.bat
注意:Elasticsearch7 Windows版本不支持机器学习,所以在elasticsearch.yml文件中添加如下配置:
node.name: node-1
cluster.initial_master_nodes: ["node-1"]
xpack.ml.enabled: true
http.cors.enabled: true
http.cors.allow-origin: /.*/
检查Elasticsearch是否启动成功
浏览器访问:http://localhost:9200/
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "HethbytURomnsf4j56On1Q",
"version" : {
"number" : "7.3.0",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "de777fa",
"build_date" : "2019-07-24T18:30:11.767338Z",
"build_snapshot" : false,
"lucene_version" : "8.1.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
浏览器访问http://localhost:9200/_cluster/health查询集群状态
{
"cluster_name":"elasticsearch",
"status":"green",
"timed_out":false,
"number_of_nodes":1,
"number_of_data_nodes":1,
"active_primary_shards":0,
"active_shards":0,
"relocating_shards":0,
"initializing_shards":0,
"unassigned_shards":0,
"delayed_unassigned_shards":0,
"number_of_pending_tasks":0,
"number_of_in_flight_fetch":0,
"task_max_waiting_in_queue_millis":0,
"active_shards_percent_as_number":100
}
解释:status集群状态,green所有分片可用;yellow所有主分片可用;red主分片不可用,集群不可用。
Windows环境下安装Kibana
- 1、Kibana是es数据的前端展现,数据分析时可以可以方便的看到数据,作为开发人员,可以方便访问es。
- 2、下载解压Kibana
- 3、启动Kibana:bin/Kibana.bat
- 4、浏览器访问:http://localhost:5601/,进入DevTools界面,像plsql一样支持代码提示。
- 5、发送get请求,查看集群状态GET _cluster/health,相当于浏览器访问。
堆栈信息查看:
Windows安装head插件,
head插件是es的一个可视化管理插件,用来监视es的状态,并通过head客户端和es服务进行交互,比如创建映射,创建索引等,head的项目地址https://github.com/mobz/elasticsearch-head。
从elasticsearch 6.0开始,head插件支持nodejs运行
#### 使用内置服务器运行
* `git clone git://github.com/mobz/elasticsearch-head.git`
* `cd elasticsearch-head`
* `npm install`
* `npm run start`
* `open` [http://localhost:9100/](http://localhost:9100/)
参考:
https://www.cnblogs.com/xiaochina/p/6855591.html
https://www.cnblogs.com/qdhxhz/p/11448451.html
https://www.cnblogs.com/Onlywjy/p/12194626.html