文章目录
分布式ELK平台
ELK简介
来源
在微服务开发过程中,一般都会利用多台服务器做分布式部署,如何能够把分散在各个服务器中的日志归集起来做分析处理,是一个微服务服务需要考虑的一个因素。
什么是ELK
- ELK是日志分析平台,不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,ELK分别代表:
– Elasticsearch:负责日志检索和储存
– Logstash:负责日志的收集和分析、处理
– Kibana:负责日志的可视化 - 这三款软件都是开源软件,通常是配合使用,而且又先后归于Elastic.co公司名下.故被简称为ELK
ELK能做什么
- ELK组件在海量日志系统的运维中,可用于解决
– 分布式日志数据集中式查询和管理
– 系统监控,包括系统硬件和应用各个组件的监控
– 故障排查
– 安全信息和事件管理
– 报表功能
Elasticsearch
主要特点
– 实时分析
– 分布式实时文件存储,并将每一个字段都编入索引
– 文档导向,所有的对象全部是文档
– 高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards和Replicas)
– 接口友好,支持JSON
ES缺点
– Elasticsearch没有典型意义的事务
– 是一种面向文档的数据库
– 没有提供授权和认证特性
相关概念
– Node: 装有一个ES服务器的节点
– Cluster: 有多个Node组成的集群
– Document: 一个可被搜索的基础信息单元
– Index: 拥有相似特性的文档的集合
– Type: 一个索引中可以定义一种或多种类型
– Filed: 是ES的最小单位,相当于数据的某一列
– Shards: 索引的分片,每一个分片就是一个Shard
– Replicas: 索引的拷贝
ES与关系型数据库的对比
– 在ES中,文档归属一种类型(type), 而这些类型存在于索引(index)中,类比传统关系型数据库
DB -> Databases -> Tables -> Rows -> Columns
关系型 数据库 表 行 列
ES -> Indices -> Types -> Dcuments -> Fields
ES 索引 类型 文档 域(字段)
Relational database | Elasticsearch |
---|---|
Database | index |
Table | Type |
Row | Document |
Column | Field |
Schema | Mapping |
Index | Everything is indexed |
SQL | Query DSL |
SELECT * FROM table… | GET http://… |
UPDATE table SET | PUT http://… |
Elasticsearch架构图
ES集群安装
- 主机名
- IP地址
- /etc/hosts配置主机名解析
- yum源 CentOS7-1804.iso 和
[admin@192.168.1.254 ~]$ ls /var/ftp/elk
kibana-4.5.2-1.x86_64.rpm logstash-2.3.4-1.noarch.rpm
repodata filebeat-1.2.3-x86_64.rpm
-
安装JDK
– 要求至少java 7
– 推荐openjdk 1.8 -
在es1上
vim /etc/yum.repos.d/local.repo
[local_repo]
name=CentOS-Base
baseurl="ftp://192.168.1.254/system"
enabled=1
gpgcheck=0
[elk]
name=elk
baseurl="ftp://192.168.1.254/elk"
enabled=1
gpgcheck=0
yum -y install java-1.8.0-openjdk.x86_64
java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
sestatus //查看selinux状态
SELinux status: disabled
yum -y install elasticsearch
vim /etc/elasticsearch/elasticsearch.yml
17 cluster.name: myelk #配置集群名字
23 node.name: es1 #当前主机名称
54 network.host: 0.0.0.0 #0.0.0.0(监听所有地址)
68 discovery.zen.ping.unicast.hosts: ["es1", "es2", "es3"]
//声明集群里的主机成员有谁,不需要全部写进去
systemctl restart elasticsearch
systemctl enable elasticsearch
ss -antup | grep 9200
ss -antup | grep 9300
- 查看是否成功
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
使用ansible部署ES集群
ansible的安装部署请查看ansible基础及部署
vim elk.yml
---
- name: 批量部署elk
hosts: es
tasks:
- name: 配置yum源
copy:
src: /etc/yum.repos.d/local.repo
dest: /etc/yum.repos.d/local.repo
- name: 配置主机名
copy:
src: /etc/hosts
dest: /etc/hosts
- name: 安装jdk
yum:
name: java-1.8.0-openjdk
state: installed
- name: 安装elasticsearch
yum:
name: elasticsearch
state: installed
- name: 修改elk配置文件
copy:
src: /etc/elasticsearch/elasticsearch.yml
dest: /etc/elasticsearch/elasticsearch.yml
- replace:
path: /etc/elasticsearch/elasticsearch.yml
regexp: 'es1$'
replace: "${HOSTNAME}"
#或者 replace: "{{inventory_hostname}}"
- service:
name: elasticsearch.service
state: started
enabled: yes
- 测试
firefox http://192.168.1.51:9200/_cluster/health?pretty
ES插件使用
head插件
kopf插件
bigdesk插件
安装
插件装在哪一台机器上,只能在哪台机器上使用(这里安装在es5机器上面)
cd /usr/share/elasticsearch/bin
./plugin install \
ftp://192.168.1.254/elk/elasticsearch-head-master.zip #安装head插件
./plugin install \
ftp://192.168.1.254/elk/elasticsearch-kopf-master.zip #安装kopf插件
./plugin install \
ftp://192.168.1.254/elk/bigdesk-master.zip
#安装bigdesk插件
./plugin list #查看安装的插件
Installed plugins in /usr/share/elasticsearch/plugins:
- head
- kopf
- bigdesk
访问head插件
firefox http://192.168.1.55:9200/_plugin/head
访问kopf插件
firefox http://192.168.1.55:9200/_plugin/kopf
访问bigdesk插件
firefox http://192.168.1.55:9200/_plugin/bigdesk
使用head创建index
curl -X PUT "http://192.168.1.55:9200/index" -d '
> {
> "settings":{
> "index":{
> "number_of_shards":5, #分片数
> "number_of_replicas":1 #副本数
> }
> }
> }'
{"acknowledged":true}
扩展插件
RESTful API
HTTP协议简介
- http请求由三部分组成
- 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对象表达法,它是一种基于文本独立于语言的轻量级数据交换格式 - RESTful API的简单使用
– _cat API查询集群状态,节点信息
– v参数显示详细信息
curl http://192.168.1.51:9200/_cat/health?v
— help显示帮助信息
curl http://192.168.1.51:9200/_cat/health?help
– nodes查询节点状态信息
curl http://192.168.1.51:9200/_cat/nodes?v
– 索引信息
curl http://192.168.1.51:9200/_cat/indices?v
增加数据
curl -X PUT "http://192.168.1.55:9200/tedu/teacher/1" -d '{
"职业":"诗人",
"名字":"李白",
"称号":"诗仙",
"年代":"唐"
}'
{"_index":"tedu","_type":"teacher","_id":"1","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}
修改数据
curl -X PUT "http://192.168.1.55:9200/tedu/teacher/1" -d '{
"doc":{
"年代": "唐代"
}
}'
{"_index":"tedu","_type":"teacher","_id":"1","_version":3,"_shards":{"total":2,"successful":2,"failed":0},"created":false}
或者
curl -X POST "http://192.168.1.55:9200/tedu/teacher/1/_update" -d '{
"doc":{
"年代": "唐代"
}
}'
{"_index":"tedu","_type":"teacher","_id":"1","_version":3,"_shards":{"total":2,"successful":2,"failed":0},"created":false}
查询数据
curl -X GET "http://192.168.1.55:9200/tedu/teacher/3?pretty"
{
"_index" : "tedu",
"_type" : "teacher",
"_id" : "3",
"found" : false
}
删除数据
curl -X DELETE "http://192.168.1.55:9200/tedu/teacher/3?pretty"
{
"found" : false,
"_index" : "tedu",
"_type" : "teacher",
"_id" : "3",
"_version" : 1,
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
}
}
删除索引
curl -X DELETE http://192.168.1.55:9200/tedu/ #删除索引
{"acknowledged":true}
curl -X DELETE http://192.168.1.65:9200/* #删除所有索引
{"acknowledged":true}
导入数据
gzip -d logs.jsonl.gz
curl -X POST "http://192.168.1.51:9200/_bulk" \
--data-binary @logs.jsonl