ES-elasticsearch

Scroll Down

简介

elasticsearch是一个分布式的实时搜索和分析引擎,一个建立在全文搜索引擎Apache Lucene基础上的搜索引擎,它不仅可以进行全文搜索,还可以进行以下工作:
分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索
实时分析的分布式搜索引擎
可以扩展到上百台服务器,可以PB级别的结构化或非结构化数据
提供了REST API的操作接口,开箱即用

存储单位:1KB=1024B 1MB=1024KB 1GB=1024MB 1TB=1024GB 1PB=1024TB 1EB=1024PB 1ZB=1024EB 1YB=1024ZB

概念:

面向文档型的数据库,一条数据在这里就是一个文档
1.索引(分类)
索引是具有相似特性的文档集合,例如,可以为客户数据提供索引,为产品目录建立另一个索引,以及为订单数据建立另一个索引。索引由名称(必须为小写)标识,该名称用于在对其中的文档执行索引、搜索、更新和删除操作时引用索引你。在单个集群中,您可以定义尽可能多的索引
2.文档(每个文档都有一个类型和对应的ID)
Elasticsearch文档是一个 存储在索引中的SON文档。每个文档都有一个类型和对应的ID,这是唯一的
3.字段
文档内的一个基本单位,键值对形式(book_name:”learning elk”)
4.类型(是索引下的一个个逻辑分类)
类型是index下的一个逻辑分类。比如weather这个index里,可以按照城市分组,也可以按照气候类型分组,这种分组就叫类型
5.映射(每个字段对应的数据类型)
映射用于映射文档的每个field及其对应的数据类型,例如字符串、整数、浮点数、双精度数、日期等等
6.分片
单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能
在这里插入图片描述
7.分词
把一段文本中的词按照一定规则进行切分
8.主分片
主分片(primary shard)与复制分片(replica shard)复制分片通常驻留在一个不同的节点上,而不是主碎片,在故障转移和负载平衡的情况下,可以满足多个请求
9.集群
集群是存储索引数据的节点集合,elasticsearch提供了水平的可伸缩性,用以存储集群中的数据,每个集群都由一个集群名称来表示,不同的节点指明集群名称连接在一起
10节点
节点是一个单独运行的elasticsearch实例,它属于一个集群。默认情况下,elasticsearch中的每个节点都加入名为”elasticsearch”的集群,每个节点都可以在elasticsearch中使用自己的elasticsearch.yml,它们可以对内存和资源分配有不同的设置

primary shard主分片 shard
replica shard复制分片

ES集群节点分类

1、数据节点(Data Node)数据节点索引文档并对索引文档执行搜索。建议添加更多的数据节点,以提高性能或扩展集群。通过在elasticsearch中设置这些属性,可以是节点成为一个数据节点。elasticsearch.yul配置node.master=false node.data=true
2、管理节点(一般节点不存储数据,只管理)
主节点负责集群管理,对于大型集群,建议有三个专用的主节点,(一个主节点和两个备份节点),它们只作为主节点,不存储索引或执行搜索。在elasticsearch配置声明节点为主节点:node.master=true node.data=false
3、路由节点亦称负载均节点(只执行负载均衡或为搜索请求路由)

容错

容错步骤1、从新选举master,es自动选举另一个node成为master,承担起master的责任
容错步骤2、新的master将丢失的主分片

实验步骤

mkdir -p /es/{data,log}     #创建es的数据和日志文件

创建组

groupadd es 

创建用户

useradd es -g es

给文件夹给予权限

chown -R es:es /es

解压软件包

tar -zxf elasticsearch-6.3.2.tar.gz 
mv elasticsearch-6.3.2 /usr/local/es
chown -R es:es /usr/local/es

更改hosts文件

vim /etc/hosts
192.168.43.3 es1
192.168.43.57 es2
192.168.43.254 es3
添加配置

soft软限制,hard硬限制

echo '* soft nofile 819200' >> /etc/security/limits.conf    #文件描述服务(系统能同时打开多少文件)
echo '* hard nofile 819200' >> /etc/security/limits.conf     
echo '* soft nproc 2048' >> /etc/security/limits.conf   #用户可用的进程数量
echo '* hard nproc 4096' >> /etc/security/limits.conf #当你切换用户的时候,这个配置文件会自动加载(绑定用户的)
echo 'vm.max_map_count=655360' >> /etc/sysctl.conf     #JVM能开启最大的线程数

更新一下

sysctl -p
vim   /usr/local/es/config/elasticsearch.yml

==17行 取消注释 集群的名字 kgc==
==23行 取消注释 修改主机名,当前节点的名字es1==
==node.master:true //是否有资格参加主(master)节点选举==
==node.data:true==
==35行 取消注释 修改成/es/data==
==39行 取消注释 修改成/es/log==
==57行 改成本机ip==
==61行 取消注释就可以 //默认监听端口==
==62行 transport.tcp.port: 9300 //主机节点互相通讯的端口 不变颜色别忘记加空格==
==71行 取消注释 把host换成你三台主机的ip地址加上通讯的端口==
==75行 取消注释 修改成2 //选举的条件,当有达到有两人都符合选举master==
==discovery.zen.ping_timeout: 120s //将ping时间修改为120秒,防止脑裂==
==client.transport.ping_timeout: 60s //客户端与es服务进行通讯的超时时间60秒==
==85行 取消注释 //如果节点有三个就开始复制==
==gateway.recover_after_time: 5m //在集群形成5分钟之后开启数据复制==
==gateway.recover_after_data_nodes: 2 //如果有两个数据节点也开始复制,其他情况不愿==

假如你报错了,找不到问题你可以先试着看一下
第一种:先查看一下两个目录的属组是不是es,/es /usr/local/es
第二种:rm -rf /es/data/* /es/log/*

继续实验

(以上三台都操作)其他两台23行和57行就可以了

tedian:必须用普通用户启动
su es

/usr/local/es/bin/elasticsearch  #切换用户执行  三台都启动
curl -XGET http://192.168.43.57:9200/_cat/master  #查看集群的老大(管理节点)
curl -XGET 'http://192.168.43.3:9200/_cluster/health?pretty'  #查看集群的状态,是不是greed
分词器
mkdir /usr/local/es/plugins/ik
unzip elasticsearch-analysis-ik-6.3.2.zip -d /usr/local/es/plugins/ik/ &> /dev/null 
chown -R es:es /usr/local/es/   #这个命令必须打不然ik的属组和属主是root 

重新启动es集群

curl -XPUT http://192.168.43.254:9200/kgc   #创建索引

在这个索引下添加一个映射(必须要等集群形成):

curl -XPOST http://192.168.43.254:9200/kgc/fulltext/_mapping -H 'Content-Type: application/json' -d'
{
    "properties": {
        "content": {
             "type": "text",
             "analyzer": "ik_max_word",
             "search_analyzer": "ik_max_word"
             }
       }
 }'
{"acknowledged":true}  //成功就是这样的

添加记录:

curl  -XPOST  "http://192.168.43.254:9200/kgc/fulltext/1"  -H 'Content-Type: application/json' -d '{"conten":"卡路里呀,卡路里"}'
curl  -XPOST  "http://192.168.43.254:9200/kgc/fulltext/_search" -H 'Content-Type:  application/json' -d 
'{
	"query" : {"match": {"content": "卡里里"}},
	"highlight" : {
		"pre_tags" : ["<tag1>","<tag2>"],
		"post_tags"  : ["</tag1>","</tag2>"],
		"fields": {
			"content" : {}
		}
	}
}'

2、head插件----->图形界面的集群操作和管理工具
node.js
解压软件

tar -zxf node-v10.6.0-linux-x64.tar.gz 
mv node-v10.6.0-linux-x64 /usr/local/node

添加配置文件

vim /etc/profile
export NODE_HOME=/usr/local/node
export PATH=$NODE_HOME/bin:$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile
[root@localhost ~]# node -v
v10.6.0
[root@localhost ~]# npm -v
6.1.0
unzip elasticsearch-head-master.zip
mv elasticsearch-head-master /usr/local/es-head
cd /usr/local/es-head/
npm install -g grunt --registry=https://registry.npm.taobao.org   #安装grunt
npm install -g cnpm --registry=https://registry.npm.taobao.org  #对es-head代码进行编译,先安装cnpm
cpnm install
vim Gruntfile.js

添加大概在92行:
'0.0.0.0',
在这里插入图片描述

vim /usr/local/es/config/elasticsearch.yml

在最后面添加: 开启es的跨域访问

http.cors.enabled: true
http.cors.allow-origin: "*"

==当一个资源从与该服务器本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个http跨域请求==

ES常用命令

1、查看所有可查看项

curl  http://192.168.43.3:9200/_cat
=^.^=
/_cat/allocation
/_cat/shards
/_cat/shards/{index}
/_cat/master
/_cat/nodes
/_cat/tasks
/_cat/indices
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool
/_cat/thread_pool/{thread_pools}
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{fields}
/_cat/nodeattrs
/_cat/repositories
/_cat/snapshots/{repository}
/_cat/templates

2、显示详细信息:?v

curl  http://192.168.43.3:9200/_cat/master?v

3、输出可显示的列:?help

[root@es1 ~]# curl  http://192.168.43.3:9200/_cat/master?help
id   |   | node id    
host | h | host name  
ip   |   | ip address 
node | n | node name  

4、指定输出的列:?h
curl http://192.168.43.3:9200/_cat/master?h=ip,node
5、查看所有索引有哪一些:

curl  http://192.168.43.3:9200/_cat/indinces?v

6、创建索引

curl -XPUT  http://192.168.43.3:9200/kgc/test?pretty

7、关闭索引(但是索引还存在)

curl -XPOST  http://192.168.43.3:9200/kgctest/_close?pretty

8、开启索引

curl -XPOST  http://192.168.43.3:9200/kgctest/_open?pretty

9、删除索引

curl -XDELETE  http://192.168.43.3:9200/kgctest?pretty

10、插入数据

curl -XPUT  http://192.168.43.3:9200/kgctest/fulltext/1?pretty -H 'Content-Type: application/json' -d 
'{
	"name":  "tiechui"
}'
{
	"_index" : "kgctest",
	""
}

11、取出fulltext类型的id为1的

curl -XPUT  'http://192.168.43.3:9200/kgctest/fulltext/1?pretty'

12、更新文档(更新数据)

curl -XSTOP  'http://192.168.43.3:9200/kgctest/fulltext/1/_update?pretty' -H 'Content-Type:application/json' -d '{

}'

13、删除文档

curl -XDELETE  'http://192.168.43.3:9200/kgctest/fulltext/1?pretty'

14、查询所有记录

curl -XSTOP  'http://192.168.43.3:9200/kgctest/fulltext/_search?pretty' -H 'Content-Type:application/json' -d '{
	"query" : {"match_all":{}}
}'
{
	
}

15、flush和refresh(强制刷新数据到磁盘)
区别:

refresh 只是单纯的刷新到磁盘里
flush不仅单纯的刷新到磁盘里,而且(translog)数据的日志也给删除了
四种组合配置方式

(1)node.master: true node.data: true
这种组合表示这个节点即有成为主节点的资格,又存储数据。
如果某个节点被选举成为了真正的主节点,那么他还要存储数据,这样对于这个节点的压力就比较大了。ElasticSearch默认每个节点都是这样的配置,在测试环境下这样做没问题。实际工作中建议不要这样设置,因为这样相当于主节点和数据节点的角色混合到一块了。
(2)node.master: false node.data: true
这种组合表示这个节点没有成为主节点的资格,也就不参与选举,只会存储数据。
这个节点我们称为data(数据)节点。在集群中需要单独设置几个这样的节点负责存储数据,后期提供存储和查询服务。
(3)node.master: true node.data: false
这种组合表示这个节点不会存储数据,有成为主节点的资格,可以参与选举,有可能成为真正的主节点,这个节点我们称为master节点。
(4)node.master: false node.data: false
这种组合表示这个节点即不会成为主节点,也不会存储数据,这个节点的意义是作为一个client(客户端)节点,主要是针对海量请求的时候可以进行负载均衡。
四、其他小知识点
1、默认情况下,每个节点都有成为主节点的资格,也会存储数据,还会处理客户端的请求。
2、在一个生产集群中我们可以对这些节点的职责进行划分。建议集群中设置3台以上的节点作为master节点【node.master: true node.data: false】,这些节点只负责成为主节点,维护整个集群的状态。
3、再根据数据量设置一批data节点【node.master: false node.data: true】,这些节点只负责存储数据,后期提供建立索引和查询索引的服务,这样的话如果用户请求比较频繁,这些节点的压力也会比较大。
4、在集群中建议再设置一批client节点【node.master: false node.data: true】,这些节点只负责处理用户请求,实现请求转发,负载均衡等功能。
5、master节点:普通服务器即可(CPU 内存 消耗一般)。
data节点:主要消耗磁盘,内存。
client节点:普通服务器即可(如果要进行分组聚合操作的话,建议这个节点内存也分配多一点)。