ELK简介
什么是ELK
- ELK是一整套解决方案,是三个软件产品的首字母缩写,很多公司都在使用,如:Sina、携程、华为、美团等
ELK分别代表
- Elasticsearch:负责日志检索和储存
- Logstash:负责日志的收集和分析、处理
- Kibana:负责日志的可视化
- 这三款软件都是开源软件,通常是配合使用,而且又先后归于Elastic.co公司名下,故被简称为ELK
ELK能做什么
ELK组件在海量日志系统的运维中,可用于解决
- 分布式日志数据集中式查询和管理
- 系统监控,包含系统硬件和应用各个组件的监控
- 故障排查
- 安全信息和事件管理
- 报表功能
Elasticsearch
- ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful API的Web接口
- Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便
主要特点
- 实时分析
- 分布式实时文件存储,并将每一个字段都编入索引
- 文档导向,所有的对象全部是文档
- 高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas)
- 接口友好,支持JSON
ES没有什么
- Elasticsearch没有典型意义的事务
- Elasticsearch是一种面向文档的数据库
- Elasticsearch没有提供授权和认证特性
相关概念
- Node: 装有一个ES服务器的节点
- Cluster: 有多个Node组成的集群
- Document: 一个可被搜索的基础信息单元
- Index: 拥有相似特征的文档的集合
- Type: 一个索引中可以定义一种或多种类型
- Filed: 是ES的最小单位,相当于数据的某一列
- Shards: 索引的分片,每一个分片就是一个Shard
- Replicas: 索引的拷贝
SQL与NoSQL
-
ES与关系型数据库的对比
-
在ES中,文档归属于一种 类型(type),而这些类型存在于索引(index)中,类比传统关系型数据库
-
DB -> Databases -> Tables -> Rows -> Columns
-
关系型数据库 表 行 列
-
ES -> Indices -> Types -> Documents -> Fields
-
ES 索引 类型 文档 域(字段)
ES基础
ES集群安装
安装第一台ES服务器
- 设置主机名称和ip对应关系
- 解决依赖关系
- 安装软件包
- 修改配置文件
- 启动服务
- 检查服务
设置ip与主机名称对应关系
- 配置/etc/hosts
192.168.1.51 es1
- 安装JDK
- Elasticsearch要求至少Java 7
- 一般推荐使用OpenJDK 1.8
- 配置好安装源以后,我们先解决依赖关系
yum install -y java-1.8.0-openjdk
安装ES
yum -y install elasticsearch
修改配置文件
- elasticsearch.yml
network.host: 0.0.0.0
启动服务
-
启动服务并设开机自启
systemctl enable elasticsearch
systemctl start elasticsearch
-
验证:
netstat –ltunp
-
能够看到9200,9300被监听
-
通过浏览器或curl访问9200端口
curl http://192.168.1.51:9200/
{
"name" : "es1",
"cluster_name" : "myelk",
"version" : {
"number" : "2.3.4",
"build_hash" :
"e455fd0c13dceca8dbbdbb1665d068ae55dabe3f",
"build_timestamp" : "2016-06-30T11:24:31Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
},
"tagline" : "You Know, for Search"
}
部署ES集群
ES集群配置
- ES集群配置也很简单,只需要对配置文件做少量的修改即可,其他步骤和单机完全一致
- ES集群配置文件
cluster.name: myelk
node.name: es1
network.host: 0.0.0.0
discovery.zen.ping.unicast.hosts: [“es1", “es2", “es3"]
ES集群配置
- 集群中的所有节点要相互能够ping通,要在所有集群机器上配置/etc/hosts中的主机名与ip对应关系
- 集群中所有机器都要安装Java环境
- cluster.name集群名称配置要求完全一致
- node.name为当前节点标识,应配置本机的主机名
- discovery为集群节点机器,不需要全部配置
- 配置完成以后启动所有节点服务
(1)准备五台虚拟机192.168.1.60~192.168.1.64(es-node1~es-node5)
(2)配置es-node1
[root@es-node1 ~]# yum -y install java-1.8.0-openjdk,elasticsearch
[root@es-node1 ~]# vim /etc/hosts
... ...
192.168.1.60 es-node1
192.168.1.61 es-node2
192.168.1.62 es-node3
192.168.1.63 es-node4
192.168.1.64 es-node5
(3)拷贝并修改本地配置文件
[root@es-node1 ~]# cp /etc/elasticsearch/elasticsearch.yml ela.yml
... ...
cluster.name: ela
node.name: "{{ansible_hostname}}"
network.host: 0.0.0.0
discovery.zen.ping.unicast.hosts: [ "es-node1" , "es-node2" , "es-node3" , "es-node4" , "es-node5" ] //布置几个集群节点写几个
... ...
(4)node1安装ansible软件,执行批量操作
[root@es-node1 ~]# yum -y install ansible
(5)修改ansible配置文件
[root@es-node1 ~]# vim /etc/ansible/ansible.cfg
... ...
inventory = /etc/ansible/hosts
... ...
host_key_checking = False
... ...
[root@ansible ~]# vim /etc/ansible/hosts
... ...
[node]
es-node1
es-node2
es-node3
es-node4
es-node5
(6)设置node1可以无密码ssh其他主机
(7)编写yaml文件,并使用ansible-playbook实现批量操作
[root@es-node1 ~]# vim es.yaml
---
- hosts: all
remote_user: root
tasks:
- name: copy yum file
copy:
src: /etc/yum.repos.d/local.repo
dest: /etc/yum.repos.d/local.repo
owner: root
group: root
mode: 0644
- name: copy hosts
copy:
src: /etc/hosts
dest: /etc/hosts
owner: root
group: root
mode: 0644
- name: install elk
yum:
name: java-1.8.0-openjdk,elasticsearch
state: latest
- name: copy cfg
template:
src: /root/ela.yml
dest: /etc/elasticsearch/elasticsearch.yml
owner: root
group: root
mode: 0644
notify: reload ela
tags: esconf
- name: start service
service:
name: elasticsearch
enabled: yes
handlers:
- name: reload ela
service:
name: elasticsearch
state: restarted
[root@es-node1 ~]# ansible-playbook es.yaml
(8) 验证集群,使用ES内置字段 _cluster/health
[root@es-node1 ~]# curl http://192.168.1.60:9200/_cluster/health?pretty
{
"cluster_name" : "ela",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 5,
"number_of_data_nodes" : 5,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
返回字段解析
- status " : " green " 集群状态,绿色为正常,黄色表示有问题但不是很严重,红色表示严重故障
- “number_of_nodes” : 5, 表示集群中节点的数量
- “number_of_data_nodes” : 5,
… … … - “task_max_waiting_in_queue_millis” : 0,
- “active_shards_percent_as_number” : 100.0
ES插件的使用
ES常用插件
-
head插件
(1) 它展现ES集群的拓扑结构,并且可以通过它来进行索引(Index)和节点(Node)级别的操作
(2)它提供一组针对集群的查询API,并将结果以json和表格形式返回
(3) 它提供一些快捷菜单,用以展现集群的各种状态 -
kopf插件
(1)是一个ElasticSearch的管理工具
(2)它提供了对ES集群操作的API -
bigdesk插件
(1) 是elasticsearch的一个集群监控工具
(2) 可以通过它来查看es集群的各种状态,如:cpu、内存使用情况,索引数据、搜索情况,http连接数等
ES插件安装、查看
- 查看安装的插件
/usr/share/elasticsearch/bin/plugin list
- 安装插件
/usr/share/elasticsearch/bin/plugin install ftp://192.168.1.254/head.zip
/usr/share/elasticsearch/bin/plugin install file:///tmp/kopf.zip
- 这里必须使用 url 的方式进行安装,如果文件在本地,我们也需要使用 file:/// 的方式指定路径,例如文件在/tmp/xxx下面,我们要写成 file:///tmp/xxx , 删除使用remove 指令
将插件拷贝到本地,使用本地安装
[root@es-node5 ~]# /usr/share/elasticsearch/bin/plugin install file:///root/elk/bigdesk-master.zip
[root@es-node5 ~]# /usr/share/elasticsearch/bin/plugin install file:///root/elk/elasticsearch-head-master.zip
[root@es-node5 ~]# /usr/share/elasticsearch/bin/plugin install file:///root/elk/elasticsearch-kopf-master.zip
[root@es-node5 ~]# /usr/share/elasticsearch/bin/plugin list
[root@es-node5 ~]# firefox http://192.168.1.64:9200/_plugin/head/
[root@es-node5 ~]# firefox http://192.168.1.64:9200/_plugin/bigdesk/#nodes
扩展插件
HTTP 协议简介
- http请求由三部分组成
- 分别是:请求行、消息报头、请求正文
- 请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议版本,格式如下:
Method
Request-URI
HTTP-Version CRLF
http请求方法
- 常用方法
GET,POST,HEAD
- 其他方法
OPTIONS,PUT,DELETE,TRACE和CONNECT
ES 常用
- PUT — 增
- DELETE — 删
- POST — 改
- GET — 查
系统命令 curl
- 在linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持多种请求模式,自定义请求头等强大功能,是一款综合工具
- curl 常用参数介绍
-A
修改请求 agent
-X
设置请求方法
-i
显示返回头信息
RESTful API 调用
- Elasticsearch提供了一系列RESTful的API
- 检查集群、节点、索引的健康度、状态和统计
- 管理集群、节点、索引的数据及元数据
- 对索引进行CRUD操作及查询操作
- 执行其他高级操作如分页、排序、过滤等
- POST或PUT数据使用json格式
JSON
- JSON(JavaScript Object Notation),意思是JavaScript对象表示法,它是一种基于文本独立于语言的轻量级数据交换格式。
- JSON格式
数组 [“aa”, “bb”, “cc”]
键值对 { key: value }
RESTful API的简单使用
- _cat API查询集群状态,节点信息
curl http://192.168.1.64:9200/_cat?
//查询所有的cat后面可以跟的节点信息
- v参数显示详细信息
http://192.168.1.64:9200/_cat/health?v
- help显示帮助信息
http://192.168.1.64:9200/_cat/health?help
- nodes 查询节点状态信息
http://192.168.1.64:9200/_cat/nodes?v
- 索引信息
http://192.168.1.64:9200/_cat/indices?v
RESTful API增加
- 创建一个索引t3,并设置分片数量与副本数量
[root@es-node5 ~]# curl -XPUT http://192.168.1.60:9200/t3 -d '{
> "settings":{
> "index":{
> "number_of_shards":5,
> "number_of_replicas":1
> }}}'
RESTful API插入数据
- (增)加数据,使用 PUT 方法
- 调用方式: 数据库地址/索引/类型/id值
[root@es-node5 ~]# curl -XPUT http://192.168.1.64:9200/t3/n1/1 -d '{
"语文":100,
"数学":105,
"理综":190,
"英语":140
}'
POST修改
- 修(改)数据,使用 POST 方法
- 在修改数据的时候必须调用 _update 关键字
- 调用方式:数据库地址/索引/类型/id值/_update
//修改索引是t3,类型为n1,id为1的数据的语文跟数学成绩
[root@es-node5 ~]# curl -XPOST http://192.168.1.64:9200/t3/n1/1/_update -d '{
> "doc":{
> "语文":140,
> "数学":145
> }
> }'
(查)查询
- 查询使用 GET 方法,GET为默认方法
- 查询显示结果时候可以用 pretty 规范显示格式
- 多条查询需要使用 _mget 关键字配合 json 调用
[root@es-node5 ~]# curl -XGET http://192.168.1.64:9200/t3/n1/1/
(删)除
- 删除时候可以是文档,也可以是库,但不能是类型
//删除t3索引下的,类型为n1的,id为1的数据
[root@es-node5 ~]# curl -XDELETE http://192.168.1.64:9200/t3/n1/1/
//删除所有的数据
root@es-node5 ~]# curl -XDELETE http://192.168.1.64:9200/*
批量导入数据
使用_bulk批量导入数据
- 批量导入数据使用POST方式,数据格式为json,url编码使用data-binary
- 导入含有index配置的json文件
# gzip –d logs.jsonl.gz
# curl -XPOST 'http://192.168.1.51:9200/_bulk' --data-binary @logs.jsonl
[root@es-node5 ~]# curl -XPOST http://192.168.1.64:9200/_bulk --data-binary @/root/elk/shakespeare.json
[root@es-node5 ~]# curl -XPOST http://192.168.1.64:9200/account/info/_bulk --data-binary @/root/elk/accounts.json
[root@es-node5 ~]# curl -XPOST http://192.168.1.64:9200/_bulk --data-binary @/root/elk/logs.jsonl
map 映射
mapping:
- 映射:创建索引的时候,可以预先定义字段的类型及相关属性
- 作用:这样会让索引建立得更加的细致和完善
- 分类:静态映射和动态映射
- 动态映射:自动根据数据进行相应的映射
- 静态映射:自定义字段映射数据类型