念叨了两天,第一篇安装教程总算来啦!。好了,废话不多说,关于elasticsearch是什么这里我就不做过多介绍了,咱们直接上干货。

安装

前台运行

elasticsearch的安装要说是非常简单的,可以说没有什么安转操作,直接下载相关文件,运行启动命令即可,首先进入到下载页面,选择适合自己的版本下载,如下:

图片描述

有针对Windows的压缩包zip,也有msi这种安装引导程序,有针对mac和linux的deb以及rpm,读者根据自己的操作系统选择合适的压缩包下载即可。

在下载页还有安装步骤介绍,如下:

图片描述

由这段介绍可以看出,下载解压后直接运行bin/elasticsearch (Windows下运行binelasticsearch.bat)即可。运行成功后,在浏览器中访问http://localhost:9200,查看是否启动成功,启动成功结果如下:

图片描述

可以看到,启动后,默认的节点名称为Huf6FQ-,默认的集群名称为elasticsearch,当然,也可以在启动命令中自定义节点名称和集群名称,如下:

./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1

执行结果如下:

图片描述

小贴士:

elasticsearch的运行基于Java,因此,电脑上需要安装Java环境,推荐Java版本为1.8.0_131及以上。

后台运行

刚刚的启动方式是前台运行,用户按下Ctrl+C,运行就停止了,这种运行方式适合测试和开发环境,生产环境,直接在后台运行即可,启动命令如下:

./elasticsearch -d

如此,使elasticsearch在后台运行,在后台运行的elasticsearch可以使用jdk自带的查看当前Java进程的工具jps命令查看运行状况,如下:

图片描述

当然也可以直接使用Linux中的命令查看,如下:

ps aux|grep elasticsearch

不管哪一种查看方式,查看后都可以获取到elasticsearch的进程id,然后通过kill命令可以关闭elasticsearch,如下:

kill 8423

操作结果如下:

图片描述

配置

安装目录介绍

elasticsearch下载之后,解压后,可以看到目录结构如下:

图片描述

目录含义如下:

文件/文件夹 作用
bin 可执行文件存放目录,例如启动文件
config 配置文件存放目录
data 数据存储目录
lib 第三方依赖库
logs 运行日志输出目录
modules 依赖模块目录
plugins 插件目录
LICENSE.txt LICENSE声明文件
NOTICE.txt 版权声明文件
README.textile 框架介绍信息

配置介绍

在config目录下,主要有如下配置文件:

  • elasticsearch.keystore
  • jvm.options
  • role_mapping.yml
  • users
  • elasticsearch.yml
  • log4j2.properties
  • roles.yml
  • users_roles

其中,我们经常涉及到的有三个,elasticsearch.yml、log4j2.properties以及jvm.options,其中,elasticsearch.yml是elasticsearch的基本配置文件,log4j2是日志输出配置文件,jvm则是jvm基本参数配置。这里主要来看看elasticsearch.yml配置文件,如下:

# ======================== Elasticsearch Configuration =========================
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
#       Before you set out to tweak and tune the configuration, make sure you
#       understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please consult the documentation for further information on configuration options:
# https://www.elastic.co/guide/en/elasticsearch/reference/index.html
#
# ---------------------------------- 集群配置 -----------------------------------
#
# Use a descriptive name for your cluster:
#配置集群名字,集群名字默认为elasticsearch,
#elasticsearch会自动发现在同一网段下的elasticsearch节点。
#读者在第一次启动elasticsearch时,在浏览器中输入http://localhost:9200,
#在返回的数据中,就有集群名字,默认即为elasticsearch。
#cluster.name: my-application
#
# ------------------------------------ 节点配置 ------------------------------------
#
# Use a descriptive name for the node:
#配置节点名称
#node.name: node-1
#
# Add custom attributes to the node:
#给节点添加自定义属性
#node.attr.rack: r1
#
# ----------------------------------- 路径配置 ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#数据存放目录,默认是elasticsearch下的data目录,可以指定多个目录,用,隔开,如:
#path.data:/path/data1,/path/data2
#path.data: /path/to/data
#
# Path to log files:
#日志存放目录,默认为elasticsearch下的logs目录
#path.logs: /path/to/logs
#
# ----------------------------------- 内存配置 -----------------------------------
#
# Lock the memory on startup:
#配置是否锁住内存。当jvm开始swapping时,elasticsearch的效率降低,为了避免这种情况,可以设置为true。
#bootstrap.memory_lock: true
#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- 网络配置 -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#设置绑定的ip地址
#network.host: 192.168.0.1
#
# Set a custom port for HTTP:
#配置对外提供服务的http端口号
#http.port: 9200
#
# For more information, consult the network module documentation.
#
# --------------------------------- 集群节点发现参数 ----------------------------------
#
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#设置集群中master节点的初始列表,通过这个配置可以发现新加入的集群的节点。  
#discovery.zen.ping.unicast.hosts: ["host1", "host2"]
#
# Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):
#保证集群中的节点可以知道其他n个有master资格的节点,防止出现split brain,默认为1
#discovery.zen.minimum_master_nodes: 
#
# For more information, consult the zen discovery module documentation.
#
# ---------------------------------- Gateway -----------------------------------
#
# Block initial recovery after a full cluster restart until N nodes are started:
#当n个节点启动后,再开始集群的恢复
#gateway.recover_after_nodes: 3
#
# For more information, consult the gateway module documentation.
#
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true

当然这里只是最基本的配置,更多配置读者可以参考官方文档。

核心概念

Elasticsearch安装成功后,在正式启动之前,还需要读者了解Elasticsearch中几个核心概念,掌握这些核心概念,有助于读者更好的理解Elasticsearch。

NRT

Elasticsearch是一个接近实时(near real time)的搜索平台,也就是说,从你建立索引,到这个索引可以被搜索只需要很小的延迟,通常是1秒。

cluster

一个集群就是由一个或多个节点组织在一起, 这些节点共同持有全部的索引数据, 并共同提供索引和搜索功能。 一个集群由一个唯一的名字标识(默认就是“elasticsearch”,在上文启动过程中,也像读者展示了如何自定义集群名称)。 这个名字很重要, 因为一个节点只能通过指定某个集群的名字,来加入这个集群。在生产环境中显式地设定这个名字是一个好习惯,但是使用默认值来进行测试/开发也是不错的。开发者需要确认不要使用相同的集群名字,以避免节点加入到错误的集群。需要注意的是,一个集群中只包含一个节点是合法的。另外,你也可以拥有多个集群,集群以名字区分。

node

一个节点就是集群中的一个服务,作为集群的一部分,它可以用来存储数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的Universally Unique IDentifier (UUID),这个名字会在节点启动时分配给节点。这个名字对于节点管理工作来说很重要,因为开发者需要确定网络中的哪些服务对应于Elasticsearch集群中的哪些节点。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。 默认情况下,每个节点都会被加入到一个叫做“elasticsearch”的集群中,这意味着,如果开发者启动了多个节点, 并且这些节点能够相互发现彼此,那么这些节点会自动加入到一个叫做“elasticsearch”的集群中。
在一个集群里可以拥有任意多个节点。而且,如果当前网络中没有运行任何节点,这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的单节点集群。

index

一个索引就是一个拥有相似特征的文档的集合。例如,客户数据可以建立一个索引,产品目录可以建立一个索引,订单数据可以建立一个索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以创建任意多个索引。

type

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组相同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台 并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
注意:这是一个即将过期的概念,在Elasticsearch 6.0.0或更高版本中创建的索引只包含单个映射类型(type)。在具有多种映射类型的5.x中创建的索引将继续像以前一样在Elasticsearch 6.x中运行。映射类型将在Elasticsearch7.0.0中完全删除。
许多人喜欢将index比喻为关系型数据库中的database,将type比喻为关系型数据库中的table,实际上这个比喻非常不贴切。因为在关系型数据库中,表中的字段都是独立的,但是在Elasticsearch中,在不同的type中,如果filed具有相同的名字,则这些不同的filed实际上是由相同的Lucene Filed提供支持的,因此这种比喻并不恰当;另一方面,在同一索引中存储具有很少或没有共同字段的不同实体会干扰Lucene有效压缩文档的能力。

document

一个文档是一个可被索引的基础信息单元。例如,某一个客户的文档、某一个产品的一个文档、某个订单的一个文档。文档以JSON格式来表示。在一个index/type里面,可以存储任意多的文档。

shards and replicas

一个索引可以存储超出单个节点硬件限制的大量数据。例如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点可能没有这样大的磁盘空间来存储或者单个节点处理搜索请求,响应会太慢。
为了解决这个问题,Elasticsearch提供了将索引划分成多片的能力,这些片叫做分片。当用户创建一个索引的时候,可以指定分片的数量(默为5,但是在7.0版本中默认会变为1)。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引” 可以被放置到集群中的任何节点上。

分片之所以重要,主要有两方面的原因:

  • 允许水平分割/扩展内容容量
  • 允许在分片(位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量

至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于用户来说,这些都是透明的。在一个网络/云的环境里,失败随时都可能发生。在某个分片/节点因为某些原因处于离线状态或者消失的情况下,故障转移机制是非常有用且强烈推荐的。为此, Elasticsearch允许创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。

复制之所以重要,有两个主要原因:

  • 在分片/节点失败的情况下,复制提供了高可用性。复制分片不与原/主要分片置于同一节点上是非常重要的。
  • 因为搜索可以在所有的复制上并行运行,复制可以扩展你的搜索量/吞吐量

总之,每个索引可以被分成多个分片,一个索引也可以被复制0次或多次。一旦复制了,每个索引就有了主分片和复制分片。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,可以在任何时候动态地改变复制的数量,但是不能再改变分片的数量。
在Elasticsearch7.0版本之前,默认情况下,Elasticsearch中的每个索引分配5个主分片和1个复制。这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样每个索引总共就有10个分片(根据官方文档,在7.0版本上,默认的分片数量会有所变化)。

好了,今天的介绍就先到这里。

图片描述


江南一点雨
9k 声望7.6k 粉丝

《Spring Boot+Vue全栈开发实战》作者