美文网首页
Elasticsearch

Elasticsearch

作者: linux_豪哥 | 来源:发表于2020-02-26 22:17 被阅读0次

    Elasticsearch

    一.全文检索和Lucene

    Lucene
    基于java环境,基于Lucene之上包装一层外壳
    Lucene是一个java的搜索引擎库,操作非常繁琐
    全文检索
    将搜索内容进行单词拆分,评分
    比如搜索 “跑步运动员”
    分词成跑步和运动员
    对数据库里的标题进行评分(哪个标题里含有跑步或者运动员)
    比如数据库的标题是以下几个

    1. 跑步运动员
    2. 跑步爱好者
    3. 运动员
      肯定是1的评分最高 既有跑步还有运动员

    倒排索引
    排序哪个数据库里的标题含有分词最多,哪个排第一显示,也就是刚才所说的评分最高的标题

    二. Elasticsearch应用场景

    1.搜索: 电商,百科
    2.高亮显示: github
    3.分析和数据挖掘: ELk

    三. Elasticsearch特点

    1.高性能,分布式
    2.对运维友好,不需要会java语言,开箱即用
    3.功能丰富

    四. Elasticsearch在电商搜索的实现

    mysql:

    skuid    name  
    1        小米10s
    2        华为荣耀
    3        苹果11
    

    ES:

    将mysql中需要搜素的数据存储到ES中,进行分词。 
    聚合运算之后得到SKUID:
    1
    2
    
    拿到ID之后,mysql就只需要简单地where查询即可
    mysql:
    select xx from xxx where skui=1 
    

    五. 第五章: ES安装启动

    1.下载软件

    mkdir /data/soft
    [root@db-01 /data/soft]# ll -h
    total 268M
    -rw-r--r-- 1 root root 109M Feb 25  2019 elasticsearch-6.6.0.rpm
    -rw-r--r-- 1 root root 159M Sep  2 16:35 jdk-8u102-linux-x64.rpm
    

    2.安装jdk

    rpm -ivh jdk-8u102-linux-x64.rpm 
    [root@db-01 /data/soft]# java -version
    openjdk version "1.8.0_212"
    OpenJDK Runtime Environment (build 1.8.0_212-b04)
    OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
    

    3.安装ES

    rpm -ivh elasticsearch-6.6.0.rpm
    

    4.检查

    systemctl start elasticsearch.service
    es启动比较慢
    netstat -lntup|grep 9200
    systemctl status elasticsearch.service
    
    [root@db-01 ~]# curl 127.0.0.1:9200
    {
      "name" : "Zr3WNj9",
      "cluster_name" : "elasticsearch",
      "cluster_uuid" : "HR0ERydmTV2OH55subh7HQ",
      "version" : {
        "number" : "6.6.0",
        "build_flavor" : "default",
        "build_type" : "rpm",
        "build_hash" : "a9861f4",
        "build_date" : "2019-01-24T11:27:09.439740Z",
        "build_snapshot" : false,
        "lucene_version" : "7.6.0",
        "minimum_wire_compatibility_version" : "5.6.0",
        "minimum_index_compatibility_version" : "5.0.0"
      },
      "tagline" : "You Know, for Search"
    }
    

    六. ES配置

    1.查看ES有哪些配置

    [root@db-01 ~]# rpm -qc elasticsearch
    /etc/elasticsearch/elasticsearch.yml    #ES主配置文件    
    /etc/elasticsearch/jvm.options          #jvm配置
    /etc/init.d/elasticsearch               #init的启动文件
    /etc/sysconfig/elasticsearch            #ES环境变量的相关配置
    /usr/lib/sysctl.d/elasticsearch.conf    #ES环境变量的相关配置
    /usr/lib/systemd/system/elasticsearch.service   #systemcd启动文件
    

    2.自定义配置文件

    [root@db-01 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml 
    node.name: node-1      节点名称
    path.data: /var/lib/elasticsearch     默认数据路径
    path.logs: /var/log/elasticsearch     默认日志路径
    bootstrap.memory_lock: true     开启内存锁定,需要配合KVM配置
    network.host: 10.0.0.51,127.0.0.1   访问地址
    http.port: 9200   端口
    

    3.重启服务后发现报错
    systemc restart elasticsearch

    4.解决内存锁定失败:

    查看日志发现提示内存锁定失败
    tail -f /var/log/elasticsearch/elasticsearch.log 
    [2019-09-06T10:12:35,988][ERROR][o.e.b.Bootstrap          ] [node-1] node validation exception
    [1] bootstrap checks failed
    [1]: memory locking requested for elasticsearch process but memory is not locked
    
    解决方案:
    编写elasticsearch子程序配置
    systemctl edit elasticsearch
    添加
    [Service]
    LimitMEMLOCK=infinity
    重新读取服务文件和重启
    systemctl daemon-reload
    systemctl restart elasticsearch
    

    七.ES与MySQL的关系对比

    mysql和           ES对比
    库           索引   index
    表           类型   type
    列           字段   Field
    行           文档   Document
    

    八.ES交互方式

    三种交互方式

    curl命令:
        最繁琐
        最复杂
        最容易出错
        不需要安装任何软件,只需要有curl命令
    
    es-head插件:
        查看数据方便
        操作相对容易
        需要node环境
    
    kibana:
        查看数据以及报表格式丰富
        操作很简单
        需要java环境和安装配置kibana
    

    九. es-head插件安装

    9.1注意:需要修改配置文件添加允许跨域参数(安全方面)

    修改ES配置文件支持跨域
    http.cors.enabled: true 
    http.cors.allow-origin: "*"
    

    es-head 三种方式:

    1.npm安装方式
    - 需要nodejs环境
    - 需要连接国外源
    
    2.docker安装
    
    3.google浏览器插件
    - google商店下载插件
    - 修改文件名为zip后缀
    - 解压目录
    - 打开google浏览器
    - 拓展程序-开发者模式-打开已解压的目录
    - 连接地址修改为ES的IP地址
    

    9.4.具体的命令操作

    Head插件在5.0以后安装方式发生了改变,需要nodejs环境支持,或者直接使用别人封装好的docker镜像
    插件官方地址
    https://github.com/mobz/elasticsearch-head

    1).使用docker部署elasticsearch-head
    docker pull alivv/elasticsearch-head
    docker run --name es-head -p 9100:9100 -dit elivv/elasticsearch-head
    
    2).使用nodejs编译安装elasticsearch-head
    yum install nodejs npm openssl screen -y
    node -v
    npm  -v
    设置cnpm别名走指定的源
    npm install -g cnpm --registry=https://registry.npm.taobao.org
    cd /opt/
    git clone git://github.com/mobz/elasticsearch-head.git
    cd elasticsearch-head/
    cnpm install
    创建会话
    screen -S es-head
    运行插件
    cnpm run start
    将会话放入后台
    Ctrl+A+D
    
    也可以直接使用npm,放在前台运行。
    

    3).浏览器插件安装


    image.png
    image.png

    十. kibana与ES交互

    1.安装kibana
    rpm -ivh kibana-6.6.0-x86_64.rpm

    2.配置kibana

    [root@db-01 /data/soft]# grep "^[a-Z]" /etc/kibana/kibana.yml 
    - 端口
    server.port: 5601
    - ip地址
    server.host: "10.0.0.51"
    - ES地址
    elasticsearch.hosts: ["http://localhost:9200"]
    - kibana将数据存到es里索引名字以.kibana结尾
    kibana.index: ".kibana"
    
    3.启动kibana
    systemctl start kibana
    
    4.操作ES
    Dev Tools(kibana选项) 
    

    十一.操作语句

    1. 创建索引

    PUT index

    2. 插入数据

    直接插入数据会自动创建索引
    1.使用自定义的ID
    PUT haoge/info/1
    {
    "name": "haoge",
    "age": "18"
    }

    2.使用随机ID
    POST haoge/info/
    {
    "name": "haoge",
    "age": "30",
    "cha": "haoheng"
    }

    3 查询数据

    1.简单查询
    GET /haoge/_search
    GET /haoge/info/1

    2.单个条件查询
    GET /haoge/_search
    {
    "query" : {
    "term" : { "cha": "haoheng" }
    }
    }

    3.多个条件查询
    复杂 了解
    GET /haoge/_search
    {
    "query" : {
    "bool": {
    "must": [
    {"match": {"cha": "haoheng"}},
    {"match": {"name": "haoge"}}
    ],
    "filter": {
    "range": {
    "age": {
    "gte": 27,
    "lte": 30
    }
    }
    }
    }
    }
    }
    }

    4.查询方式

    • curl命令
    • es-head 基础查询 多个条件
    • es-head 左侧字段查询
    • kibana dev-tools 命令查询
    • kibana management index patterns索引查询

    4 更新数据

    GET haoge/info/1

    每个字段都要写
    PUT haoge/info/1
    {
    "name": "zhang",
    "age": "30"
    }

    5 删除数据

    1.删除指定ID的数据
    DELETE haoge/info/1

    2.删除符合条件的数据
    POST haoge/_delete_by_query
    {
    "query" : {
    "match":{
    "age":"29"
    }
    }
    }

    3.删除索引
    DELETE haoge

    4.!!!警告!!!
    尽量不要在命令行或者Kibana里删除,因为没有任何警告
    建议使用es-head删除(点击动作 删除)
    生产环境可以先把索引关闭掉,如果一段时间没人访问了再删除(动作 关闭)

    十二.ES集群

    12.1 es-head界面解释

    image.png

    集群相关名词
    1.集群健康状态
    绿色: 所有数据都完整,并且副本数满足
    黄色: 所有数据都完整,但是有的索引副本数不满足
    红色: 有的数据不完整

    2.节点类型
    主节点: 负责调度数据分配到哪个节点
    数据节点: 负责处理落到自己身上的数据
    默认: 主节点同时也是数据节点

    3.数据分片
    主分片: 实际存储的数据,负责读写,粗框的是主分片
    副本分片: 主分片的副本,提供读,同步主分片,细框的是副本分片

    4.副本:
    主分片的备份,副本数量可以自定义

    12.2 部署ES集群

    1.安装java
    rpm -ivh jdk-8u102-linux-x64.rpm

    2.安装ES
    rpm -ivh elasticsearch-6.6.0.rpm

    3.配置ES配置文件
    配置内存锁定:
    systemctl edit elasticsearch.service
    [Service]
    LimitMEMLOCK=infinity

    集群配置文件:
    b01配置文件:
    [root@db-01 ~]# cat /etc/elasticsearch/elasticsearch.yml
    集群名字
    cluster.name: linux4NB
    节点名字
    node.name: node-1
    数据路径
    path.data: /var/lib/elasticsearch
    日志
    path.logs: /var/log/elasticsearch
    开启内存锁定
    bootstrap.memory_lock: true
    ip地址
    network.host: 10.0.1.51,127.0.0.1
    端口
    http.port: 9200
    集群内节点地址
    discovery.zen.ping.unicast.hosts: ["10.0.1.51","10.0.2.52"]
    主节点选举的最小数目计算方法{N(节点个数)/2+1},防止裂脑(下面解释)
    discovery.zen.minimum_master_nodes: 1
    跨域
    http.cors.enabled: true
    http.cors.allow-origin: ""
    ===============================================================
    discovery.zen.minimum_master_nodes:
    设置了最少有多少个备选主节点才能参加选举
    比如5个节点那设置为3,如果有节点断开连接剩余节点小于3则不能参加选主,大于等于3则可以;按规定的计算方法算出的结果肯定是集群大部分的节点数量,所以不会出现有两两选主的情况,这样可以防止脑裂;但是节点尽量不要2台,因为2台设置是2 如果断开一台down了,剩下的一台肯定无法选主了,咱们是学习环境可以设置2台
    ==================================================================
    db02配置文件:
    [root@db-02 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
    cluster.name: linux4NB
    node.name: node-2
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    bootstrap.memory_lock: true
    network.host: 10.0.2.52,127.0.0.1
    http.port: 9200
    discovery.zen.ping.unicast.hosts: ["10.0.1.51","10.0.2.52"]
    discovery.zen.minimum_master_nodes: 1
    http.cors.enabled: true
    http.cors.allow-origin: "
    "

    4.启动
    systemctl daemon-reload
    systemctl restart elasticsearch

    5.查看日志
    tail -f /var/log/elasticsearch/linux.log

    十三.ES集群相关注意

    注意事项:

    1.插入和读取数据在任意节点都可以执行,效果一样
    2.es-head可以连接集群内任一台服务
    3.主分片负责读写
    主分片负责读写,副本分片负责读;写入主分片数据同时同步到副本分片
    如果主分片所在的节点坏掉了,副本分片会升为主分片
    4.主节点负责调度
    如果主节点坏掉了,数据节点会自动升为主节点

    13.1.查看集群各种信息

    GET _cat/nodes
    GET _cat/health
    GET _cat/master
    GET _cat/fielddata
    GET _cat/indices
    GET _cat/shards
    GET _cat/shards/haoge

    十四. 集群注意事项

    注意1:发现节点参数不需要把集群内所有的机器IP都加上
    只需要包含集群内任意一个IP和自己的IP就可以
    discovery.zen.ping.unicast.hosts: ["10.0.0.51","10.0.0.53"]

    注意2: 集群选举相关的参数需要设置为集群节点数的大多数
    discovery.zen.minimum_master_nodes: 2

    注意3: 默认创建索引为1副本5分片

    注意4: 数据分配的时候会出现2中颜色
    紫色: 正在迁移
    黄色: 正在复制
    绿色: 正常

    注意5: 3节点的时候
    0副本一台都不能坏
    1副本的极限情况下可以坏2台: 1台1台的坏,不能同时坏2台(需要数据分配的时间)
    2副本的情况可以同时坏2台

    十五.自定义副本分片和索引

    15.1注意:

    索引一旦建立完成,分片数就不可以修改了
    但是副本数可以随时修改
    副本的多少跟分片的多少没有最佳,跟内存和CPU资源及数据量和访问量有关。

    15.2命令

    1.创建索引的时候就自定义副本和分片
    PUT /yaya/
    {
      "settings": {
        "number_of_shards": 3, 
        "number_of_replicas": 0
      }
    }
    
    2.修改单个索引的副本数
    PUT /oldzhang/_settings/
    {
      "settings": {
        "number_of_replicas": 0
      }
    }
    
    3.修改所有的索引的副本数
    PUT /_all/_settings/
    {
      "settings": {
        "number_of_replicas": 0
      }
    }
    

    工作如何设置:
    2个节点: 默认就可以
    3个节点: 重要的数据,2副本 不重要的默认
    日志收集: 1副本3分片

    十六.监控

    监控注意,不能只监控集群状态
    1.监控节点数
    2.监控集群状态
    3.2者任意一个发生改变了都报警

    监控命令:
    GET _cat/nodes
    GET _cat/health

    16.1 增强插件x-pack监控功能

    介绍

    x-pack为elasticsearch,logstash,kibana提供了监控,报警,用户认证等功能,属于一个集成的插件。
    6.x以前是以插件形式存在
    6.x以后默认安装的时候就集成在软件包里了
    

    monitoring-->点一下蓝色图标


    image.png image.png image.png image.png

    十七.ES优化

    1.内存
    ES设置的内存不要超过32G
    即便你有足够的内存,也尽量不要超过32G,因为它浪费了内存,降低了CPU的性能,还要让GC应对大内存。

    例:48内存

    系统留一半: 24G
    自己留一半: 24G
    8G 12G 16G 24G 30G
    ES分百分之五十,不要一下给到位逐步增加,不要超过32G。

    2.磁盘
    可以选用固态硬盘组建raid0,虽然安全性降低;但是我们的集群有副本集可以弥补这一点,一主两副可以同时坏掉两个节点数据也没问题。

    十八.备份恢复

    备份方式

    1.快照备份(过于复杂)
    2.elasticsearch-dump(主讲)
    

    前提条件:

    必须要有Node环境和npm软件
    nodejs
    npm    
    

    1.nodejs环境安装

    https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz
    tar xf  node-v10.16.3-linux-x64.tar.xz -C /opt/node
    vim /etc/profile
    export PATH=/opt/node/bin:$PATH
    source /etc/profile
    [root@db-01 ~]# node -v
    v10.16.3
    [root@db-01 ~]# npm -v
    6.9.0
    

    2.指定使用国内淘宝npm源

    npm install -g cnpm --registry=https://registry.npm.taobao.org
    用cnpm命令就会走指定的淘宝源
    

    3.安装es-dump

    cnpm install elasticdump -g
    

    4.备份命令

    elasticdump \
      --input=http://10.0.0.51:9200/haoge \
      --output=/data/haoge.json \
      --type=data
     
    压缩
    elasticdump \
      --input=http://10.0.1.51:9200/haoge \
      --output=$|gzip > /data/haoge.json.gz  
    

    5.恢复命令

    elasticdump \
    --input=/data/haoge.json \
    --output=http://10.0.1.51:9200/haoge
    

    6.注意

    恢复的时候需要先解压缩成json格式 
    恢复的时候,如果已经存在相同的数据,会被覆盖掉
    如果新增加的数据备份中没有,则不影响不覆盖,继续保留
    

    十九.集群发现相关参数

    异地机房,带宽较远可以设置此参数

    discovery.zen.fd.ping_timeout: 120s  
    discovery.zen.fd.ping_retries: 6  
    discovery.zen.fd.ping_interval: 30s  
    
    超时时间为120s
    重试次数为6次
    每次间隔30秒
    

    二十.中文分词

    未分词的情况:

    1.插入测试数据
    curl -XPOST http://localhost:9200/index/_create/1 -H 'Content-Type:application/json' -d'
    {"content":"美国留给伊拉克的是个烂摊子吗"}
    '
    curl -XPOST http://localhost:9200/index/_create/2 -H 'Content-Type:application/json' -d'
    {"content":"公安部:各地校车将享最高路权"}
    '
    curl -XPOST http://localhost:9200/index/_create/3 -H 'Content-Type:application/json' -d'
    {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
    '
    curl -XPOST http://localhost:9200/index/_create/4 -H 'Content-Type:application/json' -d'
    {"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
    '
    
    2.检测
    curl -XPOST http://localhost:9200/index/_search  -H 'Content-Type:application/json' -d'
    {
        "query" : { "match" : { "content" : "中国" }},
        "highlight" : {
            "pre_tags" : ["<tag1>", "<tag2>"],
            "post_tags" : ["</tag1>", "</tag2>"],
            "fields" : {
                "content" : {}
            }
        }
    }
    '
    将中国一词分开查询了“中”“国”含有一个的就会显示出来
    

    分词配置

    1.配置中文分词器
    cd /usr/share/elasticsearch
    ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.0/elasticsearch-analysis-ik-6.6.0.zip
    
    如果ik软件包在本地
    ./bin/elasticsearch-plugin install file:///data/elasticsearch-analysis-ik-6.6.0.zip
    
    2.安装完成重启es
    systemctl restart elasticsearch
    
    3.创建索引 
    curl -XPUT http://localhost:9200/news
    
    4.创建模板
    curl -XPOST http://localhost:9200/news/text/_mapping -H 'Content-Type:application/json' -d'
    {
            "properties": {
                "content": {
                    "type": "text",
                    "analyzer": "ik_max_word",
                    "search_analyzer": "ik_smart"
                }
            }
    
    }'
    
    5.插入测试数据
    POST /news/text/1
    {"content":"美国留给伊拉克的是个烂摊子吗"}
    
    POST /news/text/2
    {"content":"公安部:各地校车将享最高路权"}
    
    POST /news/text/3
    {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
    
    POST /news/text/4
    {"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
    
    6.再次查询数据发现已经能识别中文了
    POST /news/_search
    {
        "query" : { "match" : { "content" : "中国" }},
        "highlight" : {
            "pre_tags" : ["<tag1>", "<tag2>"],
            "post_tags" : ["</tag1>", "</tag2>"],
            "fields" : {
                "content" : {}
            }
        }
    }
    

    如果查询的中文不是词语,比如人名:刘华强、冯彪,可以自定在mian.doc文件中加上要查询的词语。但是需要重新更新一下数据才会生效。

    相关文章

      网友评论

          本文标题:Elasticsearch

          本文链接:https://www.haomeiwen.com/subject/mspwchtx.html