介绍
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
ElasticSearch = = ES7 ,在此文档中,我是以ElasticSearch 7.6.2 来操作演示
官网 : https://www.elastic.co/cn/what-is/elasticsearch
基础概念
### 主要概念
节点 - 它指的是Elasticsearch的单个正在运行的实例。单个物理和虚拟服务器容纳多个节点,这取决于其物理资源的能力,如RAM,存储和处理能力。
集群 - 它是一个或多个节点的集合。 集群为整个数据提供跨所有节点的集合索引和搜索功能。
索引 - 它是不同类型的文档和文档属性的集合。索引还使用分片的概念来提高性能。 例如,一组文档包含社交网络应用的数据。
类型/映射 - 它是共享同一索引中存在的一组公共字段的文档的集合。 例如,索引包含社交网络应用的数据,然后它可以存在用于用户简档数据的特定类型,另一类型可用于消息的数据,以及另一类型可用于评论的数据。
文档 - 它是以JSON格式定义的特定方式的字段集合。每个文档都属于一个类型并驻留在索引中。每个文档都与唯一标识符(称为UID)相关联。
碎片 - 索引被水平细分为碎片。这意味着每个碎片包含文档的所有属性,但包含的数量比索引少。水平分隔使碎片成为一个独立的节点,可以存储在任何节点中。主碎片是索引的原始水平部分,然后这些主碎片被复制到副本碎片中。
副本 - Elasticsearch允许用户创建其索引和分片的副本。 复制不仅有助于在故障情况下增加数据的可用性,而且还通过在这些副本中执行并行搜索操作来提高搜索的性能。
对比
window 安装
环境准备
ES 7 对jdk的版本有要求,不低于jdk7。在安装ES7 之前可以通过 java --version 查看自己安装的jdk是否符合要求
注意:没有没有安装,需要自己安装一下jdk,在此不做多于介绍
ES 7 安装
1. ES7.6.2 下载: https://www.elastic.co/cn/downloads/elasticsearch
-
解压ES7.6.2
-
进入到Elasticsearch主目录和
bin
文件夹。在Windows系统下可运行elasticsearch.bat
文件
- Elasticsearch Web界面的默认端口是
9200
,可以通过http://localhost:9200 来查看服务器是否正常启动
注意,上述只是为了演示安装成功效果,关于端口修改,默认配置文件等会再后续介绍。
linux 安装
环境准备
与window相同,都需要保证jdk1.7+
# 我使用的是一台新机器,下面我把我安装jdk的步骤贴出来,仅供参考
# 1. 查询机器上是否含有java版本
rpm -qa | grap java
# 2. yum 查询相关java信息
yum search java
# 3.下载合适的java进行安装
yum install -y jdk-8u181-linux-x64.tar.gz
yum 默认的安装路径是/usr/lib/jvm
# 4. 配置环境变量 vi /etc/profile(系统环境变量) 也可以修改用户环境变量
JAVA_HOME=/root/libs/jdk1.8.0_181
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME PATH
# 5. 使环境变量生效
source /etc/profile
# 6.验证java -version
yum 常用命令
1.列出所有可更新的软件清单命令:yum check-update
2.更新所有软件命令:yum update
3.仅安装指定的软件命令:yum install <package_name>
4.仅更新指定的软件命令:yum update <package_name>
5.列出所有可安裝的软件清单命令:yum list
6.删除软件包命令:yum remove <package_name>
7.查找软件包 命令:yum search <keyword>
8.清除缓存命令:
yum clean packages: 清除缓存目录下的软件包
yum clean headers: 清除缓存目录下的 headers
yum clean oldheaders: 清除缓存目录下旧的 headers
### ES7 安装
-
yum 直接下载安装 [不建议用,因为yum中可能还没收录]
-- 查询elasticsearch yum search elasticsearch -- 安装自己想要的版本 yum install -y elasticsearch 7.6.2
-
把tar包上传解压 rz 包路径
-
进入到ES7/bin/目录下,执行 ./elasticsearch 即可启动
这个会报个错:
由于elasticsearch权限控制严格,不能用root用户启动。
-- 创建用户 adduser es passwd es -- 输入两次密码 mv es文件 chown -r es:es es文件夹 chmod 770 ed文件夹
注意:这只是最简单的操作,后续还需要配置其他配置,后续介绍,本节只是介绍安装,9200是检查服务启动状态是否正常
docker 安装【推荐】
# 拉取镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.6.2
# 启动容器
docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name es docker.elastic.co/elasticsearch/elasticsearch:7.6.2
# 挂载 注意语法
docker run -d -p 9200:9200 -p 9300:9300 -v /root/config/elasticsearch.yml:/usr/local/elasticsearch/config/elasticsearch.yml -e "discovery.type=single-node" --name es docker.elastic.co/elasticsearch/elasticsearch:7.6.2
执行挂载目录文件的时候可能会报错:SettingsException[Failed to load settings from /usr/share/elasticsearch/config/elasticsearch.yml]; nested: AccessDeniedException[/usr/share/elasticsearch/config/elasticsearch.yml];
解决方法:关闭selinux重启即可
# 临时关闭
getenforce ---> 结果Enforcing
setenforce 0 --> 设置临时关闭
# 永久关闭
vim /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled
需要reboot重启
总结:
上面三种安装方式,个人更倾向于dokcer安装,非常简单。上面只是讨论了三种安装方式,下面来详细介绍一下ES7 的配置文件
ES 配置文件
%ES_HOM%/bin/Eelasticsearch 配置elasticsearch环境变量
%ES_HOM%/conf/elasticsearch.yml 配置elasticsearch集群
%ES_HOM%/conf/jvm.options 配置elasticsearch的jvm参数
%ES_HOM%/conf/log4j2.properties 配置elasticsearch日志参数
##################### 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: false
# 2. 如果想让节点成为主节点,且不存储任何数据,并保有空闲资源,可作为协调器
# node.master: true
# node.data: false
# node.ingest: false
# 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 <http://www.elasticsearch.org/overview/marvel/>,
# <http://github.com/karmi/elasticsearch-paramedic>,
# <http://github.com/lukas-vlcek/bigdesk> and
# <http://mobz.github.com/elasticsearch-head> to inspect the cluster state.
# 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
# 设置其它节点和该节点交互的ip地址,如果不设置它会自动设置,值必须是个真实的ip地址
# network.publish_host: 192.168.0.1
# 同时设置bind_host和publish_host上面两个参数
# network.host: 192.168.0.1
# 设置节点间交互的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
# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html>
# 设置是否打开多播发现节点.默认是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
插件安装
window 插件安装
elasticsearch5以后的版本不支持内置的head插件了,所以head插件都需要另外安装,步骤分为以下几步:
elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序,你可以通过插件把它集成到es
elasticsearch-head配置包,下载地址:https://github.com/mobz/elasticsearch-head
elasticsearch-head是一个基于node.js的前端工程,启动elasticsearch-head的步骤如下(这里针对的是elasticsearch 5.x以上的版本):
1、进入elasticsearch-head的文件夹,如:D:XXXXelasticsearch-head
2、执行 npm install
3、执行 npm run start
在浏览器访问http://localhost:9100,可看到如下界面,表示启动成功:
具体步骤如下:
- 去github去搜索上述插件 选中 mobz/elasticsearch-head
2. 下载zip格式即可
3. 解压:
-
进入文件夹下,使用node命令编译启动即可
-
先保证安装node环境:node -v 验证一下 (我这已有就不再介绍安装node的方法了,不会的自己百度即可,完成安装后继续往下走)
-
进入到head目录下 , 执行npm install 进行编译
- 编译好执行启动即可 npm run start
- 访问插件监控的端口:9100 [启动es服务,也可以注册成服务(后续介绍)]
此时显示未连接是正确的,因为我们启动elasticsearch进程和插件进程是相互独立的,我们要在elasticseach进程中配置跨域,然后再启动即可监控到
-
Elasticsearch和插件进行整合操作(单实例下进行整合)
-
停止ES服务和插件服务
-
修改es.yml配置文件,添加跨域配置
# 跨域配置 http.cors.enabled: true http.cors.allow-origin: "*"
-
-
启动ES服务进程和插件进程即可
-
window 下插件安装完成,单节点与插件集成完毕
linux 插件安装
由于head插件本质上还是一个nodejs的工程,因此需要安装node,使用npm来安装依赖的包 在es用户下操作
# wget https://nodejs.org/dist/v6.10.2/node-v6.10.2-linux-x64.tar.xz
# xz -d node-v6.10.2-linux-x64.tar.xz
# tar xvf node-v6.10.2-linux-x64.tar
# mv node-v6.10.2-linux-x64 node
# 配置生效
vim ~/.bashrc
export NODE_HOME=/home/es/node
export PATH=$PATH:$NODE_HOME/bin
source ~/.bashrc
# 查看版本验证
node -v
npm -v
# 下载head插件
yum install –y git -- root权限下或者 sudo yum ..
git clone https://github.com/mobz/elasticsearch-head.git
# 安装grunt
cd elasticsearch-head
npm install -g grunt --registry=https://registry.npm.taobao.org
## 补充:
npm install phantomjs-prebuilt@2.1.16 --ignore-scripts 忽略phantomjs-prebuilt@2.1.16
# 安装插件
npm install
在elasticsearch-head目录下node_modules/grunt下如果没有grunt二进制程序,需要执行:
npm install grunt --save
# 修改配置 elasticsearch-head下Gruntfile.js文件
connect: {
server: {
options: {
hostname: '0.0.0.0', # 追加hostname
port: 9100,
base: '.',
keepalive: true
}
}
}
# 修改_site/app.js 修改ip
init: function(parent) {
this._super();
this.prefs = services.Preferences.instance();
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://192.168.248.154:9200";
if( this.base_uri.charAt( this.base_uri.length - 1 ) !== "/" ) {
// XHR request fails if the URL is not ending with a "/"
this.base_uri += "/";
}
# 修改elasticsearch.yml配置文件
# 修改名字
node.name: linux-es
# 修改host
network.host: 192.168.248.154 -- 对应ip
# 集群站点
cluster.initial_master_nodes: ["linux-es"]
# 添加跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
# 重启es服务和插件服务
es-head npm run start
es ./elasticsearch
docker 插件安装
# docker 安装插件相对简单
# 启动ES7容器,增加跨域配置
docker exec -it 容器名 bash
cd config && vi elasticsearch.yml
# 添加跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
# 重启容器即可
# 拉取插件镜像
docker pull mobz/elasticsearch-head:5
# 运行容器
docker run -d --name elasticsearch-head -p 9100:9100 mobz/elasticsearch-head:5
插件状态介绍
快捷注册
此章节是window下注册成服务,而不是黑窗口常驻
elasticsearch-service.bat后面还可以执行这些命令
install: 安装Elasticsearch服务
remove: 删除已安装的Elasticsearch服务(如果启动则停止服务)
start: 启动Elasticsearch服务(如果已安装)
stop: 停止服务(如果启动)
manager:启动GUI来管理已安装的服务
常见问题汇总
es状态介绍
上面属性可以通过elasticsearch.yml 配置文件自定义修改
elasticsearch-head常见问题
-
head插件默认是连接localhost:9200.如果需要我们可以修改,修改方式与linux安装head插件一样
# 进入容器,修改_site/app.js下的连接ip即可
-
head插件创建索引报错406
# 修改head的 Content-Type 设置
进入容器 vim _site/vendor.js
# 第一步 /contentType 搜索到位置
"application/x-www-form-urlencoded
改成 contentType: "application/json;charset=UTF-8"
# 第二步,退出编辑模式,点击n 进行往下继续搜索
var inspectData = s.contentType === "application/x-www-form-urlencoded" 修改
var inspectData = s.contentType === "application/json;charset=UTF-8"
# 第三步,退出,重启容器即可
docker restart 容器id