【超详细】手把手教你ElasticSearch集群搭建

1. ElasticSearch快速入门

1.1. 基本介绍

  • ElasticSearch特色

    Elasticsearch是实时的分布式搜索分析引擎,内部使用Lucene做索引与搜索

    • 实时性:新增到 ES 中的数据在1秒后就可以被检索到,这种新增数据对搜索的可见性称为“准实时搜索”

    • 分布式:意味着可以动态调整集群规模,弹性扩容

    • 集群规模:可以扩展到上百台服务器,处理PB级结构化或非结构化数据

    • 各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作

    Lucene是Java语言编写的全文搜索框架,用于处理纯文本的数据,但它只是一个库,提供建立索引、执行搜索等接口,但不包含分布式服务,这些正是 ES 做的

  • ElasticSearch使用场景

    ElasticSearch广泛应用于各行业领域, 比如维基百科, GitHub的代码搜索,电商网站的大数据日志统计分析, BI系统报表统计分析等。

    • 提供分布式的搜索引擎和数据分析引擎

      比如百度,网站的站内搜索,IT系统的检索, 数据分析比如热点词统计, 电商网站商品TOP排名等。

    • 全文检索,结构化检索,数据分析

      支持全文检索, 比如查找包含指定名称的商品信息; 支持结构检索, 比如查找某个分类下的所有商品信息;

      还可以支持高级数据分析, 比如统计某个商品的点击次数, 某个商品有多少用户购买等等。

    • 支持海量数据准实时的处理

      采用分布式节点, 将数据分散到多台服务器上去存储和检索, 实现海量数据的处理, 比如统计用户的行为日志, 能够在秒级别对数据进行检索和分析。

  • ElasticSearch基本概念介绍

    ElasticSearch Relational Database
    Index Database
    Type Table
    Document Row
    Field Column
    Mapping Schema
    Everything is indexed Index
    Query DSL SQL
    GET http://... SELECT * FROM table...
    PUT http://... UPDATE table SET...
    • 索引(Index)

      相比传统的关系型数据库,索引相当于SQL中的一个【数据库】,或者一个数据存储方案(schema)。

    • 类型(Type)

      一个索引内部可以定义一个或多个类型, 在传统关系数据库来说, 类型相当于【表】的概念。

    • 文档(Document)

      文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,采用JSON格式表示。相当于传统数据库【行】概念

    • 集群(Cluster)

      集群是由一台及以上主机节点组成并提供存储及搜索服务, 多节点组成的集群拥有冗余能力,它可以在一个或几个节点出现故障时保证服务的整体可用性。

    • 节点(Node)

      Node为集群中的单台节点,其可以为master节点亦可为slave节点(节点属性由集群内部选举得出)并提供存储相关数据的功能

    • 切片(shards)

      切片是把一个大文件分割成多个小文件然后分散存储在集群中的多个节点上, 可以将其看作mysql的分库分表概念。 Shard有两种类型:primary主片和replica副本,primary用于文档存储,每个新的索引会自动创建5个Primary shard;Replica shard是Primary Shard的副本,用于冗余数据及提高搜索性能。

file

注意: ES7之后Type被舍弃,只有Index(等同于数据库+表定义)和Document(文档,行记录)。

1.2 ElasticSearch安装

  1. 下载ElasticSearch服务

    下载最新版ElasticSearch7.10.2: https://www.elastic.co/cn/start

  2. 解压安装包

    tar -xvf elasticsearch-7.10.2-linux-x86_64.tar.gz
    
  3. ElasticSearch不能以Root身份运行, 需要单独创建一个用户

    1. groupadd elsearch
    2. useradd elsearch -g elsearch -p elasticsearch
    3. chown -R elsearch:elsearch  /usr/local/elasticsearch-7.10.2
    

    执行以上命令,创建一个名为elsearch用户, 并赋予目录权限。

  4. 修改配置文件

    vi config/elasticsearch.yml, 默认情况下会绑定本机地址, 外网不能访问, 这里要修改下:

    # 外网访问地址
    network.host: 0.0.0.0
    
  5. 关闭防火墙

    systemctl stop  firewalld.service
    systemctl disable  firewalld.service
    
  6. 指定JDK版本

    • 最新版的ElasticSearch需要JDK11版本, 下载JDK11压缩包, 并进行解压。

    • 修改环境配置文件

      vi bin/elasticsearch-env

      参照以下位置, 追加一行, 设置JAVA_HOME, 指定JDK11路径。

      JAVA_HOME=/usr/local/jdk-11.0.11
      
      # now set the path to java
      if [ ! -z "$JAVA_HOME" ]; then
        JAVA="$JAVA_HOME/bin/java"
      else
        if [ "$(uname -s)" = "Darwin" ]; then
          # OSX has a different structure
          JAVA="$ES_HOME/jdk/Contents/Home/bin/java"
        else
          JAVA="$ES_HOME/jdk/bin/java"
        fi
      fi
      
  7. 启动ElasticSearch

    • 切换用户

      su elsearch

    • 以后台常驻方式启动

      bin/elasticsearch -d

  8. 问题记录

    出现max virtual memory areas vm.max_map_count [65530] is too low, increase to at least 错误信息

    修改系统配置:

    • vi /etc/sysctl.conf

      添加

      vm.max_map_count=655360

      执行生效

      sysctl -p

    • vi /etc/security/limits.conf

      在文件末尾添加

      * soft nofile 65536
      
      * hard nofile 131072
      
      * soft nproc 2048
      
      * hard nproc 4096
      
      elsearch soft nproc 125535
      
      elsearch hard nproc 125535
      

      重新切换用户即可:

      su - elsearch

  9. 访问验证

    访问地址:http://192.168.116.140:9200/_cat/health

file

启动状态有green、yellow和red。 green是代表启动正常。

1.3 Kibana服务安装

Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。

  1. 到官网下载, Kibana安装包, 与之对应7.10.2版本, 选择Linux 64位版本下载,并进行解压。

    tar -xvf kibana-7.10.2-linux-x86_64.tar.gz
    
  2. Kibana启动不能使用root用户, 使用上面创建的elsearch用户, 进行赋权:

    chown -R elsearch:elsearch kibana-7.10.2-linux-x86_64
    
  3. 修改配置文件

    vi config/kibana.yml , 修改以下配置:

    # 服务端口
    server.port: 5601
    # 服务地址
    server.host: "0.0.0.0"
    # elasticsearch服务地址
    elasticsearch.hosts: ["http://192.168.116.140:9200"]
    
  4. 启动kibana

    ./kibana -q
    

    看到以下日志, 代表启动正常

    log   [01:40:00.143] [info][listening] Server running at http://0.0.0.0:5601
    

    如果出现启动失败的情况, 要检查集群各节点的日志, 确保服务正常运行状态。

  5. 访问服务

    http://192.168.116.140:5601/app/home#/

1.4 ES的基础操作

  1. 进入Kibana管理后台

    地址: http://192.168.116.140:5601

    进入"Dev Tools"栏:

file
在Console中输入命令进行操作。

  1. 分片设置:

    这里增加名为orders的索引, 因为是单节点, 如果副本数, 是会出现错误。

    PUT orders
    {
        "settings": {
            "index": {
                "number_of_shards": 2,
                "number_of_replicas": 2
            }
        }
    }
    

    查看索引信息, 会出现yellow提示:

file

因为单节点模式, 只有主节点信息:

删除重新创建:

PUT orders
{
    "settings": {
        "index": {
            "number_of_shards": 2,
            "number_of_replicas": 0
        }
    }
}

将分片数设为0, 再次查看, 则显示正常:

file

  1. 索引

    3.1 新建索引orders

    ## 创建索引
    PUT orders
    

    3.2 查询索引orders

    ## 查询索引
    GET orders
    

file

通过查询命令, 能查看到对应信息, 默认分片数和副本数都为1:

"number_of_shards" : "1", ## 主分片数
"number_of_replicas" : "1", ## 副分片数

file
3.3 删除索引

## 删除索引
DELETE orders

3.4 索引的设置

## 设置索引
PUT orders
{
  "settings": {
    "index": {
      "number_of_shards": 1, 
      "number_of_replicas": 0
    }
  }
}
  1. 文档

    4.1 创建文档

    ## 创建文档,生成默认的文档id
    POST orders/_doc
    {
      "name": "袜子1双",
      "price": "200",
      "count": 1,
      "address": "北京市"
    }
    ## 创建文档,生成自定义文档id
    POST orders/_doc/1
    {
      "name": "袜子1双",
      "price": "2",
      "count": 1,
      "address": "北京市"
    }
    

    4.2 查询文档

    ## 根据指定的id查询
    GET orders/_doc/1
    ## 根据指定条件查询文档
    GET orders/_search
    {
      "query": {
        "match": {
          "address": "北京市"
        }
      }
    }
    ## 查询全部文档
    GET orders/_search
    

    4.3 更新文档

    ## 更新文档
    POST orders/_doc/1
    {
      "price": "200"
    }
    ## 更新文档
    POST orders/_update/1
    {
      "doc": {
        "price": "200"
      }
    }
    

    4.4 删除文档

    ## 删除文档
    DELETE orders/_doc/1
    
  2. 对于映射,只能进行字段添加,不能对字段进行修改或删除,如有需要,则重新创建映射。

    ## 设置mapping信息
    PUT orders/_mappings
    {
      "properties":{
        "price": {
          "type": "long"
        }
      }
    }
    ## 设置分片和映射
    PUT orders
    {
      "settings": {
        "index": {
          "number_of_shards": 1, 
          "number_of_replicas": 0
        }
      },
      "mappings": {
        "properties": {
          "name": {
            "type": "text"
          },
          "price": {
            "type": "long"
          },
          "count": {
            "type": "long"
          },
          "address": {
            "type": "text"
          }
        }
      }
    }
    

1.5 ES数据类型

整体数据类型结构:

file

  1. String 类型

    主要分为text与keyword两种类型。两者区别主要在于能否分词。

    • text类型

      会进行分词处理, 分词器默认采用的是standard。

    • keyword类型

      不会进行分词处理。在ES的倒排索引中存储的是完整的字符串。

  2. Date时间类型

    数据库里的日期类型需要规范具体的传入格式, ES是可以控制,自适应处理。

    传递不同的时间类型:

    PUT my_date_index/_doc/1
    { "date": "2021-01-01" } 
    
    PUT my_date_index/_doc/2
    { "date": "2021-01-01T12:10:30Z" } 
    
    PUT my_date_index/_doc/3
    { "date": 1520071600001 } 
    
    
    ## 查看日期数据:
    GET my_date_index/_mapping
    

file

ES的Date类型允许可以使用的格式有:

yyyy-MM-dd HH:mm:ss
yyyy-MM-dd
epoch_millis(毫秒值)

  1. 复合类型

    复杂类型主要有三种: Array、object、nested。

    • Array类型: 在Elasticsearch中,数组不需要声明专用的字段数据类型。但是,在数组中的所有值都必须具有相同的数据类型。举例:

      POST orders/_doc/1
      {
        "goodsName":["足球","篮球","兵乓球", 3]
      }
      
      POST orders/_doc/1
      {
        "goodsName":["足球","篮球","兵乓球"]
      }
      
    • object类型: 用于存储单个JSON对象, 类似于JAVA中的对象类型, 可以有多个值, 比如LIST

posted @ 2022-07-26 14:12  博学谷狂野架构师  阅读(422)  评论(0)    收藏  举报