简介

Elasticsearch 是一个基于 Apache Lucene 的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful API 接口。Elasticsearch 是用 Java 语言开发的,并作为 Apache 许可条款下的开放源码发布,是一种流行的企业级搜索引擎。它能让你以前所未有的速度和规模,去探索你的数据。 它被用作全文检索、结构化搜索、分析以及这三个功能的组合:

  • Wikipedia 使用 Elasticsearch 提供带有高亮片段的全文搜索,还有 search-as-you-type 和 did-you-mean 的建议。
  • 卫报 使用 Elasticsearch 将网络社交数据结合到访客日志中,为它的编辑们提供公众对于新文章的实时反馈。
  • Stack Overflow 将地理位置查询融入全文检索中去,并且使用 more-like-this 接口去查找相关的问题和回答。
  • GitHub 使用 Elasticsearch 对1300亿行代码进行查询。

Elasticsearch 不仅仅为巨头公司服务。它也帮助了很多初创公司,比如 Datadog 和 Klout, Elasticsearch 帮助他们将想法用原型实现,并转化为可扩展的解决方案。Elasticsearch 能运行在你的笔记本电脑上,或者扩展到数百台服务器上来处理PB级数据。

诞生于

许多年前,一个刚结婚的名叫 Shay Banon 的失业开发者,跟着他的妻子去了伦敦,他的妻子在那里学习厨师。 在寻找一个赚钱的工作的时候,为了给他的妻子做一个食谱搜索引擎,他开始使用 Lucene 的一个早期版本。

直接使用 Lucene 是很难的,因此 Shay 开始做一个抽象层,Java 开发者使用它可以很简单的给他们的程序添加搜索功能。 他发布了他的第一个开源项目 Compass。

后来 Shay 获得了一份工作,主要是高性能,分布式环境下的内存数据网格。这个对于高性能,实时,分布式搜索引擎的需求尤为突出, 他决定重写 Compass,把它变为一个独立的服务并取名 Elasticsearch。

第一个公开版本在2010年2月发布,从此以后,Elasticsearch 已经成为了 Github 上最活跃的项目之一,他拥有超过300名 contributors(目前736名 contributors )。 一家公司已经开始围绕 Elasticsearch 提供商业服务,并开发新的特性,但是,Elasticsearch 将永远开源并对所有人可用。

据说,Shay 的妻子还在等着她的食谱搜索引擎……

术语

cluster

代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。Elasticsearch 的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看 Elasticsearch 集群,在逻辑上是个整体,你与任何一个节点的通信和与整个 Elasticsearch 集群通信是等价的。

shards

代表索引分片,Elasticsearch 可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

replicas

代表索引副本,Elasticsearch 可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高 Elasticsearch 的查询效率,Elasticsearch 会自动对搜索请求进行负载均衡。

recovery:

代表数据恢复或叫数据重新分布,Elasticsearch 在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

river:

代表 Elasticsearch 的一个数据源,也是其它存储方式(如:数据库)同步数据到 Elasticsearch 的一个方法。它是以插件方式存在的一个 Elasticsearch 服务,通过读取 river 中的数据并把它索引到 Elasticsearch 中,官方的 river 有 couchDB、RabbitMQ、Twitter 和 Wikipedia。

gateway:

代表 Elasticsearch 索引快照的存储方式,Elasticsearch 默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。Gateway 对索引快照进行存储,当这个 Elasticsearch 集群关闭再重新启动时就会从 Gateway 中读取索引备份数据。Elasticsearch 支持多种类型的 Gateway,有本地文件系统(默认),分布式文件系统,Hadoop 的 HDFS 和 Amazon 的 S3 云存储服务。

discovery.zen:

代表 Elasticsearch 的自动发现节点机制,Elasticsearch 是一个基于 P2P 的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。

Transport:

代表 Elasticsearch 内部节点或集群与客户端的交互方式,默认内部是使用 TCP 协议进行交互,同时它支持 HTTP 协议(JSON格式)、Thrift、Servlet、Memcached、ZeroMQ等的传输协议(通过插件方式集成)。

安装

我这里使用 Docker 进行安装,访问 https://hub.docker.com 并搜索 Elasticsearch 可以看到官方镜像。

$ docker pull elasticsearch:7.4.2

注意:Elasticsearch 官方镜像仓库不支持 latest 的标签了,所以不能直接使用 docker pull elasticsearch 命令直接进行拉取,拉取时必须指定版本号。

单机模式

# 创建名为 betterde 的 Docker 网络
$ docker network create betterde

$ docker run -d \
  --name elasticsearch \
  --net betterde \
  -p 9200:9200 \
  -e "discovery.type=single-node" \
  elasticsearch:7.4.2

集群模式

这里我们使用 Docker Compose 来部署 Elasticsearch 集群, 下面是 docker-compose.yml:

version: '2.2'
services:
  es01:
    image: elasticsearch:7.4.2
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - betterde
  es02:
    image: elasticsearch:7.4.2
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
    networks:
      - betterde
  es03:
    image: elasticsearch:7.4.2
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
    networks:
      - betterde

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks:
  betterde:
    name: betterde
    driver: bridge
$ docker-compose up

注意:如果用于生产环境的话,请至少将系统参数 vm.max_map_count 的值设置成 262144,使用命令 sysctl -w vm.max_map_count=262144 来进行设置。

此时使用 Curl 访问 http://localhost:9200 不出意外的话,可以获取这样的相应:

{
  "name" : "9affc1c058b7",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "vqP1MWdlQxWT8xwJ9A-FyA",
  "version" : {
    "number" : "7.4.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
    "build_date" : "2019-10-28T20:40:44.881551Z",
    "build_snapshot" : false,
    "lucene_version" : "8.2.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

这就说明 Elasticsearch 已经运行起来了。

总结

可以看到,Elasticsearch 虽然很强大,但是对于新手来说,部署起来是非常简单容易上手的。这一体验我们在后续部署其他 Elastic Stack 产品时也能深刻体会到。关于另一个配套的组件 Kibana 我将会单独发一片博文来进行介绍,敬请期待吧。

这里我只是记录了安装 Elasticsearch 的过程,更多的配置和使用时所遇到的坑会在后续的博文中,进行探究。

社区

I hope this is helpful, Happy hacking…