本篇文章继续介绍ELFK日志分析,还是ES的相关内容,包括ES-head工具,Postman工具,ES常用术语、ES状态颜色、JSON快速入门、ES中API使用、批量存储/读取练习,带大家深入了解ES的功能和使用。
工具准备
一、ES-head工具
解压压缩包(文末有下载链接),生成文件夹,路径尽量不要用中文名称,在谷歌浏览器(其他浏览器也行,但是推荐谷歌)扩展程序里面加载已解压的扩展程序,选择文件夹
打开空白界面,右上角点击扩展程序
更改主机IP和端口,点击链接,可以看到ES的信息
二、Postman工具
双击打开postsman安装包文件(文末有下载链接),会自动安装,在桌面创建图标,打开后提示注册或登录,没有账号我们需要注册
点击注册按钮后弹出网页,在网页上进行注册即可
注册后后会给邮箱发右键,需要打开邮件点击验证一下
验证好后我们关闭postman,再重新打开,可以看到我们的账号自动登录了
如果弹出更新,不需要更新,新版不咋好用
我们新建一个工作区
更改姓名,设置权限为自己可以访问
可以点击加号添加文件夹,更改名字
右键文件夹可以添加请求
输入URL,回车可以看到返回信息
ES的常用术语
1、 索引(index):存储数据的逻辑单元,并不负责实际的数据存储。用户可以基于索引进行数据的读写。
2、分片(shard):一个索引最少有一个分片,数据存储在分片上。
3、副本(replica):一个分片可以有0个副本,如果一个分片的副本数为0,但该分片宕机时,则数据无法访问。
4、主分片(primary shard)与副本分片(replica shard):主分片可以对数据进行读写,副本分片只能进行读取,主分片出问题后,同一索引下的副本分片会立即切换成主分片,从只能读取变为可以读写,实现高可用。
5、文档(document)与JSON格式:在分片中存储的数据,对应的是JSON格式对象数据类型,而JSON格式就是文字的序列化,主机与主机间数据传输通常是使用JSON格式,之前有用xml和html,但是不够轻量,浪费带宽,而磁盘和内存之间传输是通过二进制格式文件。
ES状态颜色
ES集群健康值的颜色有三种
红色,集群处于不健康状态,表示部分主分片无法访问,意味着此时数据未全部加载,要么集群大规模宕机,要么就是集群启动时短暂出现;
黄色,集群处于亚健康状态,表示主分片可以正常访问,部分副本分片无法正常访问;
绿色,集群处于健康状态,表示主分片和副本分片均可以正常访问。
JSON快速入门
在进行api使用前,我们需要先了解json,因为api的post提交,基本都是json格式的,json格式可以提交所有的数据类型。
一、基础数据类型
字符串:"name" 、"age"、"123"、"true"
布尔值:true、false
数值:2023、3.14、9.18
空值:null
二、高级数据类型
数组:["2023",true,3.14,null]
对象:{"name":"koten","hobby":["Linux","K8s"]}
{
"name":"koten",
"hobby":["Linux","K8s"]
} 这种格式也可以,但是有空字符,会占用宽带资源,所以能见到一些网站用一行的json请求和一行html代码页面。
对象中前面的数据为元数据,是用于描述数据的数据,后面的数据为实际数据。
ES的API使用方法
由于外部访问ES数据需要http或https请求,所以我们在postman中列举这些请求,同时查看http请求效果
一、索引管理
1、查看
1、查看所有索引
GET http://10.0.0.101:19200/_cat/indices?v
2、查看单个索引的详细信息
GET http://10.0.0.101:19200/koten
2、创建
1、直接创建索引
PUT http://10.0.0.101:19200/koten
边框粗的切片为主切片,边框窄的切片为副本切片
2、指定分片数创建索引
PUT http://10.0.0.101:19200/koten
{
"settings": {
"index": {
"number_of_shards": "3"
}
}
}
3、指定分片数和副本数创建索引
PUT http://10.0.0.101:19200/koten
{
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "0"
}
}
}
3、修改
1、修改索引的副本数量
PUT http://10.0.0.101:19200/koten/_settings
{
"number_of_replicas": "2"
}
注意:不允许动态修改分片的数量,因为文档储存的时候,会根据文档的id哈希值跟主分片数量取余决定它储存到哪个分片,倘若主文档的id哈希值是10,主分片数量是3,那么取余会得1,所以会储存进分片位置为1的分片中,如果更改了主分片位置,不管是减少还是增加,都会更改位置,位置更高意味着存进去的数据再取的时候取不出原来的数据,导致数据错乱,所以在定义主分片的时候一开始就要定义好,后续不能修改。
4、删除
1、通过es-head删除
2、通过curl删除
[root@ELK ~]# curl -X DELETE 10.0.0.101:19200/koten
{"acknowledged":true}
3、postman删除
可以选择删除单个索引也可以基于通配符删除索引
DELETE http://10.0.0.101:19200/koten #删除单个索引
DELETE http://10.0.0.101:19200/ko* #利用通配符删除索引
5、关闭
关闭索引,将无法进行读写操作,但是数据不会被删除,关闭前状态如下
POST http://10.0.0.101:19200/koten/_close
6、打开
打开索引,索引重新可以读写,默认是打开状态
POST http://10.0.0.101:19200/koten/_open
7、别名
别名的意义在于,存数据的时候可能不会只存到一个索引中,所以我们给这些索引取上别名,到时候取数据的时候,可以通过别名将他们都取出。
1、查看所有索引的别名
GET http://10.0.0.101:19200/_aliases
2、给索引添加别名
POST http://10.0.0.101:19200/_aliases
{
"actions": [
{
"add": {
"index": "koten",
"alias": "Linux容器运维工程师"
}
}
]
}
3、给索引删除别名
POST http://10.0.0.101:19200/_aliases
{
"actions": [
{
"remove": {
"index": "koten",
"alias": "Linux容器运维工程师"
}
}
]
}
也可以在界面删除
4、给索引修改别名
修改别名的原理就是先删除再添加
POST http://10.0.0.101:19200/_aliases
{
"actions": [
{
"remove": {
"index": "koten",
"alias": "Linux容器运维工程师"
}
},
{
"add": {
"index": "koten",
"alias": "DBA运维工程师"
}
}
]
}
当然除了这些索引还有其他操作,有需要可以看官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices.html
二、文档操作
1、创建
1、不指定文档ID
POST http://10.0.0.101:19200/koten/_doc
{"name":"koten","hobby":["Linux","K8s"]}
2、指定文档ID
如果已有的文档id再次创建文档内容会被覆盖
POST http://10.0.0.101:19200/koten/_doc/1001
{"name":"koten","hobby":["Linux","K8s"]}
或者
POST http://10.0.0.101:19200/koten/_doc
{"name":"koten","hobby":["Linux","K8s"],"_id":"1001"}
两个方法都可以,各有利弊,前者提交信息没有体现id,但是写在url可以快速检索,无需遍历整个索引,后者会增大带宽资源,但是看着更加明了,容易记忆
再次点击,提交的文档内容会被覆盖,且_version显示2
2、查看
1、全量查询
GET http://10.0.0.101:19200/koten/_search
2、查询指定的文档
GET http://10.0.0.101:19200/koten/_doc/1001
3、修改
1、全量更新
POST http://10.0.0.101:19200/koten/_doc/1001
{
"name": "koten",
"hobby": [
"mysql",
"windows",
"nginx"
]
}
2、局部更新
POST http://10.0.0.101:19200/koten/_doc/1001/_update
{
"doc": {
"hobby": [
"PHP",
"zabbix"
],
"address": "101"
}
}
4、删除
DELETE http://10.0.0.101:19200/koten/_doc/1001
5、批量增加
批量处理用到_bulk的api,写的提交内容不再是json格式,而是一种固定的格式
POST http://10.0.0.101:19200/_bulk
{ "create":{"_index":"koten01","_id":1001}}
{"name":"koten01","hobby":["nginx","tomcat","php"]}
{ "create":{"_index":"koten02","_id":1002}}
{"name":"koten02","hobby":["gitlab","Jenkins","sonarqube","maven"]}
6、批量查询
GET http://10.0.0.101:19200/_mget
{
"docs": [
{
"_index": "koten01",
"_id": "1001"
},
{
"_index": "koten02",
"_id": "1002"
}
]
}
7、批量更改
POST http://10.0.0.101:19200/_bulk
{ "update":{"_index":"koten01","_id":1001}}
{"doc":{"name":"koten01","hobby":["1","2","3"]}}
{ "update":{"_index":"koten02","_id":1002}}
{"doc":{"name":"koten02","hobby":["4","5","6","7"]}}
8、批量删除
POST http://10.0.0.101:19200/_bulk
{ "delete" : { "_index" : "koten01", "_id" : "1001" } }
{ "delete" : { "_index" : "koten02", "_id" : "1002" } }
三、数据类型
创建数据类型的意义在于取数据的时候可以通过数据类型去取,我们以存储查看IP网段为案例,简单介绍下。
1、创建索引时指定映射关系
PUT http://10.0.0.101:19200/koten-ip
{
"mappings" :{
"properties": {
"ip_addr" : {
"type": "ip"
}
}
},
"settings": {
"number_of_shards":3,
"number_of_replicas":0
}
}
2、查看索引的映射关系
GET http://10.0.0.101:19200/koten-ip
3、创建测试数据
POST http://10.0.0.101:19200/_bulk
{ "create": { "_index": "koten-ip"} }
{ "ip_addr": "192.168.10.101" }
{ "create": { "_index": "koten-ip"} }
{ "ip_addr": "192.168.10.201" }
{ "create": { "_index": "koten-ip"} }
{ "ip_addr": "172.31.10.100" }
{ "create": { "_index": "koten-ip"} }
{ "ip_addr": "10.0.0.222" }
4、查看IP的网段
查看所有IP
GET http://10.0.0.101:19200/koten-ip/_search
查看指定的IP网段
POST http://10.0.0.101:19200/koten-ip/_search
{
"query": {
"match" : {
"ip_addr": "192.168.0.0/24"
}
}
}
练习(批量存储+批量定义数据类型)
批量存储10条宝马汽车的信息(数据来自采集当日的官网),字段包含标题、价格、品牌、商品链接地址、商品链接对应的IP地址、采集该信息的作者、作者所在组。
一、创建指定字段格式的索引
PUT http://10.0.0.101:19200/koten-shopping
{
"mappings" :{
"properties": {
"title": {
"type": "text"
},
"price": {
"type": "float"
},
"brand": {
"type": "keyword"
},
"item": {
"type": "text"
},
"group": {
"type": "byte"
},
"ip_addr" : {
"type": "ip"
},
"author": {
"type": "text"
}
}
},
"settings": {
"number_of_shards":3,
"number_of_replicas":0
}
}
二、采集并写入宝马商品信息数据
POST http://10.0.0.101:19200/_bulk
{ "create": { "_index": "koten-shopping"} }
{ "ip_addr": "221.194.154.181" ,"title":"BMW1系运动轿车 125i M运动曜夜版","price":249900,"brand":"宝马","item":"https://www.bmw-emall.cn/newcar/design?series=1&rangeCode=F52&packageCode=2W71_0ZMB&sop=1672502400000","group":3,"author":"koten"}
{ "create": { "_index": "koten-shopping"} }
{ "ip_addr": "221.194.154.181" ,"title":"BMW2系四门轿跑车 225i M运动曜夜套装","price":298900,"brand":"宝马","item":"https://www.bmw-emall.cn/newcar/design?series=2&rangeCode=F44&packageCode=31AK_0ZSM&sop=1667232000000","group":3,"author":"koten"}
{ "create": { "_index": "koten-shopping"} }
{ "ip_addr": "221.194.154.181" ,"title":"新BMW3系 330i M运动曜夜套装","price":381900,"brand":"宝马","item":"https://www.bmw-emall.cn/newcar/design?series=3&rangeCode=G20&packageCode=24FF_0ZMC&sop=1672502400000","group":3,"author":"koten"}
{ "create": { "_index": "koten-shopping"} }
{ "ip_addr": "221.194.154.181" ,"title":"THE i3 eDrive40L曜夜运动套装","price":413900,"brand":"宝马","item":"https://www.bmw-emall.cn/newcar/design?series=3&rangeCode=G28BEV&packageCode=81BE_0ZCP&sop=1672502400000","group":3,"author":"koten"}
{ "create": { "_index": "koten-shopping"} }
{ "ip_addr": "221.194.154.181" ,"title":"BMW4系双门轿跑车 430i M运动曜夜套装","price":479900,"brand":"宝马","item":"https://www.bmw-emall.cn/newcar/design?series=4&rangeCode=G22&packageCode=51AP_0ZSM&sop=1677600000000","group":3,"author":"koten"}
{ "create": { "_index": "koten-shopping"} }
{ "ip_addr": "221.194.154.181" ,"title":"BMW4系敞篷轿跑车 430i M运动曜夜套装","price":576900,"brand":"宝马","item":"https://www.bmw-emall.cn/newcar/design?series=4&rangeCode=G23&packageCode=11AT_0ZSM","group":3,"author":"koten"}
{ "create": { "_index": "koten-shopping"} }
{ "ip_addr": "221.194.154.181" ,"title":"纯电动BMW i4 eDrive40","price":469900,"brand":"宝马","item":"https://www.bmw-emall.cn/newcar/design?series=4&rangeCode=G26BEV&packageCode=71AW_0ZOM&sop=1677600000000","group":3,"author":"koten"}
{ "create": { "_index": "koten-shopping"} }
{ "ip_addr": "221.194.154.181" ,"title":"BMW5系Li 530Li xDrive M运动套装","price":495500,"brand":"宝马","item":"https://www.bmw-emall.cn/newcar/design?series=5&rangeCode=G38&packageCode=21AF_0ZLU","group":3,"author":"koten"}
{ "create": { "_index": "koten-shopping"} }
{ "ip_addr": "221.194.154.181" ,"title":"BMW6系GT 630i M运动大旅行家版","price":699900,"brand":"宝马","item":"https://www.bmw-emall.cn/newcar/design?series=6&rangeCode=G32&packageCode=21BP_0ZLU","group":3,"author":"koten"}
{ "create": { "_index": "koten-shopping"} }
{ "ip_addr": "221.194.154.181" ,"title":"新BMW7系 740Li 尊享型 豪华套装","price":1269000,"brand":"宝马","item":"https://www.bmw-emall.cn/newcar/design?series=7&rangeCode=G70&packageCode=11EH_0ZOM&sop=1677600000000","group":3,"author":"koten"}
ES-head中打开,点击链接可以直接跳转,类似于搜索引擎的跳转
三、读取宝马商品信息数据
读取全部信息数据
GET http://10.0.0.101:19200/koten-shopping/_search
ES安装包下载链接:https://pan.baidu.com/s/1UTXI6U4LvSdGnEflXkR29g?pwd=z04q
Postman安装包下载链接:https://pan.baidu.com/s/1-L2Odn1q9dP2VZnh0ghxJg?pwd=09c0
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!