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安装环境
| System | version |
|---|---|
| centOS | 7.4 |
| Python | 6.9 |
| pip | 19.3 |
| Elastic Stack | 7.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产生的。
6455

被折叠的 条评论
为什么被折叠?



