MongoDB · 2017-08-15 1

使用ELK搞定mongo慢日志展示

一、ELK工作原理

        本文主要用的是filebeat+logstatsh+elasticsearch+kibana来展示mongo慢日志,如果mongo服务器较多、可用redis做一层缓存,此处不讨论redis。

        mongo慢日志切割日志效果

QQ20170814-0

        

二、搭建ELK

2.1准备工作

1)系统层修改

> vi /etc/sysctl.conf

vm.max_map_count = 655360

> vi /etc/security/limits.conf

* soft nofile 65536

* hard nofile 131072

* soft nproc 2048

* hard nproc 4096

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

* soft nproc 2048

2)uname -r 保证内核版本高于3.5

        升级内核参考的是http://xjsunjie.blog.51cto.com/999372/1812602,也可以使用yum方式升级内核,yum方式时间最短,也能支持ELK。

Step 1  安装需要的环境

> yum install grouplist ncurses-devel qt-devel hmaccalc zlib-devel binutils-devel elfutils-libelf-devel

> yum groupinstall “Development Tools”

Step 2  编译内核

> wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.28.tar.xz

> tar -xf linux-3.10.28.tar.xz -C /usr/src/

> cd /usr/src/linux-3.10.28/

> cp /boot/config-2.6.32-431.11.22.el6.ucloud.x86_64   .config

> sh -c ‘yes “” | make oldconfig’

3)JDK 1.8以上版本安装

        Logstash需要jdk环境,最好是1.8以上版本

Jdk8下载地址http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Step 1 卸载之前的jdk,如果没有安装过则跳过此步骤

        首先查看系统原有JDK信息
> rpm -qa | grep java
> rpm -qa|grep java|xargs rpm -e –nodeps

> echo $JAVA_HOME

/usr/java/jdk1.7.0_80

> rm -rf  /usr/java/jdk1.7.0_80

Step 2 安装jdk

> cp -arpf  /data/servers/data/elk/jdk1.8.0_121* /usr/java/

> /usr/java/jdk1.8.0_121/bin/java -version 进行验证

        验证无误就修改/etc/profile的环境变量

> vi /etc/profile #下面添加如下信息

export JAVA_HOME=/usr/java/jdk1.8.0_121

export JRE_HOME=${JAVA_HOME}/jre

export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

> source /etc/profile #使得环境变量生效

 2.2 安装

1)安装elasticsearch-5.0.1

Step 1 解压安装包

> cd /data/servers/app/elk #软件所在目录

> tar zxvf elasticsearch-5.0.1.tar.gz -C /data/servers/app/ #解压到/data/servers/app/目录下

> mkdir -p /data/servers/data/elasticsearch/data #es数据存放目录

> mkdir -p /data/servers/data/elasticsearch/logs #es日志存放目录

> useradd es  #创建启动es的用户;不能使用root,否则无法启动

Step 2 编辑elasticsearch参数文件

> vi /data/servers/app/elasticsearch-5.0.1/conf/elasticsearch.yml 

transport.host: 10.9.195.171

transport.tcp.port: 9300

http.port: 9200

network.host: 10.9.195.171

cluster.name: my_elastic_cluster

node.name: “EL1_NODE”

path.logs: /data/servers/data/elasticsearch/logs

path.data: /data/servers/data/elasticsearch/data

Step 3 启动elasticsearch

         使用es用户启动es5

> chown -R es.es /data/servers/app/elasticsearch-5.0.1/

> chown -R es.es /data/servers/data/elasticsearch/

> su – es

es > nohup /data/servers/app/elasticsearch-5.0.1/bin/elasticsearch & #启动命令

Step 4 校验es启动是否成功

       登录http://10.9.195.171:9200/,9200端口号是上面文件定义的http.port,能看到下面信息说明安装成功,如果异常请及时解决,否则后面的软件启动会提示找不到该进程。

{

“name” : “EL1_NODE”,

“cluster_name” : “my_elastic_cluster”,

“cluster_uuid” : “WivdRQNmQyeW0K4ySJhIEw”,

“version” : {

“number” : “5.0.1”,

“build_hash” : “080bb47”,

“build_date” : “2016-11-11T22:08:49.812Z”,

“build_snapshot” : false,

“lucene_version” : “6.2.1”

},

“tagline” : “You Know, for Search”

}

2)安装logstash5.0.1

Step 1 解压安装包

> cd /data/servers/app/elk #软件所在目录

> tar zxvf logstash-5.0.1.tar.gz -C /data/servers/app/ #解压到/data/servers/app/目录下

Step 2 编辑logstash文件,按照具体日志格式进行切割

> vi /data/servers/app/logstash-5.0.1/config/logstash.conf

logstash

        上面的logstash为超链接,其为作者环境的logstash参数文件,仅供参考。

【补充】

1)不需要展示的键值,请使用remove_field => [ “timestamp” ],多多利用这个remove_field否则会将数据重复展示,不利于存储和展示

2)不想切割的日志使用drop {} ,这个使用场景:作者切割慢日志部分,其余没有切割

3)想将展示的部分内容替换成其他内容,可以使用mutate {gsub =>[]},这个使用场景:作者将查询的语句传参替换成空格,方便TOP 慢查询报表统计

Step 3 启动logstash

        启动logstash,详情日志见/data/servers/app/logstash-5.0.1/log

> nohup /data/servers/app/logstash-5.0.1/bin/logstash -f /data/servers/app/logstash-5.0.1/config/logstash.conf -l /data/servers/app/logstash-5.0.1/log&

        显示[2017-03-30T15:34:14,987][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600} 表示运行成功

3)kibana5.0.1安装

Step 1 解压软件

> cd /data/servers/app/elk #软件所在目录

> tar zxvf kibana-5.0.1-linux-x86_64.tar.gz -C /data/servers/app/ #解压到/data/servers/app/目录下

> mkdir -p /data/servers/app/kibana-5.0.1-linux-x86_64/run/ #创建pid存放的目录

Step 2 编辑kibana参数文件

> vi /data/servers/app/kibana-5.0.1-linux-x86_64/config/kibana.conf

server.port: 5601

server.host: “10.9.195.171”

server.name: “mongo”

elasticsearch.url: “http://10.9.195.171:9200” #这里指定的是从elasticsearch相关的服务http读取数据

pid.file: /data/servers/app/kibana-5.0.1-linux-x86_64/run/kibana.pid #pid存放的信息

Step 3 启动kibana

> /data/servers/app/kibana-5.0.1-linux-x86_64/bin/kibana -c /data/servers/app/kibana-5.0.1-linux-x86_64/config/kibana.conf &

4)filebeat安装

        fliebeat部署在需要分析日志的mongo所在服务器上,类似于tail -f命令,影响很小

Step 1 解压软件

> cd /data/servers/app/elk #软件所在目录

> tar zxvf filebeat-5.0.1-linux-x86_64.tar.gz -C /data/servers/app/ #解压到/data/servers/app/目录下

> mkdir -p /data/servers/app/filebeat-5.0.1-linux-x86_64/logs/ #创建日志存放目录

Step 2 编译filebeat文件

> vi /data/servers/app/filebeat-5.0.1-linux-x86_64/filebeat.yml

– input_type: log

document_type: mongodblog

paths:

– /data/servers/data/mongo/logs/*.log #定义日志的监控目录

output.logstash:

# The Logstash hosts

hosts: [“10.9.195.171:5044”]

Step 3 启动filebeat

> nohup /data/servers/app/filebeat-5.0.1-linux-x86_64/filebeat -e -c /data/servers/app/filebeat-5.0.1-linux-x86_64/filebeat.yml -d “Publish” &

5)安装5.0版本的elasticsearch-head

这个插件主要用于查看和管理索引。elk升级部署到elasticsearch5.0后,安装elasticsearch-head是通过npm管理配置。

Step 1 编译安装nodejs

> cd /data/servers/app/elk

> wget https://nodejs.org/dist/v6.9.2/node-v6.9.2-linux-x64.tar.xz

> xz -d node-v6.9.2-linux-x64.tar.xz

> tar -xvf node-v6.9.2-linux-x64.tar

> cp -rp node-v6.9.2-linux-x64 /usr/local/node

> vi /etc/profile.d/node.sh

export nodePATH=/usr/local/node

export PATH=$PATH:$nodePATH/bin

export nodePATH PATH

> node -v查看版本

Step 2 配置elasticsearch-head插件

> yum install git -y

> git clone git://github.com/mobz/elasticsearch-head.git

> chown -R root:es elasticsearch-head/

> chmod 775 elastic-search-head/ -R

Step 3 安装grunt

5.0里的head插件就是通过grunt启动

> npm install -g grunt–registry=https://registry.npm.taobao.org

> npm install -g grunt-cli

> su -es

es> npm install

es> cd ./elasticsearch-head/_site/

es> cp app.js app.js.bak

es> vi app.js #添加如下信息

this.config.base_uri ||this.prefs.get(“app-base_uri”) ||”http://10.9.195.171:9200″;

> cd /data/servers/app/elk/elasticsearch-head/

> grunt server & #root用户启动

> /data/servers/app/elk/elasticsearch-head/node_modules/grunt/bin/grunt —force & #root 用户启动es

三、kibana配置

3.1 添加索引

        需要添加索引才能正式按照logstash定义的切分规则进行展示!!!

        登录http://10.9.195.171:5601/

Step 1 进入索引管理界面

1

2

Step 2 添加索引

3

四、修改索引

  kibana上面显示的时间spend_time是字符串类型,无法排序,为了让日志执行时间能排序,故而将spend_time改成数字形式的,这个是通过索引来实现

4.1 修改索引属性

> curl -XPUT 10.9.195.171:9200/mongodblog_test2?pretty -d ‘{“mappings”:{“_default_”:{“properties”:{“spend_time”:{“type”:”long”}}}}}’

curl -XPUT 是固定命令,后面的地址是写logstash地址,mongodblog_test2是索引的名字,不能跟已有的冲突;后面意思是设置spend_time为number格式,要注意是long,要定义多个,就写多个其他的。

修改索引后会使得之前的kibana无法展示;再将logstatsh添加索引名字改成mongodblog_test2;然后再kibana的创建这个索引,刷新该索引

4.2 删除之前的索引

> curl -XDELETE ‘10.9.195.171:9200/mongodblog_index’

查看索引

> curl http://10.9.195.171:9200/_cat/indices?v