elastic stack

1、elasticsearch安装

version 7.6.0

config/elasticsearch.yml配置

cluster.name: my-es
path.data: /data/es-data
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
#增加新的参数,这样head插件可以访问es
http.cors.enabled: true
http.cors.allow-origin: "*"
#---------------------security------------------
#xpack安全插件
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
#xpack基础功能是免费的,默认一个月收费版功能,不加此条配置到期会提示充值
xpack.license.self_generated.type: basic

启动(建立专门的es用户,不建议使用root启动)

bin/elasticsearch -d

xpack安装

1、为集群创建认证机构

在es用户下进入/usr/share/elasticsearch-7.6.0文件目录下执行bin/elasticsearch-certutil ca,依次输入回车(文件使用默认名),密码

2、为节点颁发证书

之后执行bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 

依次输入上一个步骤的密码。回车(文件使用默认名),密码(建议与上一步密码相同)

执行bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password 并输入第一步输入的密码 

执行bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password 并输入第一步输入的密码 

3、多节点配置

将生成的elastic-certificates.p12、elastic-stack-ca.p12文件mv到config目录下,并连同elasticsearch.keystore 文件 scp到其他节点的config目录中。

scp elastic-certificates.p12 elasticsearch.keystore elastic-stack-ca.p12 root@192.168.1.100:/usr/share/elasticsearch-7.6.0/config/ 

4、修改配置

在elasticsearch-7.6.1/config/elasticsearch.yml中增加一下配置,启用x-pack安全组件,启用ssl加密通信,并且配置认证证书:

#---------------------security------------------

#

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

配置修改完成后,重启es服务,重启成功后

5、 密码设置

通过设置访问密码,这是elastic用户和其他一些系统内置用户的密码

bin/elasticsearch-setup-passwords interactive

6、 配置kibana访问密码

不要在kibana.yml配置文件里面配置es访问的用户密码明文,需要通过keystore配置加密的用户名密码信息,具体如下:

kibana-7.6.0/bin

创建keystore

./kibana-keystore create

设置kibana访问es的用户名

./kibana-keystore add elasticsearch.username

设置kibana访问es的密码

./kibana-keystore add elasticsearch.password

2、kibana安装

version 7.6.0

config/kibana.yml配置

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]

启动

nohup ./kibana >/dev/null 2>&1 &

#3、kafka安装

version 2.4.0
zookeeper 3.5.6

使用内置的zookeeper进行注册

config/server.properties

############################# Server Basics #############################
broker.id=0
############################# Socket Server Settings #############################
advertised.listeners=PLAINTEXT://elasticsearch_ip:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
############################# Log Basics #############################
log.dirs=/var/log/kafka
############################# Internal Topic Settings  #############################
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
############################# Log Retention Policy #############################
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
############################# Zookeeper #############################
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=6000
############################# Group Coordinator Settings #############################
uring application startup.
group.initial.rebalance.delay.ms=0

config/zookeeper.properties

dataDir=/data/kafka-data/zookeeper
clientPort=2181
maxClientCnxns=0
admin.enableServer=false

启动 (先启动zookeeper再启动kafka)

./kafka-server-start.sh -daemon ../config/server.properties
nohup ./zookeeper-server-start.sh ../config/zookeeper.properties >/dev/null 2>&1 &

4、Logstash安装

version 7.6.0

config/logstash.yml

path.data: /var/lib/logstash
path.logs: /var/log/logstash

config/conf.d/kafka-elk.conf(配置的时候注意格式,可能会引起kafka变量不识别)

input{                                         
    kafka{                                     
        bootstrap_servers => ["elasticsearch_ip:9092"]
        topics_pattern => "elk-.*"           
        codec => "json"                        
        consumer_threads => 3                  
        decorate_events => true                
        auto_offset_reset => "latest"          
        group_id => "logstash-node-41"         
  }
}
filter {
     ruby {
        code => "event.timestamp.time.localtime"
      }
     mutate {
          remove_field => ["host"]
          rename => { "[host][name]" => "serverhost" }
      }
     #grok {
          #match => {"message" => "\[(?<time>\d+-\d+-\d+\s\d+:\d+:\d+)\] \[(?<level>\w+)\] (?<class>[\w|\.]+) (?<msg>.+)"}
      #}
}
output {                         
    elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "%{[@metadata][kafka][topic]}-%{+YYYY-MM-dd}"
        user => "elastic"
        password => "1qaz@WSX"
    }
    stdout {
        codec => rubydebug
    }
}

启动

./logstash > /dev/null 2<&1 &

5、filebeat安装

version 7.6.0
安装在需要收集日志的服务器上的/usr/local/目录文件下

filebeat.yml

filebeat.inputs:                   # inputs为复数,表名type可以有多个
- type: log                        # 输入类型
  access:
  enabled: true                    # 启用这个type配置
  paths:
    - /data/logs/*.log  # 监控的access日志,建议采集日志时先采集单一nginx的access日志。
  exclude_lines: ["DEBUG"]         #排除DEBUG日志
  close_rename: true               # 重命名后,文件将不会继续被采集信息
  tail_files: true                 # 配置为true时,filebeat将从新文件的最后位置开始读取,如果配合日志轮循使用,新文件的第一行将被跳过

  fields:                          # 额外的字段
    source: yunchang-gssdk1       # 自定义source字段,用于es建议索引(字段名小写,我记得大写好像不行)
  multiline.pattern: '^[0-9]{2}-[0-9]{2}'   #把非日期开始的日志合并为一行,比如异常日志
  multiline.negate: true
  multiline.match: "after"

filebeat.config:                 # 这里是filebeat的各模块配置,我理解modules为inputs的一种新写法。
  modules:
    path: ${path.config}/modules.d/*.yml    # 进入容器查看这里有很多模块配置文件,Nginx,redis,apache什么的
    reload.enabled: false                   # 设置为true来启用配置重载
    reload.period: 10s                      # 检查路径下的文件更改的期间(多久检查一次)

# 在7.4版本中,自定义es的索引需要把ilm设置为false, 这里未验证,抄来的
setup.ilm.enabled: false

output.kafka:            # 输出到kafka
  enabled: true          # 该output配置是否启用
  hosts: ["kafka_ip:9092"]  # kafka节点列表
  topic: "elk-%{[fields.source]}"   # kafka会创建该topic,然后logstash(可以过滤修改)会传给es作为索引名称
  partition.hash:
    reachable_only: true # 是否只发往可达分区
  compression: gzip      # 压缩
  max_message_bytes: 1000000  # Event最大字节数。默认1000000。应小于等于kafka broker message.max.bytes值
  required_acks: 1  # kafka ack等级
  worker: 3  # kafka output的最大并发数
  # version: 0.10.1      # kafka版本
  bulk_max_size: 2048    # 单次发往kafka的最大事件数
logging.to_files: true   # 输出所有日志到file,默认true, 达到日志文件大小限制时,日志文件会自动限制替换,详细配置:https://www.cnblogs.com/qinwengang/p/10982424.html
close_older: 30m         # 如果一个文件在某个时间段内没有发生过更新,则关闭监控的文件handle。默认1h
force_close_files: false # 这个选项关闭一个文件,当文件名称的变化。只在window建议为true 

#没有新日志采集后多长时间关闭文件句柄,默认5分钟,设置成1分钟,加快文件句柄关闭;
#close_inactive: 1m
#
##传输了3h后荏没有传输完成的话就强行关闭文件句柄,这个配置项是解决以上案例问题的key point;
#close_timeout: 3h
#
###这个配置项也应该配置上,默认值是0表示不清理,不清理的意思是采集过的文件描述在registry文件里永不清理,在运行一段时间后,registry会变大,可能会带来问题。
clean_inactive: 72h
#
##设置了clean_inactive后就需要设置ignore_older,且要保证ignore_older < clean_inactive
ignore_older: 70h
#
## 限制 CPU和内存资源
#max_procs: 1 
#queue.mem.events: 256
#queue.mem.flush.min_events: 128

启动脚本

#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=filebeat
 
PATH=/usr/bin:/sbin:/bin:/usr/sbin
export PATH
agent="/usr/local/filebeat/filebeat"
args="-c /usr/local/filebeat/filebeat.yml -path.home /usr/local/filebeat -path.config /usr/local/filebeat -path.data /usr/local/filebeat/data -path.logs /usr/local/filebeat/logs"

#检查程序是否在运行
is_exist(){
  pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
  #如果不存在返回1,存在返回0     
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}
 
#启动方法
start(){
  echo "------------${APP_NAME} start."
  is_exist
  if [ $? -eq "0" ]; then
    echo "------------${APP_NAME} is already running. pid=${pid} ."
  else
    $agent $args &
    filebeat_pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
    until [ -n "filebeat_pid" ]
        do
        filebeat_pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`  
        done
      echo "------------${APP_NAME} start success. pid=$filebeat_pid ."
  fi
}
 
#停止方法
stop(){
  is_exist
  if [ $? -eq "0" ]; then
    kill -9 $pid
    echo "------------${APP_NAME} killed success"
  else
    echo "------------${APP_NAME} is not running"
  fi  
}
 
#重启
restart(){
  stop
  start
}

status(){
    pid=`ps -ef |grep $APP_NAME |grep -v grep |awk '{print $2}'`
    if [ ! "$pid" ];then
        echo "filebeat is not running"
    else
        echo "filebeat is running"
    fi
}
 
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        restart
    ;;
    status)
        status
    ;;
    *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 1
esac

6、elastalert安装

version 0.2.1
报警插件,通过定时查询es来进行报警

6.1安装环境

Systemversion
centOS7.4
Python6.9
pip19.3
Elastic Stack7.6.0

6.2安装步骤

1.	进入安装目录/usr/share,直接使用pip安装
pip  install  elastalert

2.	进入elastalert项目根目录执行安装插件命令
pip install "setuptools>=11.3"

python setup.py install

pip install "elasticsearch>=5.0.0"

3.	复制配置文件并修改相关配置
cp  config.yaml.example   config.yaml

vi config.yaml
设置es_host、es_host指向你的Elasticsearch,然后保存退出。

6.3配置文件解析

此处的配置文件是指config.yaml文件。
rules_folder:ElastAlert将加载规则配置文件的地方,它将尝试加载文件夹中的每个.yaml文件。
run_every:ElastAlert查询Elasticsearch的频率。
buffer_time:是查询窗口的大小,从每个查询运行的时间向后延伸。对于其中use_count_query或use_terms_query设置为true的规则,此值将被忽略。
es_host:是Elasticsearch集群的地址,ElastAlert将存储有关其状态、查询运行、警报和错误的数据。每个规则也可以设置不同的elasticsearch主机进行查询。
es_port:Elasticsearch对应的端口。
use_ssl: (可选的)是否使用TLS;连接到es_host;设置为True或False。
verify_certs: (可选的)是否验证TLS证书; 设置为True或False,默认是True。
client_cert: (可选的)PEM证书的路径。
client_key: (可选的) 作为客户端密钥使用的私钥文件的路径。
ca_certs: (可选的) 用于验证SSL连接的CA证书的路径。
es_username: (可选的) 用于连接Elasticsearch的basic-auth用户名。
es_password: (可选的) 用于连接Elasticsearch的密码。
es_url_prefix: (可选的) Elasticsearch端点的URL前缀。
es_send_get_body_as: (可选的) 查询Elasticsearch方法- GET,POST或source,默认是GET。
writeback_index:是ElastAlert将存储数据的索引名称。
alert_time_limit: 是失败警报的重试窗口。

6.4创建索引

lastalert-create-index这个命令会在elasticsearch创建索引,便于ElastAlert将有关其查询及其警报的信息和元数据保存回Elasticsearch。这不是必须的步骤,但是强烈建议创建。因为对于审计,测试很有用,并且重启elastalert不影响计数和发送alert。默认情况下,创建的索引叫elastalert_status。

elastalert-create-index  --host 127.0.0.1 --port 9200 --username elastic  --password 1qaz@WSX --no-ssl --no-verify-certs

6.5配置smtp

在/usr/share/elastalert目录下创建文件smtp_auth_file.yaml,内容如下:

#邮箱用户名
user: example@email.com
#不是邮箱密码,是设置的SMTP密码
password: XXXXX

6.6创建规则

在es_rules目录下创建配置文件frequency.yaml,内容如下:

# Alert when the rate of events exceeds a threshold

# (Optional)
# Elasticsearch host


# (Optional)
# Elasticsearch port

# (OptionaL) Connect with SSL to Elasticsearch

# (Optional) basic-auth username and password for Elasticsearch
# (Required)
# Rule name, must be unique
name: frequency rule
use_strftine_index: true
# (Required)
# Type of alert.
# the frequency rule type alerts when num_events events occur with timeframe time
type: frequency

# (Required)
# Index to search, wildcard supported
index: test-2020

# (Required, frequency specific)
# Alert when this many documents matching the query occur within a timeframe
num_events: 1

# (Required, frequency specific)
# num_events must occur within this amount of time to trigger an alert
timeframe:
  minutes: 1

# (Required)
# A list of Elasticsearch filters used for find events
# These filters are joined with AND and nested in a filtered query
# For more info: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html
filter:
- query:
    query_string:
      query: "field: value"
# (Required)
# The alert is use when a match is found
smtp_host: smtp.qq.com
smtp_port: 587
smtp_auth_file: /usr/share/elastalert/smtp_auth_file.yaml  
email_reply_to: 939496422@qq.com
from_addr: 939496422@qq.com
alert:
- "email"

# (required, email specific)
# a list of email addresses to send alerts to
email:
- "weihang@game2sky.com"

上述规则表示:在elastalert执行的一分钟内,出现一条有field值为value日志,则触发告警,并且告警通知将以email的形式从939496422@qq.com邮箱发送给weihang@game2sky.com

规则解析

es_host、es_port:应该指向我们要查询的Elasticsearch集群。
name:是这个规则的唯一名称。如果两个规则共享相同的名称,ElastAlert将不会启动。
type:每个规则都有不同的类型,可能会采用不同的参数。该frequency类型表示“在timeframe时间内匹配成功次数超过num_events发出警报”。
index:要查询的索引的名称。
num_events:此参数特定于frequency类型,是触发警报时的阈值。
timeframe:timeframe是num_events必须发生的时间段。
filter:是用于过滤结果的Elasticsearch过滤器列表。
alert:警报。电子邮件警报需要SMTP服务器才能发送邮件。默认情况下,它将尝试使用localhost。这可以通过smtp_host选项更改。
email:是要发送警报的地址列表。

6.7运行

cd /var/share/elastalert

python -m elastalert.elastalert --verbose --rule es_rules/frequency.yaml

6.8给Elasticsearch添加测试数据

POST /test-2020/test
{
  "@timestamp": "2020-07-03T08:27:00.000Z",
 "field":"value is 1"
}

注意:上述的@timestamp是UTC时间,也就是说这条数据是在2020-07-03 16:27:00产生的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值