• ELK监控平台搭建

    前提条件:服务器上已经安装好docker以及jdk1.8的环境

    注意:搭建elk时,需要保证使用的版本统一,为了兼容skywalking(官网推荐使用6.x版本的es),此次搭建我们使用的均为6.8.2版本。此外,本文对于ES的地址均使用localhost来代替,实际操作中需修改为ES的真实地址进行操作。

    如何对接搭建好的ELK监控平台请参考:ELK监控平台对接

    elasticsearch

    服务器部署

    1.下载tar.gz 源码包

    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.2.tar.gz
    

    2.由于es无法使用root用户启动(官方建议:由于elasticsearch可以接收用户输入的脚本并且执行,为了系统安全考虑, 建议创建一个单独的用户用来运行elasticsearch),因此我们需要创建一个用户组,并在该用户组下创建用户,便于管理。

    # 创建用户组。注意:此处的用户组名称自定义即可
    groupadd elsearch
    # 创建用户。注意:此处的用户名和密码自定义即可
    useradd elsearch -g elsearch -p yourPassword 
    # 为用户分配文件夹操作权限。注意:此处需输入你创建的用户组和用户名称,文件夹需指定为elasticsearch的所在文件夹。
    chown -R elsearch:elsearch  ./elk/
    

    3.登录elsearch用户,解压es压缩包,修改配置文件保存后启动。

    tar -zxvf elasticsearch-6.8.2.tar.gz
    mv elasticsearch-6.8.2 elasticsearch
    cd elasticsearch/config
    vim elasticsearch.yml
    

    elasticsearch.yml配置文件修改项如下:

    # elasticsearch.yml中添加如下配置,支持跨域访问
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    network.host: 0.0.0.0  # 监听全部ip,注意:在实际环境中应设置为一个安全的ip
    http.port: 9200  # es服务的端口号
    xpack.security.enabled: true # 开启认证,注意:若无需开启则可不设置该配置
    discovery.type: single-node # 单节点配置,注意:该配置需根据实际需求进行配置。
    

    jvm.options配置文件修改项如下:

    # 调整elasticsearch jvm.options的堆内存大小。注意:如果内存足够可以调整为当前服务器内存的一半大小,但是不要超过32g,因为官方不推荐。jvm超过32g后指针压缩效果失效。本文服务器内存大小为16g,因此配置为8g。
    -Xms8g
    -Xmx8g
    

    修改完成后保存配置并启动es,直接启动和后台启动的命令如下:

    # 直接启动
    ./elasticsearch/bin/elasticsearch
    # 后台启动
    ./elasticsearch/bin/elasticsearch -d
    

    4.设置内置用户密码(若未开启认证配置则忽略此步骤):

    # 为es内置用户设置初始密码,默认密码为changeMe,
    ./bin/elasticsearch-setup-passwords interactive
    

    注意:设置内置用户密码时报错:

    java.nio.file.AccessDeniedException:/data/elk/elasticsearch/config/elasticsearch.keystore
    

    解决:使用ll命令查看config下文件的属主信息,发现elasticsearch.keystore文件是属于root用户的 将该文件为当前用户赋予权限就可以了

    5.检查单实例集群运行情况(若开启ES认证,则建议使用postMan调用es内置接口,这样权限比较好添加。)shell调用接口例子如下:

    # 检查单实例集群运行情况
    curl -X GET "localhost:9200/_cat/health?v"                                              # localhost需替换为实际的es地址
    
    # 获取集群节点情况
    curl -X GET "localhost:9200/_cat/nodes?v"                                               # localhost需替换为实际的es地址
    
    # 列出所有指数
    curl -X GET "localhost:9200/_cat/indices?v"                                             # localhost需替换为实际的es地址
    
    # 新增一个文档
    curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H                                  # localhost需替换为实际的es地址
    'Content-Type: application/json' -d'
    {
      "name": "John Doe"
    }
    '                                                                                      
    
    # 删除一个文档
    curl -X DELETE "localhost:9200/customer?pretty"                                          # localhost需替换为实际的es地址
    
    # 列出所有索引
    curl -X GET "localhost:9200/_cat/indices?v"                                              # localhost需替换为实际的es地址
    
    # 获取某个文档。在查询参数中加上pretty 会调用pretty-print功能,将json格式化打印
    curl -X GET "localhost:9200/customer/_doc/1?pretty"                                      # localhost需替换为实际的es地址
    
    # 删除索引
    curl -X DELETE "localhost:9200/_all"                                                     # localhost需替换为实际的es地址
    curl -X DELETE "localhost:9200/dev_*"                                                    # localhost需替换为实际的es地址
    
    
    

    elasticsearch-head

    docker 安装

    github地址: elasticsearch-head

    1.下载镜像

    docker pull mobz/elasticsearch-head:5
    

    2.启动服务

    docker run -d --name elasticsearch-head -p 9100:9100 docker.io/mobz/elasticsearch-head:5
    

    3.访问首页,连接es访问,若连接不上,需要在es的配置文件中添加允许跨域访问,并重启elasticsearch。

    # elasticsearch.yml中添加如下配置,支持跨域访问
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    
    # 注意:此处的localhost需替换为实际的elasticsearch-head地址
    http://localhost:9100/?base_uri=http://localhost:9200&auth_user=elastic&auth_password=changeMe
    

    logstash

    服务器部署

    1.下载tar.gz 源码包

    wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.2.tar.gz
    

    2.解压,调整配置文件,参数修改完成后保存即可

    tar -zxvf logstash-6.8.2.tar.gz
    mv logstash-6.8.2 logstash
    cd logstash/config
    cp logstash-sample.conf syslog.conf
    vim syslog.conf
    

    示例配置如下:

    input {
      beats {
        # 端口信息
        port => 5044
      }
    }
    
    # 对filebeat中传输过来的信息进行过滤
    filter {
    
       mutate {
          rename => { "[host][name]" => "host" }
       }
    
       # 排除tag中无用的参数,避免生成的ES索引格式有问题。注意:若不操作filebeat的tag时则无需该if条件及里面的mutate配置
       if "beats_input_codec_plain_applied" in [tags] {
            mutate {
                remove_tag => ["beats_input_codec_plain_applied"]
            }
        }
       # 标准配置,若无特殊需求可不做修改
       grok {
           match => { "message" => [
                "\[%{TIMESTAMP_ISO8601:logtime}\]\s*\[%{LOGLEVEL:loglevel}\]\s*\[%{IPORHOST:instancehost}\]\s*\[%{DATA:module}\]\s*%{JAVACLASS:class}\s*\[pic:%{DATA:pic}\]\s*\[%{DATA:keys}\]\s*%{GREEDYDATA:content}",
    
                "\[%{TIMESTAMP_ISO8601:logtime}\]\s*\[%{LOGLEVEL:loglevel}\]\s*\[%{IPORHOST:instancehost}\]\s*\[%{DATA:module}\]\s*%{JAVACLASS:class}\s*\[pic:%{DATA:pic}\]\s*%{GREEDYDATA:content}",
    
                "\[%{TIMESTAMP_ISO8601:logtime}\]\s*%{GREEDYDATA:content}",
    
                "%{GREEDYDATA:content}"
           ]}
        }
        # 标准配置,若无特殊需求可不做修改
        date {
            match => [ "logtime", "ISO8601", "yyyy-MM-dd'T'HH:mm:ss.SSS", "yyyy-MM-dd'T'HH:mm:ss,SSS", "yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM-dd HH:mm:ss,SSS" ]
            target => "@timestamp"
            timezone => "Asia/Shanghai"
        }
    }
    # 配置输出到ES中的索引格式
    output {
      elasticsearch {
        # elasticsearch的hosts地址。注意:需将localhost修改为实际的地址
        hosts => ["http://localhost:9200"]
        # 以filebeat定义的tags为前缀,日期为后缀组成索引,例如:(integration_dev-hzero-platform-2019.11.02)。注意:该配置需修改为实际想要的索引格式。
        index => "%{[tags]}-%{+YYYY.MM.dd}"
        # elastic用户名
        user => "elastic"
        # 注意:此处的密码需修改为实际elastic用户的密码,未修改时默认为changeMe,建议统一进行修改
        password => "changeMe"
      }
    }
    

    注意:上述配置中需要重点关注filter部分以及output部分的配置内容,在配置时需根据实际需求来修改相应的配置项,需修改的地方文中均有注释进行标注。

    3.启动logstash

    # 直接启动
    ./logstash -f ../config/syslog.conf 
    # 后台启动
    nohup ./bin/logstash -f ./config/syslog.conf &
    

    kibana

    服务器部署

    1.下载tar.gz源码包

    wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.3-linux-x86_64.tar.gz
    

    2.解压,调整配置文件,参数修改完成后保存即可

    tar -zxvf kibana-6.8.3.tar.gz
    mv kibana-6.8.3 kibana
    cd kibana/config
    vim kibana.yml
    

    示例配置如下:

    server.port: 5601 # Kibana端口号
    server.host: "localhost" # kibana地址。注意:该配置需修改为实际kibana的host地址。
    elasticsearch.hosts: ["http://localhost:9200"] # kibana连接es的host。注意:该配置需修改为实际es的host地址。
    elasticsearch.username: "elastic" # es用户名,当es开启认证授权时需要配置。
    elasticsearch.password: "changeMe" # es密码,当es开启认证授权时需要配置,该配置需修改为实际elastic账户的密码。
    i18n.locale: "zh-CN" # 配置中文Kibana环境。注意:该配置按需进行配置,不加时默认为英文操作环境。
    

    3.启动Kibana

    # 直接启动
    ./bin/kibana
    # 后台启动
    nohup ./bin/kibana &
    

    至此我们的elk环境已经初步搭建完成,下面就需要将搜集到的日志信息与elk日志监控平台进行对接。

    搭建问题记录

    问题:
    1.单机部署elk时,集群健康值总是为red,排查原因是因为存在副本分片数导致不稳定。
    解决方式是在elasticsearch-header中或postman中执行复合查询。
    请求路径如下:
    http://localhost:9200/_template/template_http_request_record,(注意:请求中的localhost需替换为实际的es地址)
    传参如下:
    {"index_patterns":["*"],"settings":{"number_of_shards":1,"number_of_replicas":0}}
    执行返回{"acknowledged": true}说明修改成功,此时在启动logstash和filebeat传输数据,es创建的索引主分片是1,副本分片是0
    
    注意:elasticsearch的主分片和副本分片不可以存在于同一节点上。否则会出问题
    
    2.部署elk后索引状态为UNASSIGNED(UNASSIGNED原因:Too many open files)
    此时需要在es用户下执行ulimit -a 查看当前用户的open file数量,默认1024,然后在root用户下执行
    vim /etc/security/limits.conf文件,在文件中添加配置:
    elsearch soft nofile 65535
    elsearch hard nofile 65535
    
    

    elasticsearch 常用接口

    1.检查es健康状态
    GET http://localhost:9200/_cat/health?v                                              # localhost需替换为实际的es地址
    
    2.检查es分片详情,排查unassigned原因
    GET http://localhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason4  # localhost需替换为实际的es地址
    
    3.强制失败的es索引重新分片
    POST http://localhost:9200/_cluster/reroute?retry_failed                             # localhost需替换为实际的es地址
    
    4.删除es前缀为dev_的索引
    DELETE http://localhost:9200/dev_*                                                   # localhost需替换为实际的es地址
    
    5.创建es索引模板(创建名称为hpfm的索引模板)
    PUT http://localhost:9200/_template/hpfm                                             # localhost需替换为实际的es地址
    
    6.查看节点状态信息(unsigned时调用该接口查看原因)
    http://localhost:9200/_nodes/stats\?pretty                                           # localhost需替换为实际的es地址