一,ELK简介
-
什么是ELK
ELK是一套日志管理的解决方案,是一套集中式日志收集系统
– Elasticsearch:负责日志检索和储存
– Logstash:负责日志的收集和分析、处理
- Shipper:发送事件(events)至 LogStash;通常,远程代理端(agent)只需要运行这个
组件即可;
- Broker and Indexer:接收并索引化事件;
- Search and Storage:允许对事件进行搜索和存储;
- Web Interface:基于 Web 的展示界面
正是由于以上组件在 LogStash 架构中可独立部署,才提供了更好的集群扩展性。
– Kibana:负责日志的可视化
2. ELK 能做什么
ELK组件在海量日志系统的运维中,可用于解决:
– 分布式日志数据集中式查询和管理
– 系统监控,包含系统硬件和应用各个组件的监控
– 故障排查
– 安全信息和事件管理
– 报表功能
二,Elasticsearch 概述
2.1 Elasticsearch 简介
1.ElasticSearch 是一个基于 Lucene 的搜索服务器。
它提供了一个分布式多用户能力的全文搜索引擎,基
于 RESTful API 的 web 接口。
2.Elasticsearch是用Java开发的,并作为Apache许可
条款下的开放源码发布,是当前流行的企业级搜索引
擎。设计用于云计算中,能够达到实时搜索,稳定,
可靠,快速,安装使用方便
2.2 Elasticsearch 相关术语
相关概念:
1. Node: 装有一个 ES 服务器的节点。
2. Cluster: 有多个Node组成的集群
3. Document: 一个可被搜素的基础信息单元
4. Index: 拥有相似特征的文档的集合
5. Type: 一个索引中可以定义一种或多种类型
6. Filed: 是 ES 的最小单位,相当于数据的某一列
7. Shards: 索引的分片,每一个分片就是一个 Shard
8. Replicas: 索引的拷贝
2.3 Elasticsearch 主要特点
1.实时分析
2.分布式实时文件存储,并将每一个字段都编入索引
3.文档导向,所有的对象全部是文档
4.高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas)
5. 接口友好,支持 JSON
6.Elasticsearch 是一种面向文档的数据库
2.4 Elasticsearch 与关系型数据库的对比
1. 在 ES 中,文档归属于一种 类型 (type) ,而这些类型
存在于索引 (index) 中,类比传统关系型数据库
2.关系型数据库
DB -> Databases -> Tables -> Rows -> Columns
– 关系型 数据库 表 行 列
3.Elasticsearch数据库
ES -> Indices -> Types -> Documents -> Fields
– ES 索引 类型 文档 域(字段)
2.5Elasticsearch 架构图
三,ES 集群的安装
3.1 环境准备,操作系统 centos7
[root@elk-node1 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
3.2 JDK版本
官方文档写的很明确:elasticsearch 与 logstash 至少需要java 7支持,这里部署 openjdk,部署 orack 的 jdk 也可以,使用“yum provides java”
命令选取合适的版本进行安装
[root@elk-node1 ~]# yum -y install java
[root@elk-node1 ~]# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)# 节点同时安装相同版本
注,因为java是yum安装的 虽然说不用配置环境变量,但是有的应用如elasticsearch 是需要依赖JAVA_HOME等环境变量的,这就涉及到一个问题,如何找到正确的JAVA_HOME位置。
可以看到,都是一系列的软连接,最终我们配置如下环境变量,vi /etc/profile
JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.x86_64
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH[root@elk1 ~]# source /etc/profile 使配置文件生效
3.3 ELK 版本
Elasticsearch 5.2.2: https://www.elastic.co/downloads/elasticsearch
Logstash 5.2.2:https://www.elastic.co/downloads/logstash
Kibana 5.2.2:https://www.elastic.co/downloads/kibana
也可以到镜像站点下载:
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.rpm
https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.rpm
https://artifacts.elastic.co/downloads/kibana/kibana-5.2.2-x86_64.rpm
3.4虚拟机准备
2台虚拟机:
hostname: elk-node1 和 elk-node2
ip地址 192.168.174.143 和 192.168.174.135 # 内存建议大于3G
关闭防火墙 禁用SELinux
[root@elk-node1 ~]# systemctl stop firewalld
[root@elk-node1 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service. [root@elk-node1 ~]# sed -i.bak 's/=enforcing/=disabled/' /etc/sysconfig/selinux
[root@elk-node1 ~]# sed -i.bak 's/=enforcing/=disabled/' /etc/selinux/config
[root@elk-node1 ~]# setenforce 0# 时间同步
[root@elk-node1 ~]# yum install wget bash-completion ntpdate vim tree net-tools -y
[root@elk-node1 ~]# ntpdate time.windows.com
16 Feb 15:29:53 ntpdate[10694]: step time server 40.118.106.130 offset -28377.805223 sec
[root@elk-node1 ~]# hwclock -w# 配置host文件
[root@elk-node1 ~]# cat >> /etc/hosts << EOF
> 192.168.95.11 elk-node1
> 192.168.95.22 elk-node2
> EOF
#注意:两台节点同时操作
四,ELK 部署
4.1 elasticsearch 安装
注意如果无特别说明,安装部分2个节点都需要安装
http://blog.chinaunix.net/uid-26168435-id-5759443.html 详细文档
导入 elasticsearch PGP key
[root@elk-node1 ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
添加 yum 仓库
[root@elk-node1 ~]# cat > /etc/yum.repos.d/elasticsearch.repo << EOF
> [elasticsearch-5.x] > name=Elasticsearch repository for 5.x packages
> baseurl=https://artifacts.elastic.co/packages/5.x/yum
> gpgcheck=1
> gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch> enabled=1
> autorefresh=1
> type=rpm-md
> EOF
安装elasticsearch
[root@elk-node1 yum.repos.d]# yum -y install elasticsearch
或下载手动安装
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.rpm
rpm --install elasticsearch-5.2.2.rpm
检查安装
[root@elk-node1 ~]# rpm -q elasticsearch
elasticsearch-5.6.14-1.noarch
4.2 logstash 安装
logstash 安装需要jdk支持
[root@elk-node1 ~]# yum install -y logstash
或手动下载安装
Wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.rpm
4.3kibana 安装
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.2.2-x86_64.rpm
下载手动安装
[root@elk-node1 ~]# yum install -y kibana
五,管理配置elasticsearch
5.1 管理elk-node1 的elasticsearch 修改elasticsearch配置文件并授权
[root@elk-node1 ~]# grep -n '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
17:cluster.name: my-elk 判别节点是否是统一集群
23:node.name: elk-node1 节点的 hostname 33:/var/lib/elasticsearch 数据存放路径
37:path.logs: /var/log/elasticsearch 日志路径
55:network.host: 0.0.0.0 允许访问的 ip
59:http.port: 9200 端口
68:discovery.zen.ping.unicast.hosts: ["elk-node1", "elk-node2"] #集群节点发现列表,也可采用 ip 的形式
72:discovery.zen.minimum_master_nodes: 2 #集群可做 master 的最小节点数
启动elasticsearch
[root@elk-node1 ~]# systemctl daemon-reload
[root@elk-node1 ~]# systemctl start elasticsearch
[root@elk-node1 ~]# systemctl enable elasticsearch
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/sys tem/elasticsearch.service
[root@elk-node1 ~]# systemctl status elasticsearch[root@elk-node1 ~]# netstat -lnupt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 3795/java
启动 elasticsearch 过程错误解决:
memory locking requested for elasticsearch process but memory is not locked
配置了 bootstrap.memory_lock:true
内存锁定:
解决方法 1:配置 config/elasticsearch.yml ,注释掉以下内容
#bootstrap.memory_lock: true
解决方法 2:修改 CentOS7 服务配置文件, /usr/lib/systemd/system/elasticsearch.service
添加如下内容:(方法 2 参考官网解决方案
[root@elk-node1 ~]# > /var/log/elasticsearch/my-elk.log
重启服务即好:systemctl restart elasticsearch
访问 9200 端口,会把信息显示出来[root@elk-node1 ~]# curl http://192.168.174.143:9200
{
"name" : "elk-node1",
"cluster_name" : "my-elk",
"cluster_uuid" : "6FA82SrmR1mykJrej9ZVZQ",
"version" : {
"number" : "5.6.14",
"build_hash" : "f310fe9",
"build_date" : "2018-12-05T21:20:16.416Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
5.2 配置 head 插件
使用head 插件显示索引和分片情况
5.2.1,下载安装 node
去官网下载nodejs https://nodejs.org/en/download/
[root@elk-node1 ~]# cd /usr/local/src/
[root@elk-node1 src]# wget https://nodejs.org/dist/v7.5.0/node-v7.5.0-linux-x64.tar.xz[root@elk-node1 src]# tar xf node-v7.5.0-linux-x64.tar.xz -C /usr/local/ 解压到/usr/local/ 下
配置下环境变量,编辑/etc/profile.d/node.sh,添加
[root@elk-node1 src]# vim /etc/profile.d/node.sh
# set node environmentexport
NODE_HOME=/usr/local/node-v7.5.0-linux-x64
export PATH=$PATH:$NODE_HOME/bin
[root@elk-node1 src]# source /etc/profile.d/node.sh
[root@elk-node1 ~]# node -v
v7.5.0
[root@elk-node1 ~]# npm -v4.1.2
# NPM 的全称是 Node Package Manager,是随同 NodeJS 一起安装的包管理和分发工具,方便让
JavaScript 开发者下载、安装、上传以及管理已经安装的包
5.2.2 安装grunt
[root@elk-node1 ~]# npm config set registry https://registry.npm.taobao.org
[root@elk-node1 ~]# npm install -g grunt-cli
/usr/local/node-v7.5.0-linux-x64/bin/grunt -> /usr/local/node-v7.5.0-linux-x64/lib/node_modules/grunt-cli/bin/grunt
/usr/local/node-v7.5.0-linux-x64/lib
└─┬ grunt-cli@1.3.2
├── grunt-known-options@1.1.1
├── interpret@1.1.0
├─┬ liftoff@2.5.0
│ ├── extend@3.0.2
│ ├─┬ findup-sync@2.0.0
│ │ ├── detect-file@1.0.0
│ │ ├─┬ is-glob@3.1.0
│ │ │ └── is-extglob@2.1.1
│ │ ├─┬ micromatch@3.1.10
│ │ │ ├── arr-diff@4.0.0
│ │ │ ├── array-unique@0.3.2
│ │ │ ├─┬ braces@2.3.2
│ │ │ │ ├── arr-flatten@1.1.0
│ │ │ │ ├─┬ extend-shallow@2.0.1
│ │ │ │ │ └── is-extendable@0.1.1
│ │ │ │ ├─┬ fill-range@4.0.0
│ │ │ │ │ ├── extend-shallow@2.0.1
│ │ │ │ │ ├─┬ is-number@3.0.0
#grunt 是一个方便的构建工具,可以进行打包压缩、测试、执行等等的工作,5.x 里的 head 插
件就是通过 grunt 启动的;
#”-g”参数代表全局安装,一般安装到 nodejs 的”lib/node_modules”目录下;不带参数”-g”,
则是本地安装,一般安装到运行 npm 命令时所在的目录,这里就需要安装到 head 插件目录;
#如果镜像速度不理想,可提前切到国内的镜像,在安装 grunt-cli 前执行:npm config set
registry https://registry.npm.taobao.org
5.2.3,安装head 插件,下载并配置head:
[root@elk-node1 ~]# cd /var/lib/elasticsearch
[root@elk-node1 elasticsearch]# yum install -y git
[root@elk-node1 elasticsearch]# clear
[root@elk-node1 elasticsearch]# git clone git://github.com/mobz/elasticsearch-head.git
[root@elk-node1 elasticsearch]# chown -R elasticsearch:elasticsearch elasticsearch-head/
#配置 elasticsearch.yml 文件允许 head 插件跨域访问 es
vim /etc/elasticsearch/elasticsearch.yml
文件末尾添加:
http.cors.enabled: true #开启跨域访问支持,默认为 false http.cors.allow-origin: "*" #跨域访问允许的域名地址,使用正则表达式
安装head
[root@elk-node1 elasticsearch]# cd /var/lib/elasticsearch/elasticsearch-head/
[root@elk-node1 elasticsearch-head]# npm install
安装过程出错:
Error: Cannot find module '/var/lib/elasticsearch/elasticsearch-head/node_modules/phantomjs-prebuilt/install.js' 解决方法如下:
[root@elk-node1 elasticsearch-head]# npm install phantomjs-prebuilt@2.1.14 --ignore-scripts再次安装:
[root@elk-node1 elasticsearch-head]# npm installelasticsearch-head@0.0.0 /var/lib/elasticsearch/elasticsearch-head
修改 head 源码
修改服务器监听地址
目录:head/Gruntfile.js
[root@elk-node1 ~]# cd /var/lib/elasticsearch/elasticsearch-head/
[root@elk-node1 elasticsearch-head]# cp Gruntfile.js{,.bak}
[root@elk-node1 elasticsearch-head]# vim Gruntfile.js在第93增加一行 hostname:'*',或者hostname:'0.0.0.0',确保能被访问
修改连接地址:
目录:head/_site/app.js
修改 head 的连接地址(修改 4360 行),否则 head 插件不能获取节点状态信息。:
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200";
把 localhost 修改成你 es 的服务器地址,如:
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://192.168.95.11:9200";
5.2.4 启动并验证,首先开启 5.0 ES。
[root@elk-node1 ~]# systemctl status elasticsearch.service
启动nodejs
[root@elk-node1 ~]# cd /var/lib/elasticsearch/elasticsearch-head/
[root@elk-node1 elasticsearch-head]# grunt server &
[1] 5598
[root@elk-node1 elasticsearch-head]# Running "connect:server" (connect) task
Waiting forever... Started connect web server on http://localhost:9100
启动head 插件,需要到head 目录下
验证前准备:将elk-node1的 elasticsearch.yml 拷贝到 elk-node2,并修改节点名称即 node.name: elk-node2
[root@elk-node1 elasticsearch]# scp elasticsearch.yml elk-node2:/etc/elasticsearch
修改完毕保存后,elk-node2 启动 elasticsearch
[root@elk-node2 ~]# systemctl restart elasticsearch.service
[root@elk-node2 ~]# systemctl enable elasticsearch.service启动过程验证
[root@elk-node1 ~]# journalctl --unit elasticsearch
端口验证
[root@elk-node1 ~]# netstat -tunlp
查看集群、节点状态信息
节点数信息
其中* 的节点表示被选举为master
查看当前索引和分片情况:
[root@elk-node1 ~]# curl -XGET 'http://localhost:9200/_cluster/state?pretty'
集群健康状态信息:
[root@elk-node1 elasticsearch-head]# curl -XGET 'http://localhost:9200/_cluster/health?pretty'
{
"cluster_name" : "my-elk",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"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
}
浏览器访问
这个时候,访问 http://xxx:9100 就可以访问 head 插件了