今天分享一下多服务器的elk搭建。

1.    流程规划

ELK会有漏记录的情况吗 elk 7_ELK会有漏记录的情况吗

2.   执行搭建

    最新的版本和对应下载地址可以在官网查询到 
    https://www.elastic.co/cn/products/

    2.1 elasticsearch 7.0 搭建

         2.1.1 下载

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.0.0-linux-x86_64.tar.gz

 我这边的目录是    /opt/web_app/elk/elasticsearch-7.0.0/

tar -zxvf elasticsearch-7.0.0-linux-x86_64.tar.gz

        2.1.2 安装

        由于es 不允许root账户启动,先创建用户和用户组

groupadd elk
useradd -g elk elk
#添加权限
chown -R elk:elk /opt/web_app/elk/elasticsearch-7.0.0/

       2.1.3 修改配置      

elasticsearch.yml 修改内容
cluster.name: test1
node.name: test1-node1
network.host: 0.0.0.0 #允许外网访问
discovery.seed_hosts: ["内网ip"]	#集群ip
cluster.initial_master_nodes: ["test1-node1"] #默认节点

       2.1.4 启动和停止:  

su elk
cd /opt/web_app/elk/elasticsearch-7.0.0/
./bin/elasticsearch &
ps -ef|grep elasticsearch 
kill pid

     启动成功,访问如图:

     

ELK会有漏记录的情况吗 elk 7_多服务器_02

      2.1.5 异常记录:

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)
        
        修改 elasticsearch 目录中 config/jvm.options  

vim config/jvm.options
#-Xms2g和-Xmx2g  改为 -Xms512m和-Xmx512m

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

vi /etc/sysctl.conf
#添加下面配置:
vm.max_map_count=655360 #单个jvm能开启的最大线程数
sysctl -p

max number of threads [3795] for user [esuser] is too low, increase to at least [4096]
        

#linux最大线程数(ulimit -u可以查看)
 #root用户下进行: 
 cat /etc/security/limits.d/20-nproc.conf
 #注释这两行:(最前面加#)
 * soft nproc 2048
 root soft nproc unlimited
 #在后面加四行:
 *  soft nproc 5000
 *  hard nproc 5000
 root soft nproc 5000
 root hard nproc 5000

max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

vi /etc/security/limits.conf   
#用户最大打开文件数(ulimit -n可以查看)
#添加如下内容:
soft nofile 65536
hard nofile 131072
soft nproc 2048
hard nproc 4096

2.2 kinaba 搭建

      由于在es 6.0之后X-Pack 就不再开源了,如果想做权限控制的话,可以用nginx。这里由于是内网访问,就暂时没考虑安全方面的。

      2.2.1 下载

wget https://artifacts.elastic.co/downloads/kibana/kibana-7.0.0-linux-x86_64.tar.gz
#我这边的目录是 /opt/web_app/elk/kibana-7.0.0-linux-x86_64
tar -zxvf kibana-7.0.0-linux-x86_64.tar.gz

      2.2.2 修改配置文件

        更改配置文件:

vi /opt/web_app/elk/kibana-7.0.0-linux-x86_64/config/kibana.yml
 server.host: "0.0.0.0"
 server.maxPayloadBytes: 1048576000    # 防止日志内容过大,kinaba 自动挂掉
 elasticsearch.hosts: ["http://127.0.0.1:9200"] # kinaba 和 es在一台服务器部署的,所以这里是127.0.0.1

        2.2.3 启动和停止        

./bin/kinaba &
ps -ef|grep node
ps -ef|grep 5601
kill pid

启动成功,如图:

ELK会有漏记录的情况吗 elk 7_ELK会有漏记录的情况吗_03

2.3 logstash 搭建

        2.3.1 下载

wget https://artifacts.elastic.co/downloads/logstash/logstash-7.0.0.tar.gz
#我这边的目录是 /opt/web_app/elk/logstash-7.0.0
tar -zxvf logstash-7.0.0.tar.gz

        2.3.2 修改配置文件

vi /opt/web_app/elk/logstash-7.0.0/config/logstash.conf
        #输入
        input {
          beats {
           port => 5044
          }
        }
        #过滤器 (可不加,为了看着格式方便)
        #filter{
        #    #去除换行符
        #    mutate{
        #    gsub => [ "message", "\r", "" ]   
        #    }
        #     
        #    #逗号分割
        #    mutate {  
        #      split => ["message",","]     
        #    }
        #     
        #    #字段里的日期识别,以及时区转换,生成date
        #    date {
        #      match => [ "mydate", "MM/dd/yyyy HH:mm:ss" ]
        #      target => "date"
        #      locale => "en"
        #      timezone => "+00:00"  
        #    }
        #     
        #    #删除无用字段
        #    mutate {    
        #      remove_field => "mydate"    
        #      remove_field => "@version"    
        #      remove_field => "host"    
        #      remove_field => "path"    
        #    }
        #    #将两个字段转换为整型
        #    mutate{
        #    convert => { "size" => "integer" }
        #    convert => { "attachments" => "integer" }
        #    }
        #}
        #输出
        #不同的服务器,不同的tag,下面用于区分不同的服务器生成不同的index索引
        output {
            if "test1" in [tags]{
                elasticsearch {
                hosts => ["http://127.0.0.1:9200"]
                index => "etc_manage-%{+YYYY.MM.dd}"
              }
            }
            if "test2" in [tags]{
                elasticsearch {
                hosts => ["http://127.0.0.1:9200"]
                index => "test2-%{+YYYY.MM.dd}"
              }
            }
        }

        2.3.3 启动和停止

cd /opt/web_app/elk/logstash-7.0.0/
./bin/logstash -f config/logstash.conf
ps -ef|grep logstash
kill pid

2.4 filebeat 搭建 

        在需要的服务器安装 filebeat
        我这里是另外两台服务器。

        2.4.1 下载

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.0.0-linux-x86_64.tar.gz
#我这边的目录是 /opt/web_app/elk/filebeat
tar -zxvf filebeat-7.0.0-linux-x86_64.tar.gz

        2.4.2 修改配置文件(这里展示其中一台的配置文件,另一个类似,tag不同)

vi /opt/web_app/elk/filebeat/filebeat.yml

 paths: #监听的日志路径
    - /opt/web_app/logs/*.log
 # 和logstash的filter配合使用,filter不配置的话,这个可以不配
 #multiline.pattern: ^\[ #必须匹配的正则表达式模式
 #multiline.negate: true #定义是否应取消在模式下设置的模式。 默认值为false。
 #multiline.match: after
 tags: ["test1"] #标签,用于区分不同的服务器来源或者日志来源
 output.logstash: #输出到logstash的地址和端口
    hosts: ["logstath的ip:5044"]

        filebeat 多行日志的处理
        

         2.4.3 启动和停止

./filebeat -e -c filebeat.yml &
 ps -ef|grep filebeat
 kill pid

         2.4.4 问题

        解决kibana后台服务挂的方法
        

        关于老版本kibana进程会挂掉的问题
                

vi /opt/web_app/sh/check_kibana.sh

kibana_pid_num=`lsof-i:5601 | wc -l`

if[ "${kibana_pid_num}" = 0 ]
then
echo"kibana Down"
cd/opt/Kibana/kibana-5.4.0-linux-x86_64
nohup./bin/kibana >/dev/null &
else
echo"kibana Live"
fi

echo '0 1/1 * * * ? sh /opt/web_app/sh/check_kibana.sh' >> /var/spool/cron/root

        2.4.5 官方配置

     

 

3.   配置kinaba和日志索引

首页的 management ——> Index Patterns ——> Create index pattern
如图所示:

ELK会有漏记录的情况吗 elk 7_filebeat和logstash_04

创建索引:

ELK会有漏记录的情况吗 elk 7_多服务器_05

看到日志:

ELK会有漏记录的情况吗 elk 7_ELK会有漏记录的情况吗_06

4.   优化和不足

不足:
kinaba 频繁挂掉。(可能是内存不足的原因)
启动过慢。
日志丢失。
其他的后续待总结。