编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

【实战揭秘】ELK日志分析生产环境应用,你准备好了吗?

wxchong 2024-07-23 21:14:30 开源技术 20 ℃ 0 评论

一、ELK 介绍

ELK是ElasticSearch、Logstash和Kibana三个开源软件的组合体,它是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案。

Logstash:作为信息收集者,主要是用来对日志的搜集、分析、过滤,支持大量的数据获取方式,一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

Elasticsearch:作为数据的保存者,保存来自L(Logstash)收集的系统日志数据。

Kibana :作为展示者,主要是将ES上的数据通过页面可视化的形式展现出来。包括可以通过语句查询、安装插件对指标进行可视化等。

二、ELK安装和部署

2.1环境准备

NODE

节点


elk-1

10.10.10.66

elasticsearch、kabana

elk-2

10.10.10.67

elasticsearch、logstash

elk-3

10.10.10.68

elasticsearch

修改三台服务器主机名

hostnamectl --static set-hostname  elk-1
hostnamectl --static set-hostname  elk-2
hostnamectl --static set-hostname  elk-3

2.2系统优化

cat >>  /etc/sysctl.conf <<EOF
vm.max_map_count=262144
EOF
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
echo "*           soft     nofile    1024000 " >> /etc/security/limits.conf
echo "*           hard     nofile    1024000 " >> /etc/security/limits.conf
echo "*           soft     nproc     1024000 " >> /etc/security/limits.conf
echo "*           hard     nproc     1024000 " >> /etc/security/limits.conf
sed -i 's/*          soft    nproc     4096/*          soft    nproc     40960/g' /etc/security/limits.d/20-nproc.conf
sysctl -p

2.3安装elasticsearch

  • 创建用户及授权
useradd elk  #三台服务器分别执行
  • 创建数据目录
mkdir -p /data/elk/es-data/
  • 修改elasticsearch.yml配置文件

1、master节点

cluster.name: master-node   # 设置集群名称,集群内所有节点的名称必须一致。
node.name: data-node0       # 设置节点名称,集群内节点名称必须唯一。
node.master: true           # 表示该节点会不会作为主节点,true表示会;false表示不会
node.data: true             # 当前节点是否用于存储数据,是:true、否:false
http.cors.enabled: true       # 是否支持跨域,是:true,在使用head插件时需要此配置
http.cors.allow-origin: /.*/  # “*” 表示支持所有域名
path.data: /data/elk/es-data/ # 索引数据存放的位置
network.host: 0.0.0.0         # 监听地址,用于访问该es
http.port: 9200               # es对外提供的http端口,默认 9200
transport.tcp.port: 9300     # TCP的默认监听端口,默认 9300
discovery.zen.minimum_master_nodes: 2   # 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
action.destructive_requires_name: true  # 安全优化:禁止披露删除可避免恶意或意外的批量删除索引
#设置密码
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

discovery.seed_hosts: ["10.10.10.66", "10.10.10.67", "10.10.10.68"]   # es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.zen.fd.ping_timeout: 1m
discovery.zen.fd.ping_retries: 5
cluster.initial_master_nodes: ["data-node0", "data-node1","data-node2"]   # es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master

2、node1节点

cluster.name: master-node   # 设置集群名称,集群内所有节点的名称必须一致。
node.name: data-node1       # 设置节点名称,集群内节点名称必须唯一。
node.master: true           # 表示该节点会不会作为主节点,true表示会;false表示不会
node.data: true             # 当前节点是否用于存储数据,是:true、否:false
http.cors.enabled: true       # 是否支持跨域,是:true,在使用head插件时需要此配置
http.cors.allow-origin: /.*/  # “*” 表示支持所有域名
path.data: /data/elk/es-data/ # 索引数据存放的位置
network.host: 0.0.0.0         # 监听地址,用于访问该es
http.port: 9200               # es对外提供的http端口,默认 9200
transport.tcp.port: 9300     # TCP的默认监听端口,默认 9300
discovery.zen.minimum_master_nodes: 2   # 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)

#设置密码
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

discovery.seed_hosts: ["10.10.10.66", "10.10.10.67", "10.10.10.68"]   # es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.zen.fd.ping_timeout: 1m
discovery.zen.fd.ping_retries: 5
cluster.initial_master_nodes: ["data-node0", "data-node1","data-node2"]   # es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master

3.node2节点

cluster.name: master-node   # 设置集群名称,集群内所有节点的名称必须一致。
node.name: data-node2       # 设置节点名称,集群内节点名称必须唯一。
node.master: true           # 表示该节点会不会作为主节点,true表示会;false表示不会
node.data: true             # 当前节点是否用于存储数据,是:true、否:false
http.cors.enabled: true       # 是否支持跨域,是:true,在使用head插件时需要此配置
http.cors.allow-origin: /.*/  # “*” 表示支持所有域名
path.data: /data/elk/es-data/ # 索引数据存放的位置
network.host: 0.0.0.0         # 监听地址,用于访问该es
http.port: 9200               # es对外提供的http端口,默认 9200
transport.tcp.port: 9300     # TCP的默认监听端口,默认 9300
discovery.zen.minimum_master_nodes: 2   # 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)

#设置密码
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

discovery.seed_hosts: ["10.10.10.66", "10.10.10.67", "10.10.10.68"]   # es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.zen.fd.ping_timeout: 1m
discovery.zen.fd.ping_retries: 5
cluster.initial_master_nodes: ["data-node0", "data-node1","data-node2"]   # es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
  • 修改elasticsearch的JVM内存(jvm.options
根据实际机器配置做调整
-Xms1g
-Xmx1g
  • ES集群设置密码

注意:elk集群需全部停止,清空elasticsearch所有节点下data

1、开启xpack配置

修改作为主节点的elasticsearch配置文件,添加如下命令开启x-pack

 xpack.security.enabled: true

2、生成安全秘钥

 执行命令:bin/elasticsearch-certutil ca -out config/elastic-certificates.p12 -pass ""

在config文件夹下面多出了文件 elastic-certificates.p12,将elastic-certificates.p12文件分别复制到另外两个节点的config目录下。

分别将如下命令配置到其他节点的elasticsearch.yml

xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

3.重启elasticsearch

./elasticsearch -d

4、配置初始账号密码

 手动指定密码模式:./elasticsearch-setup-passwords interactive
 自动生成密码:./elasticsearch-setup-passwords auto

分别启动三台elasticsearch服务。在浏览器中输入
http://10.10.10.166:9200/_cat/nodes,执行如下图所示结果,则表示配置成功。


4、安装kibana

  • 修改配置文件

vim kibana.yml

server.port: 5601
server.host: "10.10.10.66"
elasticsearch.hosts: ["http://10.10.10.66:9200","http://10.10.10.67:9200","http://10.10.10.68:9200"]
kibana.index: ".kibana"
logging.dest: stdout
i18n.locale: "zh-CN"
elasticsearch.username: "elastic"
elasticsearch.password: "*******************"
  • 启动登录
./bin/kibana
http://10.10.10.66:5601

四、logstash配置

编辑logstash.conf 配置文件

input {
    beats {
        port => 5044
        codec => "json"
    }
}

filter {
    mutate {
        split=>["xff", ","]
            add_field => {
              "xff1"  => "%{[xff][0]}"
              "xff2"  => "%{[xff][1]}"
            }

      convert => [ "status","integer" ]
      convert => [ "size","integer" ]
      convert => [ "upstreatime","float" ]
      convert => ["[geoip][coordinates]", "float"]
      remove_field => "message"
    }
    geoip {
        source => "xff"
        target => "geoip"
        database =>"/data/elk/logstash/GeoLite2-City/GeoLite2-City.mmdb"
        #database =>"/data/elk/logstash/GeoLite2-Country/GeoLite2-Country.mmdb"
        #database =>["/data/elk/logstash/GeoLite2-City/GeoLite2-City.mmdb", "/data/elk/logstash-5.6.7/GeoLite2-Country/GeoLite2-Country.mmdb"]
        fields => ["location","city_name", "country_code2", "country_name", "latitude", "longitude", "region_name"]
        add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
        add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
    }
    #useragent {
    #      source => "http_user_agent"
    #      target => "browser"
    #   }

      if "_geoip_lookup_failure" in [tags] { drop { } }
}
output {
    if [type] == "nginx1" {
    elasticsearch {
        hosts => "xxx.xxx.xxx.xxx:9200"
        user => "elastic"
    		password => "******************"
        index => "logstash-nginx1-%{+YYYY.MM.dd}"
    }}
    if [type] == "nginx2" {
    elasticsearch {
        hosts => "xxx.xxx.xxx.xxx:9200"
        user => "elastic"
  			password => "********************"
        index => "logstash-nginx2-%{+YYYY.MM.dd}"
    }}
    stdout { codec => rubydebug }

}

启动命令:
nohup ../bin/logstash -f ./logstash.conf --config.reload.automatic &

--config.reload.automatic 参数表示修改配置文件实时生效

五、nginx配置

  • 修改nginx日志打印格式,修改nginx.conf,添加如下配置。
log_format  json  '{"@timestamp":"$time_iso8601",'
              '"@source":"$server_addr",'
              '"hostname":"$hostname",'
              '"ip":"$remote_addr",'
              '"client":"$remote_addr",'
              '"request_method":"$request_method",'
              '"scheme":"$scheme",'
              '"domain":"$server_name",'
              '"referer":"$http_referer",'
              '"request":"$request_uri",'
              '"args":"$args",'
              '"size":$body_bytes_sent,'
              '"status": $status,'
              '"xff":"$http_x_forwarded_for",'
              '"responsetime":$request_time,'
              '"upstreamtime":"$upstream_response_time",'
              '"upstreamaddr":"$upstream_addr",'
              '"http_user_agent":"$http_user_agent",'
              '"https":"$https"'
              '}';


六、filebeat配置

filebeat-->logstash:5044 -->output elasticsearch

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /data/logs/nginx/nginx1_access.log
  json.keys_under_root: true
  json.overwrite_keys: true
  json.add_error_key: true
  fields_under_root: true
  fields:
    type: logstash-nginx1
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 1
output.logstash:
  hosts: ["10.10.10.67:5044"]
processors:
  - add_cloud_metadata: ~
  - add_docker_metadata: ~

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表