ELK日志分析平台搭建

一、使用背景

当生产环境有很多服务器、很多业务模块的日志需要每时每刻查看时

二、环境

系统:centos 6.5

JDK:1.8,下载地址
配置环境变量

JAVA_HOME=/usr/local/src/jdk1.8
export JAVA_HOME
export JAVA_BIN=/usr/local/src/jdk1.8/bin/
export PATH=$PATH:$JAVA_HOME/bin/
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

软件包下载
Elasticsearch-5.0.0

Logstash-5.0.0

kibana-5.0.0

配置limit相关参数

[root@localhost local]# vim /etc/security/limits.conf
添加以下内容

* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536

创建运行ELK的用户

[root@localhost local]# groupadd elk

[root@localhost local]# useradd -g elk elk

创建ELK运行目录

[root@localhost local]# mkdir /elk
[root@localhost local]# chown -R elk:elk /elk

配置Elasticsearch

network.host: 192.168.20.216
#
# Set a custom port for HTTP:
#
http.port: 9200
#

启动Elasticsearch

bin/elasticsearch &

关闭防火墙:

[root@localhost ~]# iptables -F
碰到的常见问题
问题一:

Java.lang.UnsupportedOperationException: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled in
at org.elasticsearch.bootstrap.Seccomp.linuxImpl(Seccomp.java:349) ~[elasticsearch-5.0.0.jar:5.0.0]
at org.elasticsearch.bootstrap.Seccomp.init(Seccomp.java:630) ~[elasticsearch-5.0.0.jar:5.0.0]

报了一大串错误,其实只是一个警告。

解决:使用心得Linux版本,就不会出现此类问题了。

参考:http://www.cnblogs.com/sloveling/p/elasticsearch.html

问题二:ERROR: bootstrap checks failed

max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
max number of threads [1024] for user [lishang] likely too low, increase to at least [2048]

解决:切换到root用户,编辑limits.conf 添加类似如下内容

vi /etc/security/limits.conf 

添加如下内容:

* soft nofile 65536

* hard nofile 131072

* soft nproc 2048

* hard nproc 4096

问题三

max number of threads [1024] for user [lish] likely too low, increase to at least [2048]

解决:切换到root用户,进入limits.d目录下修改配置文件。

vi /etc/security/limits.d/90-nproc.conf 

修改如下内容:

#修改为
* soft nproc 2048

问题四:max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

解决:切换到root用户修改配置sysctl.conf

vi /etc/sysctl.conf 

添加下面配置:

vm.max_map_count=655360

并执行命令:

sysctl -p

问题五:启动异常:

ERROR: bootstrap checks failed
system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk

问题原因:因为Centos6不支持SecComp,而ES5.2.1默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动。详见 :https://github.com/elastic/elasticsearch/issues/22899

解决方法:在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:

bootstrap.memory_lock: false
bootstrap.system_call_filter: false

安装logstash

logstash是ELK中负责收集和过滤日志的

input {
  stdin {
    type => "human"
  }
}

output {
  stdout {
    codec => rubydebug
  }

  elasticsearch {
        hosts => "192.168.20.216:9200"
  }
}

logstash的配置文件须包含三个内容:

input{}:此模块是负责收集日志,可以从文件读取、从redis读取或者开启端口让产生日志的业务系统直接写入到logstash

filter{}:此模块是负责过滤收集到的日志,并根据过滤后对日志定义显示字段

output{}:此模块是负责将过滤后的日志输出到elasticsearch或者文件、redis等

output直接输出到Elasticsearch

type:代表类型,其实就是将这个类型推送到Elasticsearch,方便后面的kibana进行分类搜索,一般直接命名业务系统的项目名

path:读取文件的路径

安装kibana

修改配置文件
vim config/kibana.yml

server.port: 5602
server.host: "192.168.20.216"
elasticsearch.url: "http://192.168.20.216:9200"

运行


[test@www kibana-5.4.0-linux-x86_64]$ bin/kibana


centos 7 elasticsearch.yaml

cluster.name: elk_myapplication
#这是集群名字,我们 起名为 elasticsearch
#es启动后会将具有相同集群名字的节点放到一个集群下。
node.name: node-01
#节点名字。
node.master: true
node.data: true
path.data: /opt/elk1-data/data
path.logs: /opt/elk1-data/logs
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["172.17.0.7:9300","172.17.0.7:9301","172.17.0.7:9302"]
#discovery.zen.ping.unicast.hosts:["节点1的 ip","节点2 的ip","节点3的ip"]
#指明集群中其它可能为master的节点ip,
#以防es启动后发现不了集群中的其他节点。
#第一对引号里是node1,默认端口是9300,
#第二个是 node2 ,在另外一台机器上,
#第三个引号里是node3,因为它和node1在一台机器上,所以指定了9301端口。
#discovery.zen.ping.multicast.enabled: true
#设置是否打开多播发现节点,默认是true。
discovery.zen.minimum_master_nodes: 2
#指定集群中的节点中有几个有master资格的节点。
discovery.zen.ping.timeout: 40s
#默认是3s,这是设置集群中自动发现其它节点时ping连接超时时间
http.cors.enabled: true
http.cors.allow-origin: "*"
bootstrap.memory_lock: false
bootstrap.system_call_filter: false

虽然Elasticsearch需要很少的配置,但是有一些设置需要手动配置,并且必须在进入生产之前进行配置。

path.data  and path.logs
cluster.name
node.name
bootstrap.memory_lock
network.host
discovery.zen.ping.unicast.hosts
discovery.zen.minimum_master_nodes
path.data and path.logs

如果您正在使用.zip或.tar.gz文件归档,data和logs 目录在 $ES_HOME 下。如果这些重要文件夹保留在默认位置,则Elasticsearch升级到新版本时,很有可能被删除。

在生产中使用,肯定要更改数据和日志文件夹的位置:

path:
  logs: /var/log/elasticsearch
  data: /var/data/elasticsearch

RPM和Debian的安装包已经使用了自定义的data和logs路径。

path.data 选项可以同时指定多个路径,所有的路径都会被用来存储数据(但所有属于同一个分片的文件,都会全部保存到同一个数据路径)

path:
  data:
    - /mnt/elasticsearch_1
    - /mnt/elasticsearch_2
    - /mnt/elasticsearch_3

cluster.name
某个节点只有和集群下的其他节点共享它的 cluster.name 才能加入一个集群。默认是elasticsearch,但是应该修改为更恰当的,用于描述集群目的的名称。

cluster.name: logging-prod
一定要确保不要在不同的环境中使用相同的集群名称。否则,节点可能会加入错误的集群中。

cluster.name
默认情况下,Elasticsearch 将使用随机生成的uuid的前7个字符作为节点id,请注意,节点ID是持久化的,并且在节点重新启动时不会更改,因此默认节点名称也不会更改。

推荐为节点配置更有意义的名称。

node.name: prod-data-2
也可以使用服务器的 HOSTNAME 作为节点的名称。

node.name: ${HOSTNAME}
bootstrap.memory_lock
由于当jvm开始swapping时es的效率会降低,所以要保证它不swap,这对节点健康极其重要。实现这一目标的一种方法是将 bootstrap.memory_lock 设置为true。

要使此设置有效,首先需要配置其他系统设置。有关如何正确设置内存锁定的更多详细信息,请参阅启用bootstrap.memory_lock。

network.host
默认情况下,Elasticsearch 仅仅绑定回环地址,比如127.0.0.1 和[::1] 。这足以在服务器上运行单个开发节点。

事实上,一台机器上可以启动多个节点。这可对于测试Elasticsearch集群的能力很有用,但不推荐用于生产。

为了与其他服务器上的节点进行通信并形成集群,你的节点将需要绑定到非环回地址。虽然这里有很多网络相关的配置,但通常只需要配置一下 network.host

network.host: 192.168.1.10
network.host 设置一些特殊值也是可以的,比如 local, site, global ,ip4,ip6。更多详情请参考 “Special values for network.host”.

一旦自定义设置了 network.host ,Elasticsearch 会假定你正在从开发模式转移到生产模式,并将许多系统启动检查从警告升级到异常。有关详细信息,请参阅“Development mode vs production mode”。

discovery.zen.ping.unicast.hosts
开箱即用,没有任何网络配置情况下,Elasticsearch将绑定到可用的回环地址,并会扫描端口9300至9305以尝试连接到同一服务器上运行的其他节点。这提供了一个自动集群体验,而无需执行任何配置。

如果想和其他服务器的节点形成一个集群,你必须提供集群中其它节点的列表。可以通过以下方式指定:

discovery.zen.ping.unicast.hosts:
   - 192.168.1.10:9300
   - 192.168.1.11 
   - seeds.mydomain.com 

如果没有指定端口,将默认为 transport.profiles.default.port 并回退 transport.tcp.port 。

如果输入的是主机名,被解析成多个地址,将会尝试连接所有地址。

discovery.zen.minimum_master_nodes
为了防止数据丢失, discovery.zen.minimum_master_nodes 配置至关重要, 以便每个候选主节点知道为了形成集群而必须可见的最少数量的候选主节点。

没有这种设置,遇到网络故障的群集有可能将群集分成两个独立的群集(脑裂), 这将导致数据丢失。更详细的解释在“Avoiding split brain with minimum_master_nodes ” 中提供。

为了避免脑裂,候选主节点的数量应该设置为:

(master_eligible_nodes / 2) + 1
换句话说,如果现在有3个节点,最小候选主节点数应该是(3/2)+1=2:

discovery.zen.minimum_master_nodes: 2
posted @ 2017-05-19 10:26  xiaoganghu  阅读(253)  评论(0编辑  收藏  举报