你将学习到以下技能:
本课程所有使用到的 Elastic Stack 程序文件和软件包都位于 AWS 测试环境虚拟机的 ec2-user
用户目录下。
ami-0e5a0e294902966af
北京区 ami-0e1382088b62cb38d
Elastic 官方参考文档:
Elastic Stack 包含了我们常说的 ELK 或者 ELKB。如下图所示:
ELK 是 Elasticsearch、Logstash和Kinina的首字母缩写,ELK Stack是elastic公司三大核心产品的组合方案。
顺利完成本 Lab 的笔记本电脑的软硬件需求如下。
Positive : 建议使用配置足够的笔记本电脑,能上网,可以快速访问 AWS 中国区的服务,已获取最佳体验。
进入 AWS 中国区控制台 https://amazonaws.cn ; 在 EC2 服务中启动一个如下配置的实例,不低于以下配置
ami-0e1382088b62cb38d
(北京区) 或者 ami-0e5a0e294902966af
(宁夏区)t3.medium
8
GB共有 IP
EC2 安全组开放如下入栈端口:
Negative : 打开SSH工具软件,成功的登录到目标 EC2 实例中,查看根目录下应该包含两个目录 elastic-stack
和 petclinic
。
Positive : 在实操练习 EC2 虚拟机的 elastic-stack 目录中使用 Elasticsearch 服务器软件压缩包。
进入软件包所在的 elastic-stack 目录中。解压缩 Elasticsearch 服务器端软件包。
tar -xvf elasticsearch-7.9.3-linux-x86_64.tar.gz
ls
目录中出现了名为 elasticsearch-7.9.3
的目录。
进入加压缩后的目录,并在命令行启动 Elasticsearch 服务器。
cd elasticsearch-7.9.3/bin
./elasticsearch -Ecluster.name=1m-only -Ediscovery.type=single-node -Enode.name=node1 -Enetwork.host=0.0.0.0
在启动日志停止滚动后,一个名为 1m-only
的单节点 Elasticsearch 集群就启动成功了。启动是参数说明如下:
在一个新的 EC2 SSH 访问的命令行窗口中用 curl
命令行工具测试 Elasticsearch 集群服务的状态。
查看服务的基本信息。
curl -X GET http://localhost:9200
curl -X GET http://localhost:9200
{
"name" : "node1",
"cluster_name" : "1m-only",
"cluster_uuid" : "LvHOXakFTby0-uPwq_Ekiw",
"version" : {
"number" : "7.9.3",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "c4138e51121ef06a6404866cddc601906fe5c868",
"build_date" : "2020-10-16T10:36:16.141335Z",
"build_snapshot" : false,
"lucene_version" : "8.6.2",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
查看集群中节点的状态信息。
curl -X GET http://localhost:9200/_cat/nodes\?v
curl -X GET http://localhost:9200/_cat/nodes\?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
127.0.0.1 17 97 7 2.05 dilmrt * node1
上面的 master
那一列下面的值为 *
号,表明节点 node1
是这个集群中唯一的主节点。
在浏览器中验证 Elasticsearch 集群服务的状态,打开浏览器中访问这个网址 http://public_IP:9200
。 使用浏览器访问 EC2 实例的公网 IP 的 9200
端口,访问结果应如下图所示:
然后尝试访问这个网址 http://public_IP:9200/_cat/nodes\?v
。
Negative : 确保在命令行和浏览器中都能看到正确的集群名称、节点名称和软件版本号。当前处于开发模式的无密码访问模式,处于非安全的状态。
Positive : 这个运行中的 Elasticsearch 集群提供着功能完整的 RESTFul API 服务,包括对索引和文档的增删改查(CURD)等操作。
索引一个文档,该文档只具有一个键值对数据 "name": "John Doe" 。
curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name": "John Doe"
}
'
注意:以上命令最后一行还有一个单引号。
以上命令的返回结果如下:
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
以上的命令创建了名称为 customer
的新索引,并保存了第一个编号为 1
的文档。
用下面的命令读取这个编号为 1
的文档。
curl -X GET "localhost:9200/customer/_doc/1?pretty"
返回的结果如下:
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "John Doe"
}
}
在导入大量文档的时候,可以使用 buck API 进行批量索引(导入)的操作。
在 elastic-stack 目录中查看 account.json
文件,用 cat 命令浏览该文件中的 1000 条数据。
在命令行中,将以上测试数据文件批量导入到 Elasticsearch 服务中,运行下面的两条命令。
curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@accounts.json"
curl "localhost:9200/_cat/indices?v"
以上命令的结果,最后三行应该如下所示:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open bank Q_yO2ErRSRSgCXHu6eac-g 1 1 1000 0 382.2kb 382.2kb
yellow open customer D9ijmP_iR225damqVPQwkw 1 1 1 0 3.8kb 3.8kb
上面的结果表明:当前的集群中已经创建了两个索引 bank
和 customer
; 名为 bank
的索引显示文档数为 1000,这就是刚才用 bulk API 导入的数据。
如果在浏览器中访问这个网址 http://public_IP:9200/_cat/indices?v
也可以看到如下相同结果。
Negative : _doc
和 _bulk
API 索引了单个和批量的数据文档。名为 bank
和 customer
的索引也在过程中被创建。
Positive : 使用 _search API 进行搜索,Elasticsearch Query DSL 有一整套的搜索能力。
说明:
在命令行执行下面的命令。
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
]
}
'
执行结果解释:
以上命令返回了搜索结果的整体概述信息和第一页(前 10 条文档)的搜索结果。
说明:
在命令行执行下面的命令。
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
],
"from": 10,
"size": 10
}
'
执行结果解释:
说明:
mill
和 lane
关键词的文档在命令行执行下面的命令。
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": { "match": { "address": "mill lane" } }
}
'
执行结果解释:
address
这个字段的返回值mill
和 lane
两个关键词。###搜索 4
说明:
在命令行执行下面的命令。
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}
'
执行结果解释:
age
这个字段的都是 40
state
这个字段的值都不是 ID
说明:
balance
在 20000 到 30000 之间的数据在命令行执行下面的命令。
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
'
执行结果解释:
balance
的数值是否满足搜索条件Negative : 通过 _search
API 成功的完成了 5 个目的不同的搜索操作,体会 Elasticsearch 的搜索能力。
Positive : Elasticsearch 可以在搜索结果中进行聚合分析 Aggregations ,通过各种结构汇计算总搜索结果数据。
###聚合运算 1
说明:
在命令行执行下面的命令。
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
}
}
'
执行结果解释:
###聚合运算 2
说明:
在命令行执行下面的命令。
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
'
执行结果解释:
###聚合运算 3
说明:
在命令行执行下面的命令。
curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword",
"order": {
"average_balance": "desc"
}
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
'
执行结果解释:
Negative : 通过 _search
API 中的 aggs
运算成功的完成了 3 个目的不同的搜索结果聚合运算操作,体会 Elasticsearch 的数据搜索后的聚合运算分析能力。
Positive : 解压缩并运行 Kibana 软件包,使用 Kibana 的图形界面搜索 bank 索引中的数据。
在 EC2 实例的 SSH 控制台中,运行下面的命令。
tar -xzf kibana-7.9.3-linux-x86_64.tar.gz
cd kibana-7.9.3-linux-x86_64/
从命令行启动 Kibana 服务器。
bin/kibana --server.host=0.0.0.0
启动参数解释:
到目前为止,Elasticsearch 集群运行在无密码的开发模式,因此无需输入用户名和密码。
打开浏览器访问网址 http://public_IP:5601
; 确保安全组中开放 5601 端口的访问;通过 EC2 实例的公网 IP 访问 Kibana 服务。
在进入 Kibana 图形界面后,点击 Load a data set and a Kibana dashboard
链接。
分别点击这三个按钮,导入三组示例数据。
点击 Dashboard 查看数据分析仪表板。
为了在图形界面中创建用于分析 bank 索引中所有数据的 索引模式
。
点击左上角的按钮打开左侧菜单,点击 Stack Management 菜单。
在 Kibana 管理选项中,点击创建索引模式按钮。
在索引模式名称中输入 bank , 点击先一步直到创建完成。
点击左上角的按钮,打开左侧菜单栏,点击 Kibana 部分的 Discover 链接。
点击左侧的向下三角图标,打开索引选择菜单,选中刚才创建的 bank 索引模式。
参考左侧的可用字段,这是 bank 索引的所有字段。点击第一条数据的向下按钮,查看该文档。
Negative : 成功的导入和查看了 Kibana 产品附带的三组示例数据。使用 Kibana 图形界面探索了批量导入的 bank 索引中的数据。