1. ELK是什么
ELK是ElasticSearch,Logstash,Kibana加在一起的缩写,ElasticSearch简称ES,主要用来存储和检索数据。Logstash主要用来往ES中写入数据。Kibana主要用来展示数据。一般用这几个应用组合来搭建分布式日志系统,监控平台。
2. 为什么要使用ELK
记录系统日志,并方便检索
我在维护一个已经运行很多年的网站,一个Java WEB项目,部署在weblogic上,后台使用的是Oracle数据库,平心而论这个项目全部用开源的技术就好,根本没必要花钱用Oracle的东西,不过这种电信的遗留系统,也不能说调整就调整,呵呵扯远了。
最开始一台服务器就能跑起来了,后来访问量大了,就增加几台服务器,再配个负载均衡。问题来了,后台的日志都是打印在war包所在服务器上,系统出现问题的话需要逐个服务器查找日志文件,相当麻烦。能不能把这些分布式的日志都放到同一个地方呢?一开始有个“大神”(好像是我)想到了把日志都放到数据库-Oracle。问题是勉强解决,但是,日志本身只会不停新增,不会有更新操作,删除操作,也不会有什么一致性要求,放到关系型数据库实在是杀鸡用牛刀的感觉,于是后来就用到了这个ELK。
以往有syslogd等工具可以汇总到一台机器,但都是以文件方式,搜索不方便。Logstash可配置输出到ElasticSearch服务帮忙做搜索功能,可以做到实时的关键字搜索,作为系统管理员,这个配置非常方便。
为什么要用0.9版本? 现在都有ELK5了啊
所谓的0.9版本其实就是指ElasticSearch的0.9版本。而0.9版本是最后一个还支持JDK 1.6的版本。JDK1.6是国内第一个被大范围广泛使用的JDK版本,直到现在还有无数的项目用着1.6。 因为安装ELK的服务器正是某个电信遗留系统所在的服务器,给遗留系统升级JDK版本也不是说升级就升级的,除了技术上的工作还有大量非技术的工作,这会折腾我好多时间,所以先用0.9试试手,以后再找一台新的服务器安装最新的ELK,以便用上其更强大的功能。
3. 安装步骤
系统环境
16核 Intel(r) Xeon(R) CPU E5620 @ 2.40GHz
32G内存
Red Hat Enterprise Linux Server release 5.5 (Tikanga)
jdk1.6.0_23
Redis
Redis是什么
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
为什么要使用Redis
ELK本身并没有Redis,为什么会需要这个东东呢?
Redis在这里充当的是一个缓冲的消息队列。
- 在Java开发中,不少人会用到Logback作为日志的工具,由于Logback目前没有渠道直接把Log发到Logstash上,所以就做一个Appender,先把log发送到Redis上,然后logstash自己上redis取日志
- 提高系统稳定性,避免因网络抖动等原因突然出现大量写入日志造成阻塞。先把日志放到Redis中缓冲一下,即使logstash读取数据失败,数据依旧在Redis中不会丢失。
安装
安装的是3.2.8版本,编译安装
$ wget http://download.redis.io/releases/redis-3.2.8.tar.gz
$ tar xzvf redis-3.2.8.tar.gz
$ cd redis-3.2.8
$ make & make install
$ vi redis.conf
# 编辑redis.conf文件
#(1)把“bind 127.0.0.1”注释掉,否则redis只能从本地访问
#(2)加上这一句:requirepass 【密码】,既然允许远程访问,自然应该设置密码
$ cd src
$ ./redis-server
Logstash
安装的是1.3.3版本,注意Logstash的版本必须对应ElasticSearch特定版本,否则无法运行,而且两者版本号并不是一致的,相当混乱,好像是ELK3还是ELK5重新整理了版本号才改善过来。
$ mkdir logstash
$ cd logstash
$ wget http://download.elasticsearch.org/logstash/logstash/logstash-1.3.3-flatjar.jar
# 创建redis-logstash.conf
$ touch redis-logstash.conf
$ vi redis-logstash.conf
input{
redis{
host=>"127.0.0.1" #我的redis也装在同一台服务器
port=>6379 #redis的端口
data_type=>"list"
key=>"logstash" # 自定义的key,需要与我在logback上配置的对应
password=>"Abcedfg" #在redis设置的访问密码
codec=>json{
charset=>"UTF-8"
}
}
output{
file{
#从redis中获取的日志,放到这个文件,支持动态文件名
path=>"/data/logs/logstash-%{+yyyy.MM.dd}.log"
}
elasticsearch{
host=>"127.0.0.1" # 我的elasticsearch也是装在同一台服务器上
}
}
# 直接用Java跑这个jar包
# 其中 -f 是指以前台方式运行,结合实际情况考虑去掉
$ java -jar logstash-1.3.3-flatjar.jar agent -f redis-logstash.conf
ElasticSearch
安装的版本是0.90.13
$ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.13.tar.gz
$ tar xvf elasticsearch-0.90.13.tar.gz
$ cd elasticsearch-0.90.13/bin/
# 使用的是默认的配置,在redis-logstash.conf中已经指定了ElasticSearch所在的ip,所以只需开启ElasticSearch,它自会处理日志
# -f 是指以前台方式运行,根据实际情况去掉
$ ./elasticsearch -f
Kibana
可以通过一个图形化的界面看日志
logstash已经包含了:
java -jar logstash-1.3.3-flatjar.jar web
它默认使用的是9292端口,我们用一个支持HTML5的浏览器打开即可http://127.0.0.1:9292/index.html#/dashboard/file/logstash.json
4. 不足与展望
以上只是介绍了一个简单的安装步骤,可以看到安装的版本很旧,ELK全部装在一台服务器,索引也没有优化,内存会越来越少,也没有使用集群以保证高可用。这个以后再另写文章总结