ELK已经升级到6了,希望使用6的同学,可以查看Ken同学的这篇文章
参考:
ELK部署详解
centos7虚拟机安装elasticsearch5.0.x-安装篇
logstash-best-practice-cn
官网
0 前言
本文主要是基于参考第一篇ELK部署详解所写。另起一篇的目的主要是ELK目前已更新到5.1,原文的一些地方需要改动;而是正如作者所言,ELK的部署文章非常少,而更新到5.1的更是少,正是作者的无私奉献,自己才能很快完成绝大部分的部署。故也将自己的部署过程结合发布,尽量记录成all in one,希望能够帮助到以后的童鞋部署。
服务器环境:
- 主机:2(elk1, elk2)
- 系统:CentOS7 Ubuntu 16.04
- 配置:1c2g
- 网络: 互通(elk1-192.168.204.133, elk2-192.168.204.129)
- ELK版本:elasticsearch-5.1 kibana-5.1 logstash-5.1 logstash-forwarder-0.4.0 redis-3.2
1 安装
1.1 java1.8安装
注意java1.8是必须安装的版本选择正确的版本,CentOS7和Ubuntu16.04都是64位,如果是老版本的操作系统,注意查下操作系统的位数,然后下载对应的jdk。下载地址
0) 安装前如果是centos的话,需要先删掉对应open-jdk。
1) 对于Centos可以使用rpm下载进行安装。(提示:wget会很慢,可以用下载工具或者去CSDN下载)
2)Ubuntu的话,没有deb直接安装,但使用tar安装发现更简单:
- 下载后,解压,比如jdk-8u111-linux-x64.tar.gz:
tar -zvxf jdk-8u111-linux-x64.tar.gz
- 移动目录,比如
/usr/java
(**如果不是root用户,需使用sudo执行。同时所有的安装最好不要直接使用root用户 **):
mv jdk1.8.0_111 /usr/java/
- 修改
/usr/java
目录权限(之后的elasticsearch和logstash会放在这个路径下,原因后续说明)
sudo chgrp -R YourUsername /usr/java/
sudo chown -R YourUsername /usr/java
- 配置环境变量:
CentOS7(使用tar包安装):比如使用bash,vim ~/.bash_profile
export JAVA_HOME=/usr/java/jdk1.8.0_111 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
Ubuntu16.04:vim ~/.profile
export JAVA_HOME=/usr/java/jdk1.8.0_111 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
(修改完注意登出,或者使用source 配置文件
生效) - 测试java版本:
java -version
1.2 安装elasticsearch
本次安装是两台,elk1作为主节点,elk2为从节点。
如果是新手,建议下载TAR或者ZIP,然后mv
到/usr/java
(原因是如果直接系统起,你发现启动了,但是好像不能访问啊。。。我最开始拿的CentOS7安装rpm,发现elasticsearch和logstash都不好使。而TAR启动的是bin下的可执行文件,即使出现错误,也会有一些提示信息;另外,这种方式,配置文件都在路径下,所以很方便修改配置;而在/etc
下,很容易改错位置,也不易记住)
es下载地址
下载完依次:
1) 解压,并移至/usr/java/
:
unzip elasticsearch-5.1.1.zip
mv elasticsearch-5.1.1 /usr/java
2) 进入/usr/java/elasticsearch-5.1.1
,在config
路径下编辑elasticsearch.yml(配置是yml文件,不是elasticsearch.conf):
主节点的配置:
node.name: elk-node-1
network.host: elk1
node.master: true
discovery.zen.ping.unicast.hosts: ["elk1", "elk2"]
(注意:node.name只是一个逻辑名称,两台不一样即可;如果也想像上面network.host是一个逻辑名字,请在hosts文件进行配置才能使用;否则,请老老实实写本机IP)
从节点的配置:
node.name: elk-node-2
network.host: elk2
node.master: false
discovery.zen.ping.unicast.hosts: ["elk1", "elk2"]
(题外:我稍微看了下官方doc,其实默认node.master的true,在es集群启动的时候,第一台作为主节点,来进行自动管理。)
3)启动elasticsearch:
cd /usr/java/elasticsearch-5.1.1 ./bin/elasticsearch
4)如果不设置,第一次会报一些错误,见参考[centos7虚拟机安装elasticsearch5.0.x-安装篇](呵呵,RPM就不会这么直接了。所以到这里,希望能理解为什么直接用tar或者zip直接安装。还是讲清楚场景,自己开发调试这么可以,生产环境还是要做好系统启动的配置):
- vm.max_map_count需要调大:
临时修改vm.max_map_count:sudo sysctl -w vm.max_map_count=262144
永久:sudo 编辑 /etc/sysctl.conf,增加vm.max_map_count=262144
- 修改JVM内存(默认2g,我改为1g),
sudo vim /usr/java/elasticsearch/config/jvm.options
-Xms1g -Xmx1g
- 应用打开文件数不够大:
vim /etc/security/limits.conf
YourUsername hard nofile 65536 YourUsername soft nofile 65536
重新按照3)启动elasticsearch
如果启动发现正常,但是curl测试不通(默认es端口是9200),可能是:
① 有可能network.host
配置的是127.0.0.1
,官方有解释道这样的话es只监听接收本地的9200端口,如果只是单机,可以修改为0.0.0.0
,则可监听本地所有地址的请求。
② 如果是虚机,而且是VirtualBox的话,注意开下防火墙,不然主机即使映射,也没办法联通。
5)检测是否启动成功的方法
① 检测是否可以访问:curl -XGET 'elk1:9200/?pretty'
,成功返回:
{
"name" : "elk-node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "fU1cY9L2RGO_QHbDNj_Q3A",
"version" : {
"number" : "5.1.1",
"build_hash" : "5395e21",
"build_date" : "2016-12-06T12:36:15.409Z",
"build_snapshot" : false,
"lucene_version" : "6.3.0"
},
"tagline" : "You Know, for Search"
}
② 检测系统状态:curl -XGET 'elk1:9200/_cat/health?v&pretty'
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1483811310 01:48:30 elasticsearch green 2 2 12 6 0 0 0 0 - 100.0%
③ 检测单一节点状态:curl -XGET 'elk1:9200/_cat/nodes?v&pretty'
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.204.133 9 85 9 0.03 0.08 0.06 mdi * elk-node-1
192.168.204.129 9 96 0 0.00 0.00 0.00 di - elk-node-2
启动的日志可以在/usr/java/elasticsearch-5.1.1/logs
下查看
1.3 Kibana安装
下载地址
1) Kibana我只安装单机,直接使用yum 安装rpm包
2)配置:可以参考配置以下(技巧:如果和默认配置一致,则那项内容可以不进行配置。比如我实际只配置了下面的elasticsearch.url和server.host参数):
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://elk1:9200"
1.4 redis安装
① redis由于我已安装,我觉得tar包下载再安装比较麻烦,而我直接使用yum和apt-get进行安装:
CentOS7:可以从rpmfind下载redis3的包redis-3.2.6-1.el7.remi.x86_64.rpm
Ubuntu16.04:sudo apt-get install redis-server
② 然后启动redis, sudo service redis start
③检查:redis-cli
是否连通本地server
1.5 安装logstash
这个图必须说一下,因为看文档你会经常看到logstash pipline,具体这个是什么,这个图一看就明白:
下载地址
下载完依次:
1) 老样子,解压并
mv
到/usr/java下
2) 为logstash-forwarder进行免密配置:
①
vim /etc/pki/tls/openssl.cnf
:# 这块如果是多个,可以写成IP1:xxx, IP2:xxx...;注意是在[ v3_ca ]的后面编辑,而不是其他位置 subjectAltName = IP: 127.0.0.1
②生成证书:
$cd /etc/pki/tls $sudo openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
如果在后面的logstash-forwarder报错:
Failed to tls handshake with 127.0.0.1 x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs
,一定注意回去检查①中的IP配置是否写在[ v3_ca ]
③如果logstash和logstash-forwarder不是一台机器,需要将生产的证书从logstash拷贝到logstash-forwarder的机器上:
scp private/logstash-forwarder.key root@target_server_ip:/etc/pki/tls/private
scp certs/logstash-forwarder.crt root@target_server_ip:/etc/pki/tls/certs
3)修改config配置,这里多说一句,其实配置就是和上图一一对应的,需要三部分INPUT、FILTER和OUTPUT。刚开始FILTER筛选可以忽略。
此外,[ELK]部署详解原文,配置了两个,其实相当于上图串行了两个logstash pipline。(千万不要认为redis-input是input,redis-out是output,其实他们每一个都是一个logstash pipeline)先从logstash-forwarder到redis,然后redis再到elasticsearch。这个部分我配置出错了好几次,千万注意括号的对应关系(vim可以用shift+%
来找到对应的配置)上一份我的配置:
cd /usr/java/logstash-5.1.1/
config/redis-input.yml
input {
lumberjack {
port => 5043
type => "logs"
ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
}
}
filter{
}
output {
redis {
host => "127.0.0.1"
port => 6379
data_type => "list"
key => "logstash:redis"
}
}
config/redis-output.yml
input {
redis {
data_type => "list"
key => "logstash:redis"
host => "127.0.0.1"
port => 6379
}
}
filter{
}
output {
elasticsearch {
hosts => ["elk1:9200"]
index => "%{type}-%{+YYYY.MM.dd}"
document_type => "%{type}"
# workers => 100 出错,说不支持,暂时先去掉
template_overwrite => true
}
}
4) 所以如果你直接配置完两个,无法启动,可以依次进行启动:
cd /usr/java/logstash-5.1.1 ./bin/logstash -f config/redis-input.yml ./bin/logstash -f config/redis-output.yml
5)在[ELK]部署一节,提到自己的脚本。你可以在logstash-5.1.1的bin目录新建一个sh脚本文件,比如mylogstash.sh:
- 修改文件
conf()
函数的配置:
function conf()
{
script_name="logstash"
start_command=/usr/java/logstash-5.1.1/bin/logstash
conf_file=/usr/java/logstash-5.1.1/config/redis-input.yml
output_conf=/usr/java/logstash-5.1.1/config/redis-output.yml
log_path=/usr/java/logstash-5.1.1/logs/logstash_output.log
log_input_path=/usr/java/logstash-5.1.1/logs/logstash_input.log
works=2
}
- 赋予执行权限
chmod u+x mylogstash.sh
,然后就可以用比如path/to/logstash/bin/mylogstash.sh [start|stop|...]进行一键操作
6)而外,如果配置完理解的话,发现logstash重要的是配置input、output(filter其实也很常用),在logstash中称为plugins,可以在官方logstash的doc右侧目录,查找input output filter进行查询。
1.6 logstash-forwarder
为什么要用Logstash Forwarder呢?看过logstash-best-practice-cn这节就明白是为了增加安全性。
1) 下载相关
官方的默认都下载链接到logstash,所以需要github看方法进行安装。
2) 配置:看配置是用于文件的监控,以下是监控logstash和nginx的日志:
/etc/logstash-forwarder.conf
{
# The network section covers network configuration :)
"network": {
# A list of downstream servers listening for our messages.
# logstash-forwarder will pick one at random and only switch if
# the selected one appears to be dead or unresponsive
"servers": [ "127.0.0.1:5043" ],
# The path to your client ssl certificate (optional)
#"ssl certificate": "./logstash-forwarder.crt",
#"ssl certificate": "/etc/pki/tls/certs/logstash-forwarder.crt",
# The path to your client ssl key (optional)
"ssl key": "/etc/pki/tls/private/logstash-forwarder.key",
# The path to your trusted ssl CA file. This is used
# to authenticate your downstream server.
"ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt",
# Network timeout in seconds. This is most important for
# logstash-forwarder determining whether to stop waiting for an
# acknowledgement from the downstream server. If an timeout is reached,
# logstash-forwarder will assume the connection or server is bad and
# will connect to a server chosen at random from the servers list.
"timeout": 15
},
# The list of files configurations
"files": [
# An array of hashes. Each hash tells what paths to watch and
# what fields to annotate on events from those paths.
{
"paths": [ "/var/log/message.log"],
"fields": { "type": "logstash" }
},
{
"paths": [ "/var/log/nginx/access.log"],
"fields": { "type": "web1_nginx" }
}
#{
#"paths": [
# single paths are fine
#"/var/log/messages",
# globs are fine too, they will be periodically evaluated
# to see if any new files match the wildcard.
#"/var/log/*.log"
#],
# A dictionary of fields to annotate on each event.
#"fields": { "type": "syslog" }
#}, {
# A path of "-" means stdin.
#"paths": [ "-" ],
#"fields": { "type": "stdin" }
#}, {
#"paths": [
#"/var/log/apache/httpd-*.log"
#],
#"fields": { "type": "apache" }
#}
]
}
3) 启动(我是在CentOS上使用,所以使用sudo service logstash-forwarder start
)
4)题外:看官方推荐使用的叫beats,看配置和forwarder非常像,所以有兴趣可以研究下。
1.7 nginx的安装配置
这个按照[ELK部署详解]原文的安装并配置nginx用于HTTP访问进行配置即可。