ELK Stack(Elasticsearch、Logstash、Kibana)是一个功能强大的日志管理和分析解决方案。它能够帮助我们收集、存储、搜索和可视化大量日志数据,从而更好地监控系统运行状况、排查问题和进行业务分析。
部署前准备
软件包准备
清华下载源: https://mirrors.tuna.tsinghua.edu.cn/elasticstack/
Elastic下载源 https://www.elastic.co/downloads/
可以选择 二进制方式或RPM包安装,本次为rpm包安装---简单
1) 设置环境变量
# 修改环境变量文件
vim /etc/profile
ulimit -n 65535
# 使配置生效
source /etc/profile
2) 修改limits.com配置文件
# 修改limits.conf配置
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
3) 验证
# ulimit -n
65535
4) 修改虚拟内存数大小
cat >> /etc/sysctl.conf << EOF
vm.max_map_count=262144
EOF
# sysctl -p
vm.max_map_count = 262144
5) 关闭swap分区
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
一、Elasticsearch部署
准备好软件包,以RPM包为例
rpm -ivh 直接安装 elasticsearch kibana
Elasticsearch 是 ELK Stack 的核心组件,负责存储和索引所有日志数据。
1. Elasticsearch 配置文件 (elasticsearch.yml)
# egrep -v "^$|^#" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-application # 定义集群名称,建议保持一致
node.name: node-1 # 当前节点的名称
path.data: /var/lib/elasticsearch # 数据存储路径,建议使用独立磁盘分区
path.logs: /var/log/elasticsearch # 日志存储路径
# 网络配置
network.host: 0.0.0.0 # 监听所有网络接口,生产环境建议指定具体IP或网段
http.port: 9200 # HTTP 监听端口
# 集群发现
# cluster.initial_master_nodes 仅在首次启动集群时使用。
# 对于单节点部署,它指定了唯一的主节点。
# 对于多节点集群,需要列出所有主节点符合条件的节点名称。
cluster.initial_master_nodes: ["node-1"]
# 内存锁定:防止 Elasticsearch 进程被操作系统交换到磁盘,提高性能
bootstrap.memory_lock: true
# JVM 配置:通常在 jvm.options 文件中配置,但如果需要快速设置,也可以在这里。
# 建议通过 jvm.options 配置,此处仅作提示
# jvm.options 文件通常位于 /etc/elasticsearch/jvm.options
# -Xms4g
# -Xmx4gcluster.name: 建议为你的集群起一个有意义的名称,
node.name: 每个节点都应该有一个唯一的名称。
path.data 和 path.logs: 强烈建议将数据目录 (path.data) 配置到独立的、高性能的磁盘分区上,以保证数据安全和读写性能。 日志目录 (path.logs) 也应有足够的空间。
network.host: 在生产环境中,为了安全起见,通常不建议设置为 0.0.0.0。你应该将其设置为 Elasticsearch 服务的具体 IP 地址,或者一个受限的 IP 地址段,以限制外部访问。
cluster.initial_master_nodes: 这个参数只在集群首次启动时需要。对于单节点部署,它就是你的 node.name。对于多节点集群,你需要列出所有符合主节点资格的节点名称。一旦集群形成,这个参数就不再需要了,或者你可以在后续操作中移除。
bootstrap.memory_lock: true: 这是非常重要的配置,可以防止操作系统将 Elasticsearch 的 JVM 内存交换到磁盘,从而显著提高性能和稳定性。你需要确保运行 Elasticsearch 的用户有锁定内存的权限,通常通过 ulimit -l unlimited 或在 /etc/security/limits.conf 中配置。
JVM 内存配置 (-Xms, -Xmx): 虽然你的笔记中没有体现,但这是 Elasticsearch 性能的关键。通常在 /etc/elasticsearch/jvm.options 文件中进行配置。建议将 -Xms 和 -Xmx 设置为相同的初始和最大堆内存大小,通常为服务器物理内存的一半,但不超过 31GB(JVM 指针压缩的限制)。二、Kibana 部署
Kibana 是 Elasticsearch 的数据可视化和管理工具。
1. Kibana 配置文件 (kibana.yml)
# egrep -v "^$|^#" /etc/kibana/kibana.yml
server.port: 5601 # Kibana 监听端口
server.host: "0.0.0.0" # Kibana 监听地址,生产环境建议指定具体IP
i18n.locale: "zh-CN" # 设置 Kibana 界面语言为中文
# Elasticsearch 连接配置,用于 Kibana 连接到 Elasticsearch
elasticsearch.username: "elastic" # 连接 Elasticsearch 的用户名
elasticsearch.password: "gmIkbka9Yy6lO9xWHdjT" # 连接 Elasticsearch 的密码
elasticsearch.hosts: ["http://localhost:9200"] # Elasticsearch 主机地址,如果 Elasticsearch 在不同机器,需要更改server.host: 同 Elasticsearch,在生产环境中,出于安全考虑,建议将其设置为 Kibana 服务所在机器的具体 IP 地址。
elasticsearch.username 和 elasticsearch.password: 这将用于 Kibana 连接到 Elasticsearch 进行身份验证。确保这些凭据与你为 Elasticsearch X-Pack 安全配置的用户匹配。
elasticsearch.hosts: 非常重要! 你的笔记中没有包含这个配置,但 Kibana 必须知道 Elasticsearch 的地址才能连接。如果 Elasticsearch 运行在同一台机器上,["http://localhost:9200"] 是可以的。如果 Elasticsearch 运行在不同的机器或集群中,你需要将其修改为正确的 IP 地址或域名,例如 ["http://your_es_ip:9200"] 或 ["https://your_es_domain:9200"] (如果启用了 HTTPS)2. Kibana 登录日志记录功能
logging:
appenders:
file:
type: file
fileName: /var/log/kibana/kibana.log # 日志文件路径
layout:
type: json # 日志输出格式为 JSON
loggers:
- name: http.server # 捕获 HTTP 服务器相关的日志
level: debug # 日志级别设置为 debug,可根据需要调整为 info、warn 等
appenders: [file] # 将日志输出到上面定义的文件 appender
- name: elasticsearch.connector # 增加 Elasticsearch 连接器的日志,便于排查连接问题
level: debug
appenders: [file]
- name: xpack.security.authentication # 增加安全认证相关的日志,记录登录尝试等
level: debug
appenders: [file]3. 配合 Kibana 日志使用 Logrotate
Logrotate 是 Linux 系统中用于管理日志文件的实用程序,可以定期轮换、压缩和删除旧的日志文件,防止日志文件过大。
# 通常在大多数 Linux 发行版上已预装,如果未安装,请根据你的发行版进行安装
# Debian/Ubuntu:
sudo apt-get install logrotate
# CentOS/RHEL:
sudo yum install logrotate/var/log/kibana/kibana.log {
daily # 每日轮换
rotate 7 # 保留最近 7 个归档日志文件
compress # 归档时压缩日志文件(.gz)
delaycompress # 延迟压缩:上一个日志文件轮换后再进行压缩
missingok # 如果日志文件不存在也不报错
notifempty # 如果日志文件为空,则不进行轮换
create 0640 kibana kibana # 轮换后创建新的日志文件,权限 0640,用户和组均为 kibana
su kibana kibana # 以 kibana 用户和组的身份执行此脚本,确保权限正确
}
三、为 Elasticsearch 启动 X-Pack 功能 (账号密码认证)
X-Pack 是 Elasticsearch 的扩展,提供了安全、监控、报警等功能。开启 X-Pack 安全功能可以为 Elasticsearch 和 Kibana 提供用户名密码认证
1. Elasticsearch 配置 (elasticsearch.yml)
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
注意,单台es 只配置这两个 ,不需要配置 证书 ,后面可以正常破解,2.初始化密码
bin/elasticsearch-setup-passwords auto / interactive
注意:要在/usr/share/elasticsearch/执行主要是elasticsearch这个程序
保存界面出现的账号密码
到一部 账号密码登录功能就开启完成了3.开启集群通信内部证书功能
./elasticsearch-certutil ca 回车默认
注意:要在/usr/share/elasticsearch/执行主要是elasticsearch这个程序
执行完后会在/usr/share/elasticsearch/这个目录下生成一个elastic-stack-ca.p12 ca文件
接着执行
./elasticsearch-certutil cert --ca /usr/share/elasticsearch/elastic-stack-ca.p12 回车默认
执行完后会在/usr/share/elasticsearch/这个目录下生成一个elastic-certificates.p12文件就是要这个
然后将这个elastic-certificates.p12 文件移动到 和elasticearch.yml同一目录下
并要修改这个文件的所属为chown elasticsearch:elasticsearch xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12elasticsearch.username: "elastic"
elasticsearch.password: "Aw5KlmoPTWi4Uo2N9f6t"完成后重启两个服务
4.开启kibana的加密 https登录
首选就是要准备ssl证书
这一步也可以在 es内部证书签发之前做。两个互相不影响
注意:自签的证书也可以
然后再kibana的配置页面中添加如下
server.ssl.enabled: true
server.ssl.certificate: /etc/kibana/server.crt
server.ssl.key: /etc/kibana/server.key
添加完后重启kibana等一会就可以用https登录了
注意:证书要写绝对路路径,并且 所有者和所属组都要是kbiana四、Logstash部署
软件可以参考链接下载,rpm包可以直接安装
1.RPM包安装logstash
以RPM包安装Logstash时,默认以Logstash用户启动Logstash,在root用户下配置的文件,需要修改logstash的配置文件的权限
cd /var/lib/logstash
chown -R logstash:logstash *
cd /var/log/logstash
chown -R logstash:logstash *
cd /etc/logstash/
chown -R logstash:logstash *2.Logstash配置
input {
beats {
type => "winlog"
port => 5044
}
syslog {
# host => "10.10.10.1"
port => "514"
type=>"syslog"
}
}
output {
if [type] == "winlog" {
elasticsearch {
hosts => ["http://192.168.0.100:9200"]
index => "winlog-%{+YYYY.MM.dd}"
user => "elastic"
password => "123456"
}
}
if [type] == "syslog" {
elasticsearch {
hosts => ["http://192.168.0.100:9200"]
index => "syslog-%{+YYYY.MM.dd}"
user => "elastic"
password => "123456"
}
}
}启动logstash
# systemctl start logstash
3.logstash无法监听514端口的解决方法
Linux默认端口在1024下的程序是要在root下才能使用的,所以logstash直接监听514需要用root用户启动
vim /etc/logstash/startup.options
LS_USER=root
LS_GROUP=root# 测试logstash
logstash -e 'input { stdin { } } output { stdout {} }'
输入:hello4.Logstash优化
#!/bin/bash
# 使用 root 用户
LOGSTASH_USER="root"
echo "开始系统网络和文件句柄优化..."
# 备份原有 sysctl.conf
cp /etc/sysctl.conf /etc/sysctl.conf.bak.$(date +%F-%T)
# 设置系统最大文件句柄数
grep -q "^fs.file-max" /etc/sysctl.conf && sed -i "s/^fs.file-max.*/fs.file-max = 2097152/" /etc/sysctl.conf || echo "fs.file-max = 2097152" >> /etc/sysctl.conf
# 设置 TCP 优化参数,若已存在则替换,否则追加
for param in net.ipv4.tcp_tw_reuse net.ipv4.tcp_fin_timeout net.ipv4.tcp_max_tw_buckets; do
case $param in
net.ipv4.tcp_tw_reuse) value=1 ;;
net.ipv4.tcp_fin_timeout) value=15 ;;
net.ipv4.tcp_max_tw_buckets) value=6000 ;;
esac
grep -q "^$param" /etc/sysctl.conf && sed -i "s/^$param.*/$param = $value/" /etc/sysctl.conf || echo "$param = $value" >> /etc/sysctl.conf
done
# 立即应用 sysctl 配置
sysctl -p
echo "sysctl 参数已生效."
# 配置 root 用户文件句柄限制
LIMITS_CONF="/etc/security/limits.conf"
BACKUP_LIMITS_CONF="/etc/security/limits.conf.bak.$(date +%F-%T)"
cp $LIMITS_CONF $BACKUP_LIMITS_CONF
# 判断是否已配置
if grep -q "^$LOGSTASH_USER.*nofile" $LIMITS_CONF; then
sed -i "/^$LOGSTASH_USER.*nofile/d" $LIMITS_CONF
fi
echo "$LOGSTASH_USER soft nofile 65535" >> $LIMITS_CONF
echo "$LOGSTASH_USER hard nofile 65535" >> $LIMITS_CONF
echo "root 用户的文件句柄限制已设置为 65535."
# 提示
echo "请确保 /etc/pam.d/common-session 文件中包含以下行以生效:"
echo "session required pam_limits.so"
echo "优化完成!建议重启服务器或者重新登录该用户以使文件句柄限制生效。"
#!/bin/bash
# 目标用户,请根据实际运行Logstash的用户名修改
LOGSTASH_USER="logstash"
echo "开始系统网络和文件句柄优化..."
# 备份原有 sysctl.conf
cp /etc/sysctl.conf /etc/sysctl.conf.bak.$(date +%F-%T)
# 设置系统最大文件句柄数
grep -q "^fs.file-max" /etc/sysctl.conf && sed -i "s/^fs.file-max.*/fs.file-max = 2097152/" /etc/sysctl.conf || echo "fs.file-max = 2097152" >> /etc/sysctl.conf
# 设置 TCP 优化参数,若已存在则替换,否则追加
for param in net.ipv4.tcp_tw_reuse net.ipv4.tcp_fin_timeout net.ipv4.tcp_max_tw_buckets; do
case $param in
net.ipv4.tcp_tw_reuse) value=1 ;;
net.ipv4.tcp_fin_timeout) value=15 ;;
net.ipv4.tcp_max_tw_buckets) value=6000 ;;
esac
grep -q "^$param" /etc/sysctl.conf && sed -i "s/^$param.*/$param = $value/" /etc/sysctl.conf || echo "$param = $value" >> /etc/sysctl.conf
done
# 立即应用 sysctl 配置
sysctl -p
echo "sysctl 参数已生效."
# 配置用户文件句柄限制
LIMITS_CONF="/etc/security/limits.conf"
BACKUP_LIMITS_CONF="/etc/security/limits.conf.bak.$(date +%F-%T)"
cp $LIMITS_CONF $BACKUP_LIMITS_CONF
# 判断是否已配置
if grep -q "^$LOGSTASH_USER.*nofile" $LIMITS_CONF; then
sed -i "/^$LOGSTASH_USER.*nofile/d" $LIMITS_CONF
fi
echo "$LOGSTASH_USER soft nofile 65535" >> $LIMITS_CONF
echo "$LOGSTASH_USER hard nofile 65535" >> $LIMITS_CONF
echo "用户 $LOGSTASH_USER 的文件句柄限制已设置为 65535."
# 提示
echo "请确保 /etc/pam.d/common-session 文件中包含以下行以生效:"
echo "session required pam_limits.so"
echo "优化完成!建议重启服务器或者重新登录该用户以使文件句柄限制生效。"
#!/bin/bash
#auth: qian1.zhao@dhc.com.cn
# 定义 Logstash 配置文件路径和启动命令
LOGSTASH_CONF="/usr/share/logstash/config/conf.d/elk.conf"
LOGSTASH_CMD="nohup /usr/share/logstash/bin/logstash -f $LOGSTASH_CONF > /root/elk/nohup.out 2>&1 &"
# 检查 Logstash 进程是否存在
if pgrep -f "logstash.*-f $LOGSTASH_CONF" > /dev/null; then
echo "$(date '+%F %T') - Logstash 已经在运行."
else
echo "$(date '+%F %T') - Logstash 未运行,启动 Logstash..."
eval $LOGSTASH_CMD
sleep 2
if pgrep -f "logstash.*-f $LOGSTASH_CONF" > /dev/null; then
echo "$(date '+%F %T') - Logstash 启动成功."
else
echo "$(date '+%F %T') - Logstash 启动失败,请检查日志。"
fi
fi5.logstash同时运行多个进程
- pipeline.id: daily #唯一id(标识用的)
pipeline.workers: 4 #和电脑的cpu一致就行 #开启线程数量
pipeline.batch.size: 3000
path.config: "logstash的conf文件路径"
- pipeline.id: main
pipeline.workers: 4
pipeline.batch.size: 3000
path.config: "logstash的conf文件路径" #指定对应conf文件
启动
./bin/logstash
注:配置pipelines.yml 文件后,无需再指定conf,直接启动即可6.将logstash启动服务器配置为systemd方式启动
# vi /etc/systemd/system/logstash.service
[Unit]
Description=Logstash
After=network.target
[Service]
Type=simple
User=logstash # 注意用户,如果是root的话 ,需要改成root
Group=logstash # 注意用户,如果是root的话 ,需要改成root
ExecStart=/usr/local/bin/logstash/bin/logstash -f /usr/local/bin/logstash/config/conf.d/logstash.conf
Restart=on-failure
[Install]
WantedBy=multi-user.target
解释:
Description: 描述服务的功能。
After: 指定服务启动的顺序,确保在网络服务启动后再启动 Logstash。
Type: 服务的启动类型,simple 表示服务的主进程将是 ExecStart 命令。
User 和 Group: 指定运行 Logstash 的用户和组。如果 Logstash 运行在特定用户下(例如 logstash 用户),请确保这些用户和组已经存在,并且具有适当的权限。
ExecStart: 启动 Logstash 的命令行。
Restart: 服务失败后的重启策略,这里设置为 on-failure 表示只有在服务失败时才重启。
WantedBy: 指定服务的目标运行级别,multi-user.target 表示服务将在多用户模式下启动。