- 2.1 版本选择
- 2.2 ES的前言
- 2.3 为什么ES中可以分词查询(正排索引、倒排索引概念)
- 2.4 ES核心概念
- 2.5 正式搭建Elasticsearch6.6.2
- 2.6 启动Elasticsearch及配置文件修改
- 2.7 如何在一台机器上搭建多个节点(仅仅做测试用)
- 2.8 启动Elasticsearch出现的问题
第一章:初识Elastic
官网:https://www.elastic.co/cn/
它是有中文版本的,网站后的cn是根据本地的local来进行寻址的。
我们先来看一下版本:我们使用的版本是6.6.6版本。
Elasticsearch:对您的数据进行搜索、分析、存储。
Kibana:实现数据可视化。
Logstash:作日志收集用的。
elastic stack(栈):
-
很多中小型公司的数据分析选型:Elasticsearch + Kibana,分为单机版和集群版,安装较为简单。
-
常见的ELK软件:Elasticsearch + Logstash(收集) + Kibana
简介:
- Elasticsearch是基于JSON的分布式搜索和分析引擎,专门为实现水平可扩展性、高可靠性和管理便捷性而设计的。
Beats和Logstash能够采集任何来源、任何格式的数据:
1、Beats简介:
-
Beats:是一个面向轻量型采集器的平台(集合了多种单一用途数据采集器),这些采集器可以从边缘机器向Logstash和Elasticsearch发送数据。
-
Beats是数据采集的得力工具;将Beats和您的容器一起置于服务器上,或者将Beats作为功能加以部署,然后便可在Elasticsearch中集中处理数据。如果需要更加强大的处理性能,Beats还能将数据输送到Logstash
进行转换和解析。
2、Logstash简介:
- Logstash:Logstash是动态数据收集管道,拥有可扩展的插件生态系统,能够与Elasticsearch产生强大的协同作用。
Beats系列有哪些?
1、File beat 日志文件收集器
2、Metricbeat 指标
3、Packetbeat 网络数据
4、Winlogbeat Windows事件日志
5、Auditbeat 审计数据
6、Heartbeat 运行事件监控
7、Functionbeat 无需服务器的采集器
借助强大功能,实现更多成果:
-
从Security(安全)到Alerting(报警)、Monitoring(监控)、Reporting(报告)、Graph(图)关联分析和Machine Learning(机器学习),轻松获取这些功能,并将您的Elastic stack带入到一个新的高度。
-
学过线下班,可以使用Elasticsearch做一个监控系统。
-
无论是就地部署,还是部署在云端,由您来决定。从公有云、到私有云,我们都能够让您轻松地运行和管理Elastic Stack.
第二章:使用Elastic
2.1 版本选择
-
Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例;Elasticsearch作为Elastic Stack的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
-
官网种此时已经更新到了7.3.2版本,注意,它是可以跑在windows上的,它的各个版本之间的兼容性是非常差的。
网址:
- https://www.elastic.co/cn/downloads/past-releases#elasticsearch
我们此次课程使用的是6.6.2版本的;如果使用的ELK,那么整个生态栈的版本都要使用相同的版本。
2.2 ES的前言
-
ES:主要是用来做搜索
-
MIS:做搜索,底层就是一个select语句(select * from XXX where …),通过一些前端技术将其展示出来的。
为什么我们不采用MIS的搜索方式呢?
1、第一点是因为MIS方式是点对点的查询
- select * from user where name=’%杜兰特%’
2、如下这种情况我们使用的是分词
- 情况举例:网络上的喷子给杜兰特的取名如下:书包杜、阿杜、洗澡水,我们使用关键字"洗澡水"测试能否搜索到,结果是可以的,并且网页中的关键字都会标红。
我们在百度下查询,搜索是高亮选项:这个高亮选项在ES中是自带的。
2.3 为什么ES中可以分词查询(正排索引、倒排索引概念)
为什么ES中可以分词查询呢?
- ES中引入了正派索引和倒排索引两种概念:
正排索引的规则:doc_id到doc_content的关系
doc_id | doc_content |
---|---|
1 | 若泽数据从事大数据培训 |
2 | Spark是一种分布式计算引擎 |
3 | 大数据培训有很多 |
倒排索引的规则:从单词到doc_id的关系
引入了分词器概念,不同的分词器查询出来的东西是不一样的,假设是像下面这样拆分的:
word | doc_id |
---|---|
若泽数据 | 1 |
从事 | 1 |
大数据培训 | 1,3 |
Spark | 2 |
一种 | 2 |
分布式 | 2 |
计算引擎 | 2 |
很多 | 3 |
- 简单说下实现原理:我们搜索大数据培训,在正排索引中是1根3;而使用倒排索引,检索大数据培训,匹配到doc_id中存储的是1,3;再直接拿到整段话(1、若泽数据从事大数据培训))、(3、大数据培训有很多)
2.4 ES核心概念
Basic Concepts
- There are a few concepts that are core to Elasticsearch. Understanding these concepts from the outset will tremendously help ease the learning process.
Near Realtime(NRT)
1、我们把一个东西构建成索引之后,然后这个索引能够被查出来的时间近乎似实时的;数据进去跟出来有很短的延迟。
- Elasticsearch is a near-realtime search platform(近实时的搜索平台). What this means is there is a slight latency(一个很短的延时)(normally one second)from the time you index a document until the time it(从你去建立一个索引到这个东西能够被访问到) becomes until the time it becomes searchable.
Cluster
2、把一个节点的属性设置为同一个名字,自动能被加进集群中去。
- A Cluster is a collection of one or more nodes (servers)(集群是一个或者多个节点的集合) that together holds your entire data(存储完整的数据) and provides federated indexing(提供联合索引) and search capabilities across all nodes(跨节点的搜索功能). A cluster is identified by a unique name which by default is “elasticsearch”(一个集群是有一个独一无二的名字的默认是elasticsearch). This name is important because a node can only be part of a cluster if the node is set up to join the cluster by its name(这个名字是非常重要的因为一个节点仅仅只能够成为一个集群的部分,如果这个节点被设置进集群是通过它的名字的).
Node
- A node is a single server(单独的服务器是集群的一部分) that is part of your cluster, stores your data, and participates in the cluster’s indexing and search capabilites(存储数据、构建索引、提供查询). Just like a cluster, a node is identified by a name which by default is a random Unique IDentifier(UUUID)that is assigned to the node at startup(有一个随机的UUID在启动的时候就会被分配). You can define any node name you want if you do not want the default(你能够重新定义这个名字). This name is important for administration purposes where you want to identify which servers in your network correspond to which nodes in your Elasticsearch cluster.
Index(索引)
- An index is a collection of documents that have somewhat similar characteristics. For example, you can have an index for customer data, another index for a product catalog, and yet another index for order data. An index is identified by a name (that must be all lowercase) and this name is used to refer to the index when performing indexing, search, update, and delete operations against the documents in it.
Type
-
Deprecated in 6.0.0中
-
A type used to be a logical category/partition of your index(用来描述索引中逻辑的概念和分区) to allow you to store different types of documents in the same index, eg: one type for users, another type for blog posts. it is no longer possible to create multiple types in an index, and the whole concept of types will be removed in a later version.
我们把index理解为数据库,Type就是数据库中的表;目前一个index中只能有一个type,没有那么的重要
Document:
- 理解为一行一行的数据:
- A document is a basic unit of information(信息的一个最基本的单元能够被建立索引) that can be indexed. For example, you can have a document for a single order. This document is expressed in JSON (JavaScript Object Noation) (都是以JSON的方式进行表述的)which is a ubiquitous internet data intercahnge format.
此外还有一个Field的概念:
Field : column
我们常用的是Index、Document、Type、Field
2.5 正式搭建Elasticsearch6.6.2
1、下载、解压、环境变量
2、目录结构如下:
bin:所有的脚本
config:一堆的配置信息
lib:一堆jar包
logs:日志文件
plugins:ES支持插件,存放插件用的
前置环境要求:
- Centos7+,如果是centos6版本会有各种各样的问题(会有各种limit)
- JDK至少是1.8
2.6 启动Elasticsearch及配置文件修改
一、启动Elasticsearch
- 进入到bin目录,使用:./elasticsearch命令进行启动。
- ip + port(9200)
在本机上进行测试:curl -XGET 127.0.0.1:9200,我们发现在本机上是通的,为什么浏览器访问不了???
方式一:修改Elasticsearch配置文件:
-
修改elasticsearch.yml配置文件,我们cat查看其中的信息:
-
查看到elasticsearch.yml中有个network的信息:network.host需要进行修改:
ES的限制比较多:curl -XGET hadoop004:9200 curl -XGET 127.0.0.1:9200
进行如下修改:
1、修改cluster-name:ruozedata-es-cluster
2、修改node-name:ruozedata-es-node1
3、修改network.host : 0.0.0.0
4、修改path.data: /home/hadoop/app/elasticsearch-6.6.2/data
修改完成后再次启动ES,./elasticsearch
测试能否进行通信:
curl -XGET localhost:9200
curl -XGET 172.19.149.226:9200 //这个是内网IP
curl -XGET 127.0.0.1:9200
方式二:启动的时候后面跟上参数这种方式也行:
bin/elasticsearch -E cluster.name=ruozedata-es-cluster2 -E node.name=ruozedata-es-node2
直接使用浏览器的方式去观察:
- 配置文件中就存在的和命令行输入的一个优先级的问题:
- 生产上使用yml的方式比较常用一点。
生产上的启动方式(后台启动):
-
bin/elasticsearch -d
-
查看近200行日志,看哦不哦K,tail -200f logs/elasticsearch.log
2.7 如何在一台机器上搭建多个节点(仅仅做测试用)
参考博客如下:
- https://www.cnblogs.com/wxw16/p/6160186.html
举例:一台机器上搭建两个节点:
- 我们的数据默认是存储在:/home/hadoop/app/elasticsearch-6.6.2/data 这个节点下的;如果部署两台机器的话,data的目录一定要修改。
进行测试,报错如下:
- 第一个节点启动没问题,第二个节点目录不变的话就会报错,需要自己执行目录
于是添加参数-E path.data:
- -E path.data=ruozedata-es-node1-data 这个是指定的输出路径
启动如下:
- 节点1: bin/elasticsearch -E cluster.name=ruozedata-es-cluster -E node.name=ruozedata-es-node1 -E path.data=ruozedata-es-node1-data
- 节点2:bin/elasticsearch -E cluster.name=ruozedata-es-cluster -E node.name=ruozedata-es-node2 -E path.data=ruozedata-es-node2-data
问题:
- 每一个节点数据都存在data目录,两个的话目录不改掉就会启动不了
此时通过浏览器去访问:
1、就是查看节点信息:
- 106.14.186.41:9200/_cat/nodes 阿里云机器使用公网IP访问
注意:模拟的是一个集群下的两个节点
2、查看节点健康状况:
- 106.14.186.41:9200/_cluster/health?pretty 使用公网IP
- 此种方式仅作测试用,生产上肯定是一台机器部署一个elasticsearch的;但是在学习过程中,很多情况下需要实现Elasticsearch的分布式效果,所以需要启动多个节点,所以就需要在一台服务器上部署多个节点,分别是node1和node2。
出现的问题:另外一个节点访问不到了,WHY?
- 排查下来启动的参数写错了
2.8 启动Elasticsearch出现的问题
- limit错误:
ERROR: [2] bootstrap checks failed
[1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2019-09-22T17:57:22,598][INFO ][o.e.n.Node ] [ruozedata-es-node1] stopping ...
[2019-09-22T17:57:22,614][INFO ][o.e.n.Node ] [ruozedata-es-node1] stopped
[2019-09-22T17:57:22,614][INFO ][o.e.n.Node ] [ruozedata-es-node1] closing ...
[2019-09-22T17:57:22,623][INFO ][o.e.n.Node ] [ruozedata-es-node1] closed
报错问题解决:
- 这些limit限制如何解决:
https://blog.csdn.net/lilongsy/article/details/82115980
2.9 生产中的调优点
在config/这个目录下的jvm.options下,里面的参数调整:
- JVM heap size 此参数默认1g
GC configuration:
第三章:Elasticsearch中的插件
3.1 Elasticsearch-head插件安装
elasticsearch-head插件下载地址:
- https://github.com/mobz/elasticsearch-head/releases/tag/v5.0.0
插件安装步骤如下网址依次安装部署:
- https://github.com/mobz/elasticsearch-head
我的测试机器是阿里云购买的付费云主机,所需安装的服务有node.js 、npm、bzip2;
安装步骤如下:
1、安装所需的服务
- yum install -y node.js npm bzip2
2、npm install 我的当前环境报错了,解决如下:
https://www.jianshu.com/p/e5c117746060
3、npm run start
启动这个服务,不过启动前需要修改配置:
不建议直接使用第三步npm run start启动:
进行修改:
- 在这个目录下:/home/hadoop/app/elasticsearch-head-5.0.0,编辑这个文件:vi Gruntfile.js,需要添加一行hostname: ‘*’,否则的话外部浏览器会访问不了。
- 另外一个配置:/home/hadoop/app/elasticsearch-head-5.0.0/_site/app.js,修改信息如下:
如何启动elasticsearch-head插件:
- PK哥习惯使用这种方式启动:
1、进入到这个目录:
- cd /home/hadoop/app/elasticsearch-head-5.0.0/node_modules/grunt/bin
2、使用命令开始启动:
- 命令:./grunt server &
3、http://106.14.186.41:9100/ 公网IP+port
- 显示未连接是为什么?缺少了跨域访问。
启动前需要先配置跨域访问:
在这个路径下编辑这个文件:
[hadoop@hadoop005 config]$ pwd
/home/hadoop/app/elasticsearch-6.6.2/config
[hadoop@hadoop005 config]$ ll
total 36
-rw-rw---- 1 hadoop hadoop 207 Sep 22 21:01 elasticsearch.keystore
-rw-rw---- 1 hadoop hadoop 2947 Sep 22 22:53 elasticsearch.yml
添加如下在这个配置文件中的头部位置:
http.cors.enabled: true
http.cors.allow-origin: "*"
再次启动测试:
- 节点1: bin/elasticsearch -E cluster.name=ruozedata-es-cluster -E node.name=ruozedata-es-node1 -E path.data=ruozedata-es-node1-data
- 节点2:bin/elasticsearch -E cluster.name=ruozedata-es-cluster -E node.name=ruozedata-es-node2 -E path.data=ruozedata-es-node2-data
如下图是访问okay:
此处需注意的点:
- 由于我是阿里云服务器:在root用户下需要编辑:/etc/hosts文件,添加外网ip+hostname的映射:
- 阿里云服务器还要在安全组配置中开放相对应的端口,否则本地浏览器也是无法访问的。
- 在windows本地如下路径:C:\Windows\System32\drivers\etc\hosts,也需要添加外网ip+hostname的映射关系才能出现如上图的这个界面。
3.2 Kibana插件安装
Kibana简介:
- Kibana让您能够自由的选择如何呈现自己的数据。借助于Kibana的交互可视化,可以先从一个问题触发,看看能够从中发现什么。
基本内容:
一、Kibana核心产品搭载了一批经典功能:柱状图、线装图、饼图、旭日图、等等
二、通过Kibana中的Canvas,发挥无限创意
不受条条框框的限制,可以通过徽标、颜色和能够突出贵公司品牌特色的设计元素将自己的品牌和风格融入到数据中,讲述独属于您的故事。Canvas能够基于实时数据发挥无限创意,并且它还支持SQL.
三、安全的分享与合作
- 只需要选择适合您的分享选项,即可轻松地把Kibana可视化分享给你选择的任何人:你的团队成员、老板、老板的老板、你的客户。嵌入仪表板,分享链接,或者导出为PDF、PNG或CSV文件并作为附件发送给别人。
四、超级安全
- 通过Kibana Spaces整理你的仪表板和可视化。通过基于角色的访问控制,邀请用户访问某些空间(但不允许访问其他空间),让他们能够查看特定内容并使用特定功能。
五、用于数据采集等操作的堆栈管理
-
有了Kibana之后,命令行不再是管理安全设置、监测堆栈、采集和汇总数据或配置其他Elastic Stack功能的唯一途径。与此同时,得益于API,用户可以通过可视化UI轻松的管理ElasticStack并确保其安全性,这种方式更加直观,也更容易上手。查看完整的 Kibana 功能和 UI 列表
-
有时候我们只想对某个文件进行tail操作。或者希望跟踪自己网站的运行状况。或者希望查看分布式痕迹。通过Kibana内置应用,例如开源日志监测(Logs)、开源基础设施检测(Infrastructure)、开源应用程序性能监测(APM)、 开源运行状态监测(Uptime)以及其他应用,无需离开Kibana,就能轻松的完成这一切。
-
可点击,可拖动,可挖掘。乐享Kibana. Kibana自带Node.js.Web服务器,无需额外代码或额外基础架构。
一、Kibana的下载网址:
- https://www.elastic.co/cn/downloads/past-releases/kibana-6-6-2
通过Kibana,您可以对自己的Elasticsearch进行可视化,还可以在Elastic Stack中进行导航,这样就可以进行各种操作了,从跟踪查询负载,到理解请求如何流经您的整个应用,都能够轻松完成。
二、Kibana的部署安装:
- 解压到如下这个目录:/home/hadoop/app/kibana-6.6.2-linux-x86_64,进入到config目录下,编辑kibana.yml这个文件,修改两个地方就行。
1、To allow connections from remote users, set this parameter to a non-loopback address.
server.host: "0.0.0.0"
2、The Kibana server's name. This is used for display purposes.
server.name: "ruozedata-kibnana"
配置文件修改完成后,直接进入到bin目录,启动Kibana:./kibana,我们去到浏览器上查看:外网IP+5061端口号;此时发现浏览器不能访问,于是在阿里云控制台上配置安全组;修改完后直接在浏览器中访问:http://106.14.186.41:5601/app/kibana#/home?_g=()
1、Dev Tools
- 除了我们在浏览器中使用了http://106.14.186.41:9200/_cat/nodes命令,和GET _cat/nodes查看出来的信息是一样的。
2、Discover
3、Visualize(可视化)
- 为我们展示了多种多样不同类型的图。
4、Dashboard(指示板)
- 可以把几张图并到一张图上查看信息。
等等等等,还有很多…
3.3 图解如何登陆Kibana
- 我们使用账号登录进数据平台,在数据平台中搞一个link,把url连接过来;所有的权限都是通过login账号来控制的;不同人的权限不同。
第四章:Elasticsearch的一些操作
- curl --help 查看curl的命令帮助:
常用参数:PUT、POST、DELETE
- post和put参数的主要区别:post是用来提交、put是用来修改。
4.1 Elasticsearch中的索引库
第一步操作:
- curl -XPUT ‘http://hadoop000:9200/es’
一个index索引库,默认是5个分片,2个副本;在node1中,分为0、2、4(黑框是主分片);在node2中,分为1、3.
第二步:索引库可以不用手动添加,添加索引的时候它会默认带上去。
注意:索引只能小写,大写ES它是不认的。
第三步:我们在Dev Tools中进行测试
4.2 Elasticsearch中创建索引
1、索引的创建:
-
curl -XPOST ‘http://hadoop005:9200/es/student/1’ -d ‘{
“name”:“zhangsan”,
“age”:“30”,
“interests”:[“spakr”,“flink”]
}’ -
报错信息如下:{“error”:“Content-Type header [application/x-www-form-urlencoded] is not supported”,“status”
需要指定content-type:
-
curl -XPOST -H “Content-Type:application/json” ‘http://hadoop005:9200/es/student/1’ -d ‘{
“name”:“zhangsan”,
“age”:“30”,
“interests”:[“spakr”,“flink”]
}’ -
解析:-H是用来指定Content-Type的
此时我们去到这个网址中:106.14.186.41:9100,点击数据浏览,点击es中就能查看到这些信息。
测试再次放入一条记录:
curl -XPOST -H "Content-Type:application/json" 'http://hadoop005:9200/es/student/2' -d '{
"name":"lisi",
"age":"40",
"interests":["eat","speak"]
}'
2、输入上述命令后控制台的打印:
{"_index":"es","_type":"student","_id":"2","_version":1,"result":"created","_shards":{"total":2,"successful":2,"failed":0},"_seq_no":0,"_primary_term":1}
Elasticsearch-head中的效果:数据已经插入进去了:
查看其在Kibana中的效果:
1、进入到Kibana中的网址:
2、点击Index Pattern,我们看到此处只有三个系统默认的索引库;需要点击Create index pattern,输入创建的索引库名字es,点击Next Step --> Create index pattern来进行关联。
3、回到Kibana中的Discover中去查看:
4.2.1 curl POST和PUT的区别:
CURL POST和PUT的区别:
POST:新增
PUT:修改
注意:我们新增的时候,可以不指定id,系统会为我们自动生成这个信息。
curl post测试:
curl -XPOST -H "Content-Type:application/json" 'http://hadoop005:9200/es/student/' -d '{
"name":"wangwu",
"age":"50",
"interests":["Beautiful-girl","Money"]
}'
Elasticsearch-head中观察到如下:id是系统自动为我们生成的,且不会重复
curl put测试:
put是修改,肯定是对已有的进行修改(这句话是错误的):
- 测试如下:id=100并不存在,我们使用curl -put
curl -XPUT -H "Content-Type:application/json" 'http://hadoop005:9200/es/student/100' -d '{
"name":"Mico",
"age":"23",
"interests":["take photo","play"]
}'
测试对已有的id=100的进行修改:
- 结论:数据确实发生了修改
curl -XPUT -H "Content-Type:application/json" 'http://hadoop005:9200/es/student/100' -d '{
"name":"Mico",
"age":"24",
"interests":["make love","study"]
}'
RESTful风格的API了解? 博士论文
总结:
1、post方式可以指定id和不指定id的方式都可以
2、put的方式可以指定不存在的id和对已经存在的id的索引内容进行修改。
Kibana中进行修改:
在Dev Tools:
我们刚刚插入的数据:
- 在Elasticsearch-head中查询:
- 在Kibana中查询如下:
- 在浏览器中查询出来的效果也是一样的:
4.3 ES中索引和索引库的删除操作
索引的删除操作:
我们把具体的某一个索引删除,在Kibana中操作:
- DELETE es/student/100
测试成功删除。
删除索引库:
-
在elasticsearch-head中删除:
-
在虚拟机下直接用命令行删除:
-
curl -XDELETE ‘http://hadoop005:9200/test’