Elasticsearch

1. 介绍

  • 什么是全文检索和Lucene?

    基于java环境,基于Lucene之上包装一层外壳
    Lucene是一个java的搜索引擎库,操作非常繁琐
    
  • 应用场景

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

2. 安装部署

1.下载软件
mkdir /data/soft
上传
elasticsearch-6.6.0.rpm
jdk-8u102-linux-x64.rpm
2.安装jdk
rpm -ivh jdk-8u102-linux-x64.rpm 
java -version
3.安装ES
rpm -ivh elasticsearch-6.6.0.rpm
4.启动
systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service
5. 检查
netstat -lntup|grep 9200
curl 127.0.0.1:9200

3. 配置以及内存锁定

1.查看ES有哪些配置 
[root@db01 ~]# rpm -qc elasticsearch 	
/etc/elasticsearch/elasticsearch.yml		#主配置文件
/etc/elasticsearch/jvm.options				#JVM虚拟机配置 
/etc/init.d/elasticsearch					#init启动文件
/etc/sysconfig/elasticsearch				#环境变量相关配置
/usr/lib/sysctl.d/elasticsearch.conf		#环境变量相关配置
/usr/lib/systemd/system/elasticsearch.service	#systemc启动文件
2.自定义配置文件
[root@db01 ~]# 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
network.host: 10.0.0.51,127.0.0.1
http.port: 9200
3.重启服务后发现报错
systemctl restart elasticsearch 
4.解决内存锁定失败:
查看日志发现提示内存锁定失败
tail -f /var/log/elasticsearch/elasticsearch.log 
[2019-12-04T10:27:42,136][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
解决方案:
systemctl edit elasticsearch  
[Service]
LimitMEMLOCK=infinity
检查
systemctl daemon-reload
systemctl restart elasticsearch

官方解决方案
https://www.elastic.co/guide/en/elasticsearch/reference/6.6/_memory_lock_check.html
https://www.elastic.co/guide/en/elasticsearch/reference/6.6/setting-system-settings.html#systemd

4. 交互方式

  • 三种交互方式

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

    es-head 三种方式:
    1.npm安装方式
    - 需要nodejs环境
    - 需要连接国外源
    2.docker安装
    3.google浏览器插件     --> 推荐使用简单方便
    - 修改文件名为zip后缀
    - 解压目录
    - 拓展程序-开发者模式-打开已解压的目录
    - 连接地址修改为ES的IP地址
    
    方式一:
    Head插件在5.0以后安装方式发生了改变,需要nodejs环境支持,或者直接使用别人封装好的docker镜像
    插件官方地址  https://github.com/mobz/elasticsearch-head
    使用docker部署elasticsearch-head
    docker pull alivv/elasticsearch-head
    docker run --name es-head -p 9100:9100 -dit elivv/elasticsearch-head
    方式二:
    使用nodejs编译安装elasticsearch-head
    cd /opt/ 
    wget https://nodejs.org/dist/v12.13.0/node-v12.13.0-linux-x64.tar.xz
    tar xf node-v12.13.0-linux-x64.tar.xz
    ln -s node-v12.13.0-linux-x64 node
    echo "export PATH=/opt/node/bin:\$PATH" >> /etc/profile
    source /etc/profile
    npm -v
    node -v 
    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
    cnpm run start
    修改ES配置文件支持跨域
    http.cors.enabled: true 
    http.cors.allow-origin: "*"
    方式三:
    1.安装kibana
    rpm -ivh kibana-6.6.0-x86_64.rpm
    2.配置kibana
    [root@db01 ~]# egrep "^[a-Z]" /etc/kibana/kibana.yml 
    server.port: 5601
    server.host: "10.0.0.51"
    elasticsearch.hosts: ["http://localhost:9200"]
    kibana.index: ".kibana"
    3.启动kibana
    systemctl start kibana
    4.操作ES
    Dev Tools 
    
    关键词:
    1.Lucene
    2.java
    3.全文检索
    4.倒排索引
    

5. 简单增删改查

##创建索引
PUT index
##插入数据
1.使用自定义的ID 
PUT oldzhang/info/1
{
 "name": "zhang",
 "age": "29"
}
2.使用随机ID
POST oldzhang/info/
{
  "name": "zhang",
  "age": "29",
  "pet": "xiaoqi"
}
##查询数据
1.简单查询
GET /oldzhang/_search
GET /oldzhang/_search/1
2.单个条件查询
GET /oldzhang/_search
{
	 "query" : {
   	 "term" : { "job" : "it" }
  }
}
3.多个条件查询
GET /oldzhang/_search
{
  "query" : {
 	   "bool": {
   	   "must": [
     	   {"match": {"pet": "xiao10"}},
      {"match": {"name": "ya"}}
  ],
  "filter": {
    "range": {
      "age": {
        "gte": 27,
        "lte": 30
      }
    }
    }
  }
}
}
}
4.查询方式
- curl命令
- es-head 基础查询多个条件
- es-head 左侧字段查询
- kibana dev-tools 命令查询
- kibana 索引查询
##更新数据
GET oldzhang/info/1
PUT oldzhang/info/1
{
  "name": "zhang",
  "age": "30",
  "job": "it"
}
 POST oldzhang/info/1
 {
  "name": "zhang",
  "age": "30",
  "job": "it"
}
##删除数据
1.删除指定ID的数据
DELETE oldzhang/info/1
2.删除符合条件的数据
POST oldzhang/_delete_by_query
{
  "query" : {
  "match":{
  "age":"29"
  }
  }
}
3.删除索引
DELETE oldzhang
4.!!!警告!!!
尽量不要在命令行或者Kibana里删除,因为没有任何警告
建议使用es-head删除
生产环境可以先把索引关闭掉,如果一段时间没人访问了再删除

6. 集群相关名词

1.集群健康状态
绿色: 所有数据都完整,并且副本数满足
黄色: 所有数据都完整,但是有的索引副本数不满足
红色: 有的索引数据不完整
默认创建索引:
5分片
1副本

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

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

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

5.修改分片和副本的限定条件
- 索引创建的时候可以指定分片数和副本数
- 索引一旦创建成功,分片数就不能修改了,但是可以调整副本数

7. 集群部署

0.从db01拉取数据
mkdir /data/soft
cd /data/soft
rsync -avz 10.0.0.51:/data/soft/* .
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
systemctl daemon-reload 
集群配置文件:
b01配置文件:
cat >/etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: linuxNB
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.51,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
discovery.zen.minimum_master_nodes: 1
EOF
==================================================================
db02配置文件:
cat >/etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: linuxNB
node.name: node-2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.52,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
discovery.zen.minimum_master_nodes: 1
EOF
4.2台机器都重新启动es
systemctl restart elasticsearch.service
5.查看日志
tail -f /var/log/elasticsearch/linuxNB.log

8. 集群相关问题

  • 节点说明:

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

    GET _cat/nodes        当前集群的拓扑结构
    GET _cat/health       集群健康状态
    GET _cat/master       主节点信息
    GET _cat/fielddata    集群中每个节点中fileddata所使用的堆内存  
    GET _cat/indices      索引信息
    GET _cat/shards       分片信息
    GET _cat/shards/oldzhang    指定查看索引分片信息
    
  • 集群注意事项:

    注意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台 
    
  • 自定义副本分片和索引

    索引为2副本3分片
    索引为0副本5分片
    注意:
    索引一旦建立完成,分片数就不可以修改了
    但是副本数可以随时修改
    命令:
    1.创建索引的时候就自定义副本和分片
    PUT /yaya/
    {
     "settings": {
     "number_of_shards": 3, 
     "number_of_replicas": 0
     }
    }
    2.修改单个索引的副本数
    PUT /yaya/_settings/
    {
      "settings": {
      "number_of_replicas": 0
     }
    }
    3.修改所有的索引的副本数
    PUT /_all/_settings/
    {
     "settings": {
     "number_of_replicas": 0
     }
    }
    工作如何设置:
    2个节点: 默认就可以 
    3个节点: 重要的数据,2副本 不重要的默认 
    日志收集: 1副本3分片 
    
  • 监控:

    监控注意,不能只监控集群状态
    1.监控节点数
    2.监控集群状态
    3.2者任意一个发生改变了都报警
    监控命令: 
    curl -s 10.0.0.52:9200/_cat/nodes
    curl -s 10.0.0.52:9200/_cat/health
    
  • 增强插件x-pack监控功能

    monitoring-->点一下蓝色图标 
    
  • 优化:

    1.内存 
    不要超过32G
    
    加SSD固态硬盘
    

9. 备份恢复

前提条件: 必须要有Node环境和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
node -v
npm -v
2.指定使用国内淘宝npm源
npm install -g cnpm --registry=https://registry.npm.taobao.org
3.安装es-dump
cnpm install elasticdump -g
4.备份命令
elasticdump \
 --input=http://10.0.0.51:9200/oldzhang \
 --output=/data/oldzhang.json \
 --type=data
压缩备份
elasticdump \
 --input=http://10.0.0.51:9200/oldzhang \
 --output=$|gzip > /data/oldzhang.json.gz  
5.恢复命令 
elasticdump \
 --input=/data/oldzhang.json \
 --output=http://10.0.0.51:9200/oldzhang
6.注意
恢复的时候需要先解压缩成json格式 
恢复的时候,如果已经存在相同的数据,会被覆盖掉
如果新增加的数据,则不影响,继续保留

10. 中文分词

分词配置
注意!如果是ES集群,所有的节点都要安装,所有的节点安装完毕之后都要重启

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
2.重启所有ES节点
systemctl restart elasticsearch
3.创建索引 
PUT /news
4.创建模板
POST /news/text/_mapping
{
    	"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" : {}
  	  }
  }
}


####热更新词典
所有ES节点都操作
https://github.com/medcl/elasticsearch-analysis-ik
1.安装nginx
2.配置分词器配置文件,增加远程地址
3.重启所有的ES节点
4.重新更新数据让分词生效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值