ElasticSearch
一个完整的集中式日志系统, 需要包含以下几个主要特点:
• 收集-能够采集多种来源的日志数据
• 传输-能够稳定的把日志数据传输到中央系统
• 存储-如何存储日志数据
• 分析-可以支持 UI 分析
• 警告-能够提供错误报告, 监控机制(ElastAlert)
ELK能够完美的解决上述问题
ELK提供了一整套解决方案, 并且都是开源软件, 之间互相配合使用, 完美衔接, 高效的满足了很多场合的应用,是目前主流的日志系统
ELK由ElasticSearch、Logstash和Kibana三个开源工具组成:
1)ElasticSearch
ElasticSearch是一个基于Lucene的开源分布式搜索服务器
特点:
- 分布式, 零配置, 自动发现, 索引自动分片, 索引副本机制, restful风格接口, 多数据源, 自动搜索负载等
- 它提供了一个分布式多用户能力的全文搜索引擎, 基于RESTful web接口,Elasticsearch是用Java开发的, 并作为Apache许可条款下的开放源码发布
- 设计用于云计算中, 能够达到实时搜索, 稳定, 可靠, 快速, 安装使用方便
2)Logstash
Logstash是一个完全开源工具, 可以对你的日志进行收集、过滤、分析
一般为c/s架构, client端安装在需要收集日志的主机上, server端负责将收到的各节点日志进行过滤、修改等操作再一并发往elasticsearch上去
3)Kibana
Kibana 是一个基于浏览器页面的Elasticsearch前端展示工具, 也是一个开源和免费的工具
Kibana可以为 ElasticSearch 提供日志分析友好的 Web 界面, 可以帮你汇总、分析和搜索重要数据日志
部署
版本要进行统一
- 配置java环境
tar -xf jdk-8u181-linux-x64.tar.gz -C /usr/local/
ln -s /usr/local/jdk1.8.0_181/ /usr/local/java
vim /etc/profile.d/java.sh
. /etc/profile.d/java.sh
- 解压elasticsearch
tar xf elasticsearch-6.4.1.tar.gz -C /usr/local/
ln -s /usr/local/elasticsearch-6.4.1/ /usr/local/es
useradd es #创建es用户 不可使用root运行
chown es.es -R /usr/local/es/
echo "1" |passwd --stdin es
- 配置文件
cd /usr/local/es/
vim config/elasticsearch.yml
cluster.name: es-cluster # 集群名称,各节点配成相同的集群名称
node.name: es1 # 节点名称,各节点配置不同。
node.master: true # 指示某个节点是否符合成为主节点的条件
node.data: true # 指示节点是否为数据节点。数据节点包含并管理索引的一部分
path.data: /data/es/data # 数据存储目录
path.logs: /data/es/logs # 日志存储目录
bootstrap.memory_lock: true # 内存锁定,是否禁用交换
network.host: 0.0.0.0 # 绑定节点IP
http.port: 9200 # rest api端口
discovery.zen.ping.unicast.hosts: ["es1", "es2"] # 提供其他 Elasticsearch 服务节点的单点广播发现功能
#bootstrap.system_call_filter 系统调用过滤器。
#discovery.zen.minimum_master_nodes 集群中可工作的具有Master节点资格的最小数量,官方的推荐值是(N/2)+1,其中N是具有master资格的节点的数量。
#discovery.zen.ping_timeout 节点在发现过程中的等待时间。
#discovery.zen.fd.ping_retries 节点发现重试次数。
#http.cors.enabled 是否允许跨源 REST 请求,用于允许head插件访问ES。
#http.cors.allow-origin 允许的源地址
配置es-data
在master的基础上作如下修改:
node.name: es2
node.master: false
node.data: true
启动服务
su - es
$ /usr/local/es/bin/elasticsearch -d # 参数 -d 后台运行
#查看端口进行验证是否正常启动:
netstat -tnpl
tcp6 0 0 :::9200 :::* LISTEN
tcp6 0 0 :::9300 :::* LISTEN
查看集群健康状况
curl IP:9200/_cluster/health?pretty
{
"cluster_name" : "my-es",
"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
}
• number_of_nodes 和 number_of_data_nodes 这个命名完全是自描述的。
• active_primary_shards 指出你集群中的主分片数量。这是涵盖了所有索引的汇总值。
• active_shards 是涵盖了所有索引的所有分片的汇总值,即包括副本分片。
• relocating_shards 显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是0,不过在ES发现集群不太均衡时,该值会上涨。
比如说:添加了一个新节点,或者下线了一个节点。
• initializing_shards 是刚刚创建的分片的个数。比如,当你刚创建第一个索引,分片都会短暂的处于 initializing 状态。
这通常会是一个临时事件,分片不应该长期停留在 initializing 状态。
你还可能在节点刚重启的时候看到 initializing 分片:当分片从磁盘上加载后,它们会从 initializing 状态开始。
• unassigned_shards 是已经在集群状态中存在的分片,但是实际在集群里又找不着。通常未分配分片的来源是未分配的副本。
比如,一个有5分片和1副本的索引,在单节点集群上,就会有5个未分配副本分片。
如果你的集群是 red 状态,也会长期保有未分配分片(因为缺少主分片)。
颜色状态:
- green - 所有的主分片和副本分片都正常运行.
- yellow - 所有的主分片都正常运行,但不是所有的副本分片都正常运行.
- red - 有主分片没能正常运行.
启动时遇到问题
解决方法: 使用普通用户运行
max number of threads [3818] for user [es] is too low, increase to at least [4096]
解决方法:主机物理内存小于2G,加内存!
问题[1]: 进程最大可同时打开文件数太小,至少要65536
解决方法:
# echo “elk soft nofile 65536” >> /etc/security/limits.conf
# echo “elk hard nofile 65536” >> /etc/security/limits.conf
# su - elk
$ ulimit -n
65536
问题[2]: 请求锁内存失败,系统默认能让进程锁住的最大内存为64k
解决方法:
# echo “elk soft memlock unlimited” >> /etc/security/limits.conf
# echo “elk hard memlock unlimited” >> /etc/security/limits.conf
问题[3]: elk用户拥有的内存权限太小了,至少需要262114
解决方法:
# echo vm.max_map_count=262144 >> /etc/sysctl.conf
# sysctl -p
vm.max_map_count = 262144
插件安装
需要用到的工具:
bzip2
unzip
安装插件包:
插件下载地址: https://github.com/mobz/elasticsearch-head
node下载地址: https://npm.taobao.org/mirrors/node/latest-v10.x/node-v10.0.0-linux-x64.tar.gz
#node-v10.0.0-linux-x64.tar.gz
#elasticsearch-head-master.zip
tar xf node-v10.0.0-linux-x64.tar.gz -C /usr/local/
ln -s /usr/local/node-v10.0.0-linux-x64/ /usr/local/node
vim /etc/profile.d/node.sh
export NODE_HOME=/usr/local/node
export NODE_PATH=$NODE_HOME/lib/node_modules
export PATH=$NODE_HOME/bin:$PATH
. /etc/profile.d/node.sh
node -v
unzip elasticsearch-head-master.zip -d /usr/local/
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install -g grunt-cli
cnpm install
cd /usr/local/elasticsearch-head-master
vim Gruntfile.js
connect: {
server: {
options: {
hostname: 'IP', #添加此项
port: 9100,
base: '.',
keepalive: true
}
}
}
grunt server & #挂入后台运行即可
su - es
/usr/local/es/bin/elasticsearch
随后浏览器访问http://IP:9100