Elasticsearch学习系列一

Posted jackpothan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch学习系列一相关的知识,希望对你有一定的参考价值。

 Elasticsearch

  Elasticsearch(以下简称ES)是一款Java语言开发的基于Lucene的高效全文搜索引擎。它提供了一个分布式多用户能力的基于RESTful web接口的全文搜索和分析服务,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够实现实时搜索,可以搜索日志或者交易数据,用来分析商业趋势、搜集日志、分析系统瓶颈或者运行发展等等,可以提供预警功能(持续的查询分析某个数据,如果超过一定的值,就进行警告),分析商业信息,在百万级的大数据中轻松的定位关键信息,等等..

  PS:Lucene不是一个完整的全文索引应用,而是一个用Java语言开发的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。详见Lucene:基于Java的全文检索引擎简介

基本概念 

  想了解ES首先就要弄清楚下面的几个概念,这样可以更加方便的学习ES,也不会对ES产生一些误解:

  近实时(NRT)

  ES并不是一个标准的数据库,它不像MongoDB,它侧重于对存储的数据进行搜索。因此要注意到它 不是 实时读写 的,这也就意味着,刚刚存储的数据,并不能马上查询到。当然这里还要区分查询的方式,ES也有数据的查询以及搜索,这里的近实时强调的是搜索....

  集群(Cluster)

  在ES中,对用户来说集群是很透明的。你只需要指定一个集群的名字(默认是elasticsearch),启动的时候,凡是集群是这个名字的,都会默认加入到一个集群中。你不需要做任何操作,选举或者管理都是自动完成的。

  注意,如果群集中只有一个节点,那么它是完全正常的。此外,您还可以拥有多个独立的集群,每个集群都有自己唯一的集群名称。

  节点(Node)

  节点是作为群集一部分的单个服务器,存储数据并参与群集的索引和搜索功能。就像集群一样,节点由名称标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID)。可以将节点配置为按群集名称加入特定群集。默认情况下,每个节点都设置为加入一个名为cluster的集群elasticsearch,这意味着如果您在网络上启动了许多节点并且假设它们可以相互发现 - 它们将自动形成并加入一个名为的集群elasticsearch

  注意,在单个群集中,您可以拥有任意数量的节点。此外,如果您的网络上当前没有其他Elasticsearch节点正在运行,则默认情况下启动单个节点将形成一个名为的新单节点集群elasticsearch

  索引(Index) 

  索引是具有某些类似特征的文档集合。索引由名称标识(必须全部小写),此名称用于在对其中的文档执行索引,搜索,更新和删除操作时引用索引。在单个群集中,您可以根据需要定义任意数量的索引。

  类型(Type)

  类型可以理解成一个索引的逻辑分区,用于标识不同的文档字段信息的集合。但是由于ES还是以索引为粗粒度的单位,因此一个索引下的所有的类型,都存放在一个索引下。这也就导致不同类型相同字段名字的字段会存在类型定义冲突的问题。在6.0.0中已弃用。

  文档(Document)

  文档是存储数据信息的基本单元,使用json来表示。在索引/类型中,您可以根据需要存储任意数量的文档。

  注意,尽管文档实际上驻留在索引中,但实际上必须将文档编入索引/分配给索引中的类型。

  分片与副本(Share & Replicas)

  在ES中,索引会备份成分片,每个分片是独立的lucene索引,可以完成搜索分析存储等工作。创建索引时,只需定义所需的分片数即可。每个分片本身都是一个功能齐全且独立的“索引”,可以托管在集群中的任何节点上。在可以随时发生故障的网络/云环境中,非常有用,强烈建议使用故障转移机制,以防分片/节点以某种方式脱机或因任何原因消失。为此,Elasticsearch允许您将索引的分片的一个或多个副本制作成所谓的副本分片或简称副本。

  总而言之,每个索引可以拆分为多个分片。索引也可以复制为零(表示没有副本)或更多次。复制后,每个索引都将具有主分片(从中复制的原始分片)和副本分片(主分片的副本)。可以在创建索引时为每个索引定义分片和副本的数量。创建索引后,您可以随时动态更改副本数,但不能在事后更改分片数。默认情况下,Elasticsearch中的每个索引都分配了5个主分片和1个副本,这意味着如果群集中至少有两个节点,则索引将包含5个主分片和另外5个副本分片(1个完整副本),总计为每个索引10个分片。

安装

  ES在开发整合时至少需要Java 8,所以在安装之前ES之前,需要确保安装了Java 8 并配置好环境变量。这里我不多介绍,可以查看我往期的博客Linux服务部署--Java(一)

  本文介绍的是单机版,Linux环境常用的wget下载elasticsearch-5.5.1.tar.gz,其他环境或方式可以参考官方文档。目前官方推荐使用的是ES 6.X,目前还不清楚是否有插件兼容问题,所以还是选择的市场主流的ES 5.5.X。

下载

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.tar.gz

解压

tar -xvf elasticsearch-5.5.1.tar.gz

启动

cd  /elasticsearch-5.5.1
./bin/elasticsearch

如果这时报错"max virtual memory areas vm.maxmapcount [65530] is too low",运行下面的命令。

sudo sysctl -w vm.max_map_count=262144

修改集群和节点名称

./elasticsearch -Ecluster.name=my_cluster -Enode.name=my_node

默认情况下,Elasticsearch使用port 9200来提供对其REST API的访问。启动完成后,打开另一个命令行窗口,请求该端口,会得到说明信息。

curl localhost:9200

{
  "name" : "my_node",
  "cluster_name" : "my_cluster",
  "cluster_uuid" : "tf9250XhQ6ee4h7YI11anA",
  "version" : {
    "number" : "5.5.1",
    "build_hash" : "19c13d0",
    "build_date" : "2018-10-24T20:44:24.823Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}

PS:默认情况下,ES 只允许本机访问,如果需要远程访问,可以修改 Elastic 安装目录的config/elasticsearch.yml文件,去掉network.host的注释,将它的值改成0.0.0.0,让任何人都可以访问(线上环境别这么设置哦),然后重新启动 ES。当然,也可以在这里修改集群和节点名称。

# ======================== 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
#
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster 集群名称:
#
cluster.name: my_cluster
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node 节点名称:
#
node.name: my_node
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma) 数据路径:
#
#path.data: /path/to/data      
#
# Path to log files 日志路径:
#
#path.logs: /path/to/logs
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
#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.
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6)绑定的Ip地址:
#
network.host: 0.0.0.0
#
# Set a custom port for HTTP 端口:
#
http.port: 9200
#
# For more information, consult the network module documentation.
#
# --------------------------------- Discovery ----------------------------------
#
# 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]"]
#
#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) 防止脑裂:
#
#discovery.zen.minimum_master_nodes: 3
#
# For more information, consult the zen discovery module documentation.
#
# ---------------------------------- Gateway -----------------------------------
#
# Block initial recovery after a full cluster restart until N nodes are started:
#
#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

当然,ES启动会出现各种各样的错误,比如内存分配不足,无法使用root用户启动,启动直接Killed等等..可以查看Elasticsearch启动错误 和 Centos7下避坑安装elasticsearch

 

以上是关于Elasticsearch学习系列一的主要内容,如果未能解决你的问题,请参考以下文章

java学习系列 Android第一本书《第一行代码》

Elasticsearch学习系列一

ElasticSearch系列之索引机制学习笔记

ElasticSearch系列之索引机制学习笔记

[学习ES系列]-3.ElasticSearch基础交互

[学习ES系列]-1.认识ElasticSearch及环境准备与服务搭建