大数据开发初识Elasticsearch(第五十七篇)

279 阅读10分钟

这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情

一、为什么需要掌握Elasticsearch

MapReduce、Hive、Spark、Flink侧重的是数据的清洗和聚合之类的功能,如果我们想要在海量数据里面快速查询出一批满足条件的数据。这些计算引擎都需要生成一个任务提交到集群中去执行,这样中间消耗的时间就长了,并且针对多条件组合查询需求,这些计算引擎在查询的时候基本上都要实现全表扫描了,那这样查询的效率是比较低的。所以为了解决海量数据下的快速检索,以及多条件组合查询的需求,Elasticsearch就应运而生了。

二、Elasticsearch简介

  1. Elasticsearch是一个分布式的全文检索引擎
  2. Elasticsearch是基于Lucene进行封装
  3. 能够达到实时搜索稳定可靠快速等特点
2.1、常见的全文检索引擎
  1. Lucene。

    它是Java家族中最为出名的一个开源搜索引擎。在Java世界中,属于标准的全文检索程序,它提供了完整的查询引擎和索引引擎。但是也存在一些缺点:

    • 不支持分布式,无法扩展,在海量数据下会存在瓶颈
    • 提供的都是低级API
    • 没有提供Web界面,不便于管理
  2. Solr(4.x版本开始支持SolrCloud)

    • 2007年Solr1.1版本发布
    • 2011年Solr3.1版本发布
    • 2013年Solr4.0版本发布,支持分布式

    它是一个用Java开发的独立的企业级搜索应用,它是基于Lucene,它解决了Lucene的一些痛点,提供了Web界面以及高级的API接口。并且从Solr4.0版本开始,Solr开始支持分布式,称为SolrCloud

  3. Elasticsearch

    • 2014年ES1.0版本发布,一开始便是解决海量数据存储而诞生的
    • 2015年ES2.0版本发布

    它是采用Java语言开发的,基于Lucene的开源分布式的搜索引擎,能够实现实时搜索,它最重要的一个特点是天生支持分布式。对外提供RestAPI接口,便于使用,通过外部插件实现Web界面支持,便于管理集群

实际项目中,建议优先考虑ES

2.2、MySQL与ES对比
MySQLElasticsearch
Database(数据库)Index(索引库)
Table(表)Type(类型)从7.x版本开始取消
Row(行)Document(文档)
Column(列)Field(字段)

ES1.x到5.x这些版本中,它是正常支持这个Type的。每个一个Index下面可以有多个Type。对应MySQL,一个数据库里面可以有多张表。从ES6.x版本开始,每一个Index里面只支持一个Type了,其实是一个过渡阶段,从ES7.x版本开始,取消了Type这个概念,那就意味着每一个Index里面存储的数据类型可以认为是同一种,也就是说,不在区分类型了,就是你这个索引库下面存的数据,我们认为都是同一种数据。

取消Type,是基于性能的考虑。因为ES初期是直接参考了关系型数据库的设计模型,它存这个Type,类似表的概念。但是ES的搜索引擎是基于Lucene的,这个基因决定了Type是多余的。

在关系型数据库中,Table是独立的,但是在ES中,同一个Index中不同Type的数据,在底层存储在同一个Lucene的索引文件中的。如果在同一个Index的不同Type中都有一个id字段,那么ES会认为这两个字段是同一个字段。你必须在不同的Type中给这个id字段定义相同的字段类型,否则不同Type中相同字段名称就会在处理的时候出现冲突导致Lucene处理效率下降。那么除此之外,在同一个Index的不同Type下,存储字段个数不一样的数据会导致存储中出现稀疏数据,影响Lucene压缩文档的能力

2.3、ES中核心概念
  1. Cluster 表示一个集群
  2. Shard 表示分片,这个分片是索引库的一些分片
  3. Replica 表示副本,这个副本对应的是分片的副本
  4. Recovery 表示数据恢复,它是一种机制
Cluster

代表ES集群,集群中有多个节点,其中有一个为主节点,主节点是通过选举产生的。ES有一个概念,去中心化。ES集群在逻辑上是一个整体,与任何一个节点的通信和整个ES集群通信是等价的。主节点的职责是负责管理集群状态,包括管理分片的状态和副本的状态,以及节点的发现和删除。

Shard

代表索引库分片,ES集群可以把一个索引库分成多个分片。好处是可以把一个大的索引库水平拆分成多个分片,分布到不同的节点上,构成分布式搜索,提高性能和吞吐量。注意:分片的数量只能在创建索引库时指定,索引库创建后不能更改。

ES集群中一个索引库默认有1个分片,每个分片中最多存储Intger.MaxValue的最大值减去128

在ES7.x版本之前,每一个索引库默认是有五个分片的。

Replica

代表的是分片副本,ES集群可以给分片设置副本。副本的作用:

  • 第一个作用是提高系统的容错性。当某个分片损坏或者丢失的时候,可以从副本中恢复。
  • 第二个作用是提高ES的查询效率,ES会自动对搜索请求进行负载均衡。

注意:分片的副本数量是可以随时修改的,默认情况下,每一个索引库只有一个主分片和一个副本分片。前提是ES集群有两个及以上节点,如果ES集群只有一个节点,那么索引库就只有一个主分片,不会产生副本分片,因为主分片和副本分片,在一个节点里面是没有任何意义的。所以为了保证数据安全以及提高产生效率,建议将副本数量设置为2或者3

Recovery

代表的是数据的恢复和数据重新分布

ES集群在有节点加入或者退出时会根据机器的负载对分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

三、快速上手ES

3.1、安装部署ES
  1. 官网下载

    www.elastic.co/cn/download…

  2. 上传到liunx服务器,进行解压

    tar -zxvf elasticsearch-8.6.2-linux-x86_64.tar.gz

  3. 移动

    mv elasticsearch-8.6.2 /usr/local

  4. 创建data目录

    mkdir data

  5. 进入config目录,修改elasticsearch.yml

    vi config/elasticsearch.yml

    修改
    path.data: /usr/local/elasticsearch-8.6.2/data
    path.logs: /usr/local/elasticsearch-8.6.2/logs
    network.host: 192.168.234.100
    cluster.initial_master_nodes: ["192.168.234.100"]
    
    并在文件最后添加一行 
    
    xpack.security.enabled : false
    ingest.geoip.downloader.enabled: false
    
    node.master: true
    
  6. 修改另外一个配置jvm.options 因为虚拟机内存没那么大,那么改成128m

    -Xms128m

    -Xmx128m

  7. 配置环境变量

    vi /etc/profile

    export ES_JAVA_HOME=/usr/local/elasticsearch-8.6.2/jdk

  8. 使用root账号更改打开的文件数限制及最大虚拟内存限制

    vi /etc/security/limits.conf

    elastic soft nofile 65536
    elastic hard nofile 65536
    

    将elastic用户的文件数限制调整为65536

    vi /etc/sysctl.conf

    文件末尾添加下面一句话

    vm.max_map_count=655360

    使用sysctl -p使系统配置生效

    sysctl -p

  9. 开始启动es

    • 检查当前登录的用户

      whoami

    • 因为es不能使用root用户启动,需要添加一个用户

      useradd elastic

    • 给新添加的用户进行授权

      chown -R elastic /usr/local/elasticsearch-8.6.2

    • 切换esuser进行启动es

      su elastic

      再次授权

      chown -R elastic:elastic /usr/local/elasticsearch-8.6.2

    • 启动

      bin/elasticsearch

      后台方式启动

      bin/elasticsearch -d

  10. 启动浏览器

    输入:http://192.168.234.100:9200/

    {
    name: "bigdata01",
    cluster_name: "elasticsearch",
    cluster_uuid: "_na_",
    version: {
    number: "8.6.2",
    build_flavor: "default",
    build_type: "tar",
    build_hash: "2d58d0f136141f03239816a4e360a8d17b6d8f29",
    build_date: "2023-02-13T09:35:20.314882762Z",
    build_snapshot: false,
    lucene_version: "9.4.2",
    minimum_wire_compatibility_version: "7.17.0",
    minimum_index_compatibility_version: "7.0.0"
    },
    tagline: "You Know, for Search"
    }
    

    说明启动成功

配置说明中文注释
# ======================== 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 see the documentation for further information on configuration options:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html>
#
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
# 集群名称,默认是elasticsearch
# cluster.name: my-application
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
# 节点名称,默认从elasticsearch-2.4.3/lib/elasticsearch-2.4.3.jar!config/names.txt中随机选择一个名称
# node.name: node-1
#
# Add custom attributes to the node:
#
# node.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
# 可以指定es的数据存储目录,默认存储在es_home/data目录下
# path.data: /path/to/data
#
# Path to log files:
# 可以指定es的日志存储目录,默认存储在es_home/logs目录下
# path.logs: /path/to/logs
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
# 锁定物理内存地址,防止elasticsearch内存被交换出去,也就是避免es使用swap交换分区
# bootstrap.memory_lock: true
#
#
#
# 确保ES_HEAP_SIZE参数设置为系统可用内存的一半左右
# Make sure that the `ES_HEAP_SIZE` environment variable is set to about half the memory
# available on the system and that the owner of the process is allowed to use this limit.
#
# 当系统进行内存交换的时候,es的性能很差
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- Network -----------------------------------
#
#
# 为es设置ip绑定,默认是127.0.0.1,也就是默认只能通过127.0.0.1 或者localhost才能访问
# es1.x版本默认绑定的是0.0.0.0 所以不需要配置,但是es2.x版本默认绑定的是127.0.0.1,需要配置
# Set the bind address to a specific IP (IPv4 or IPv6):
#
# network.host: 192.168.0.1
#
#
# 为es设置自定义端口,默认是9200
# 注意:在同一个服务器中启动多个es节点的话,默认监听的端口号会自动加1:例如:9200,9201,9202...
# Set a custom port for HTTP:
#
# http.port: 9200
#
# For more information, see the documentation at:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html>
#
# --------------------------------- Discovery ----------------------------------
#
# 当启动新节点时,通过这个ip列表进行节点发现,组建集群
# 默认节点列表:
# 127.0.0.1,表示ipv4的回环地址。
# [::1],表示ipv6的回环地址
#
# 在es1.x中默认使用的是组播(multicast)协议,默认会自动发现同一网段的es节点组建集群,
# 在es2.x中默认使用的是单播(unicast)协议,想要组建集群的话就需要在这指定要发现的节点信息了。
# 注意:如果是发现其他服务器中的es服务,可以不指定端口[默认9300],如果是发现同一个服务器中的es服务,就需要指定端口了。
# 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"]
#
#
#
#
# 通过配置这个参数来防止集群脑裂现象 (集群总节点数量/2)+1
# Prevent the "split brain" by configuring the majority of nodes (total number of nodes / 2 + 1):
#
# discovery.zen.minimum_master_nodes: 3
#
# For more information, see the documentation at:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html>
#
# ---------------------------------- Gateway -----------------------------------
#
# Block initial recovery after a full cluster restart until N nodes are started:
# 一个集群中的N个节点启动后,才允许进行数据恢复处理,默认是1
# gateway.recover_after_nodes: 3
#
# For more information, see the documentation at:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-gateway.html>
#
# ---------------------------------- Various -----------------------------------
# 在一台服务器上禁止启动多个es服务
# Disable starting multiple nodes on a single system:
#
# node.max_local_storage_nodes: 1
#
# 设置是否可以通过正则或者_all删除或者关闭索引库,默认true表示必须需要显式指定索引库名称
# 生产环境建议设置为true,删除索引库的时候必须显式指定,否则可能会误删索引库中的索引库。
# Require explicit names when deleting indices:
#
# action.destructive_requires_name: true
3.2、elasticsearch集群监控管理工具

cerebro github.com/lmenezes/ce…

  1. 上传至linux,解压

    tar -zxvf cerebro-0.9.4.tgz

  2. 进入目录

    cd cerebro-0.9.4

  3. 启动,并且修改默认端口

    bin/cerebro -Dhttp.port=9996

    放到后台运行

    nohup bin/cerebro -Dhttp.port=9999 >/dev/null 2>&1 &

  4. 进入界面

    image-20230219205929133image-20230219205929133

  5. 输入es的地址

    image-20230219213550867