等级保护对系统和应用的日志记录的都有比较严格的要求。去年是购买的阿里云成熟产品,应用日志则是直接存数据库,高并发下形成瓶颈。经过调研,决定尝试选用ELK分布式日志系统,如果能替代阿里云产品,则可以节省一些费用;同时也可以解决日志存数据库带来的性能问题。一举两得。
节前就曾在公司的虚拟机上尝试搭建ELK环境,可是因为版本问题一直有各种问题及没有解决。利用春节长假,重新查阅资料,研究了在CentOS环境下搭建ELK布式日志系统。终于初步调通,特整理本文记录一下过程。
一、本次测试采用的架构图
本次测试采用的基本架构如图:
事实上应用程序直接将日志记录在Redis的情形并不常见。将来实际应用时会使用Filebeat采集应用日志到Redis。因此,实际应用的架构应该如下图。
考虑时间成本,本次测试没有采用Filebeat。
二、相关产品选型
本次测试在CentOS 7.5环境下,使用一台虚拟机搭建ELK。CentOS虚拟机的IP为192.168.1.101。
ELK分别指Elasticsearch、Logstash、Kibana等系统,它们的版本必须匹配才有可能整体调通。之前没有搭建成功,很大的原因就是不同产品之间的版本没有匹配好,因此首先记录一下本次测试涉及的相关产品及选型,具体如下:
(1)ElasticSearch 6.4.3,用于日志存储及搜索;
(2)Logstash 6.4.3,用于日志收集及过滤(本次测试并未涉及日志过滤);
(3)Redis 4.0.14,用于缓存日志,Redis的版本应该没有影响。
(4)Kibana 6.4.3,用于图形化展示日志。
本文假定在CenbtOS虚拟机上已经提前安装并配置好了JDK 1.8。
三、修改系统配置文件
因为Elasticsearch、Logstash和Kibana都不允许以root账号运行,而CentOS对非root账号有诸多限制,所以要提前左脚相关配置。这些设置都做完了,需要重启系统。
3.1 修改文件限制:
修改系统文件/etc/security/limits.conf,增加的内容:
* soft nofile 655361
* hard nofile 65536
* soft nproc 2048
* hard nproc 4096
3.2 修改进程数限制
修改系统文件/etc/security/limits.d/20-nproc.conf,调整成以下配置
* soft nproc 4096
root soft nproc unlimited
3.3 调整虚拟内存&最大并发连接
修改系统文件/etc/sysctl.conf,增加的内容
vm.max_map_count=655360
fs.file-max=655360
四、创建elk专用用户
前面提到,Elasticsearch、Logstash和Kibana都不允许以root账号运行。因此需要提前创建一个elk专用用户,这里假定为elk。
useradd elk
mkdir /usr/elk
mkdir /elk
chown -R elk:elk /usr/elk
chown -R elk:elk /elk
五、下载ELK包并解压
cd /usr/elk
tar -zvxf elasticsearch-6.4.3.tar.gz
tar -zvxf logstash-6.4.3.tar.gz
tar -zvxf kibana-6.4.3-linux-x86_64.tar.gz
六、 部署和启动Elasticsearch
Elasticsearch是ELK中最重要的组件,负责日志存储和搜索。
6.1 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
6.2 将安装目录对用户elk授权
chown -R elk:elk /usr/elk/elasticsearch-6.4.3/
6.3 切换账号
su - elk
6.4 创建数据目录和日志目录
mkdir /elk/es
mkdir /elk/es/data
mkdir /elk/es/logs
6.5 配置Elasticsearch节点
切换至/usr/elk/elasticsearch-6.4.3/config目录,编辑elasticsearch.yml,内容如下。
cluster.name: es
node.name: es1
path.data: /elk/es/data
path.logs: /elk/es/logs
network.host: 192.168.1.101
http.port: 9200
transport.tcp.port: 9300
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["192.168.1.101:9300"]
discovery.zen.minimum_master_nodes: 1
具体说明如下:
- cluster.name 集群名; node.name 节点名; path.data 数据保存目录;
- path.logs 日志保存目录; network.host 节点host/ip; http.port HTTP访问端口;
- transport.tcp.port TCP传输端口; node.master 是否允许作为主节点;
- node.data 是否保存数据;
- discovery.zen.ping.unicast.hosts 集群中的主节点的初始列表,当节点(主节点或者数据节点)启动时使用这个列表进行探测;
- discovery.zen.minimum_master_nodes 主节点个数。
6.6 启动Elasticsearch
打开一个新的终端,运行如下命令:
su - elk
cd /usr/elk/elasticsearch-6.4.3/bin
./elasticsearch
首先要切换至elk用户,才能启动Elasticsearch。
因为是测试,所以没有将命令服务化。运行期间,不能关闭终端窗口。
6.7 对Elasticsearch进行健康检查
启动Elasticsearch,打开PostMan,以GET方式访问如下URL,可以对Elasticsearch进行健康检查。
http://192.168.223.136:9200/_cluster/health
结果如下:
status=green表示一切正常,这里为yellow,是因为之前测试没有实时清缓存,其他正常。
七、部署和运行Logstash
Logstash是ELK中的L,负责日志收集和过滤(本次测试不涉及日志过滤)。
需要新打开一个终端,进行操作。
7.1 部署和启动Redis
因为本次测试中Logstash从Redis中采集日志数据,所以需要提前部署和启动Redis。
CentOS安装Redis的方法很多,本次测试参照参考资料采用下载安装包,然后解压缩的方法。首先下载redis-4.0.14.tar.gz,并将其上传至/usr/elk,然后执行下面命令解压缩:
tar -zxvf redis-4.0.14.tar.gz
为了编译Redis,需要安装gcc和gcc-c++编译器
yum install gcc
yum install gcc-c++
成功后编译 Redis:
cd redis-4.0.14
make distclean
make
make install PREFIX=/usr/local/redis
将Redis安装至/usr/local/redis。然后修改(新建)配置文件,/usr/local/redis/bin/redis.conf,代码如下:
# 更换绑定
bind 192.168.1.101
# 关闭保护模式
protected-mode no
# 修改启动方式,no表示前台启动,yes表示后台启动
daemonize yes
然后启动Redis
cd /usr/local/redis/bin
./redis-server redis.conf
注意,这次是后台运行。启动后,可以使用RedisDesktopManager连接到192.168.1.101的6379端口,验证Redis
是否工作正常。图标变红表示成功连接。
7.2 配置Logstash
首先将Logstash的安装目录对elk用户授权。
chown -R elk:elk /usr/elk/logstash-6.4.3/
然后切换到elk用户。
su - elk
为Logstash创建相关目录。
# 创建Logstash主目录
mkdir /elk/logstash
# 创建Logstash数据目录
mkdir /elk/logstash/data
# 创建Logstash日志目录
mkdir /elk/logstash/logs
切换至/usr/elk/logstash-6.4.3/config目录,编辑logstash.yml,新增如下代码,设置数据和日志目录。
path.data: /elk/logstash/data
path.logs: /elk/logstash/logs
在config目录下新建input-output.conf,用于配置Redis和Elasticsearch,代码如下:
input {
redis {
data_type => "list"
key => "logstash"
host => "192.168.1.101"
port => 6379
threads => 5
codec => "json"
}
}
filter {
}
output {
elasticsearch {
hosts => ["192.168.1.101:9200"]
index => "logstash-%{type}-%{+YYYY.MM.dd}"
document_type => "%{type}"
}
stdout {
}
}
执行如下命令,启动Logstash
cd /usr/elk/logstash-6.4.3/bin
./logstash -f ../config/input-output.conf
看到如下信息说明启动成功。
八、配置和运行Kibana
Kibana是ELK的K,负责以图形化展示Elasticsearch中的日志。
打开一个新终端,完成如下操作。
8.1 配置Kibana
首先将Kibana的安装目录对elk进行授权。
chown -R elk:elk /usr/elk/kibana-6.4.3-linux-x86_64
然后切换到elk账号
su – elk
修改/usr/elk/kibana-6.4.3-linux-x86_64/config下的kibana.yml,增加如下内容。
server.port: 5601
server.host: "192.168.1.101"
elasticsearch.url: "http://192.168.1.101:9200"
8.2 启动kibana
cd /usr/elk/kibana-6.4.3-linux-x86_64/bin
./kibana
如果看到如下信息,则说明已经成功启动类。
九、Kibana的简单使用
打开浏览器,访问如下URL,可以打开Kibana主页。
http://192.168.1.101:5601/
此时会提示要求Configure an index pattern,在Index pattern中填写logstash-*,点击下一步。Time Filter field name选择@timestamp,然后点击创建即可。测试时忘记截图了,时候再试已经不会出现此页面了。只能文字描述。
十、添加测试日志
因为Redis中并没有日志,所以Kibana中并没有数据。为了查看显示效果,这里再打开一个新的终端,执行如下命令,运行Redis客户端:
cd /usr/local/redis/bin
./redis-cli -h 192.168.1.101
进入Redis客户端后执行如下命令,向Redis中写入测试日志:
lpush logstash '{"host":"127.0.0.1","type":"logtest","message":"HelloWorld"}'
然后刷新Kibana主页,在导航栏中单击Discover,然后选择logstash-*过滤器,可以看到从Logstash发送过来的日志,包括柱状图和明细。
十一、下一步的工作
这次搭建ELK测试环境进展还算很顺利,主要是因为之前邓策提供的参考资料比较准确的给出了各相关产品的选型。所有产品的版本都匹配了,搭建自然顺利。虽然搭建了测试环境。但是还有一些工作没有逐一去做。记录一下:
(1)没有在测试环境下为应用创建服务,都是以命令运行的应用。以至于打开了4个终端;
(2)没有使用Filebeat将应用日志采集到Redis缓存中,这样做后才能上线实用。
(3)没有尝试部署ElasticSearch集群,所有的产品都不熟在一台服务器上。
(4)没有在Logstash中对日志进行过滤和分类处理,特别是将应用日志从系统日志中分类出来。
(5)没有研究Kibana的细节,看能否满足等级保护的三权分离的要求。
虽然要做的事很多,好在都在稳步推进中。