简介
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节点:普通服务器即可(如果要进行分组聚合操作的话,建议这个节点内存也分配多一点)。