您好,登录后才能下订单哦!
# CentOS7下如何快速部署EFK服务
## 前言
在当今大数据时代,日志管理已成为IT系统运维和业务分析的重要环节。传统的日志管理方式如直接查看日志文件、使用grep等命令进行简单过滤已经无法满足企业级应用的需求。EFK(Elasticsearch + Fluentd + Kibana)堆栈作为新一代的日志收集、存储和可视化解决方案,凭借其高性能、可扩展性和易用性,已成为众多企业的首选方案。
本文将详细介绍在CentOS7操作系统下如何快速部署EFK服务,涵盖从环境准备到各个组件的安装配置,再到最终的集成测试全过程。通过本文的指导,读者可以在短时间内搭建起一套完整的日志管理系统,满足企业级日志处理需求。
## 第一章:EFK架构概述
### 1.1 EFK组件介绍
EFK由三个核心组件组成,每个组件承担不同的角色:
1. **Elasticsearch**:分布式搜索和分析引擎,负责日志的存储、索引和检索
   - 基于Lucene构建,提供近实时的搜索能力
   - 支持水平扩展,可处理PB级数据
   - 提供RESTful API接口,便于集成
2. **Fluentd**:开源数据收集器,负责日志的收集、过滤和转发
   - 采用插件式架构,支持多种输入输出方式
   - 提供强大的日志过滤和转换能力
   - 内存占用低,性能优异
3. **Kibana**:数据可视化平台,提供日志分析和展示功能
   - 丰富的图表类型和仪表板功能
   - 支持交互式查询和数据分析
   - 用户友好的界面,降低使用门槛
### 1.2 EFK与传统方案的对比
相比传统的ELK(使用Logstash)架构,EFK具有以下优势:
| 特性          | EFK (Fluentd)       | ELK (Logstash)      |
|---------------|---------------------|---------------------|
| 资源占用      | 内存占用低(~40MB)   | 内存占用高(~500MB)  |
| 性能          | 高吞吐量            | 相对较低            |
| 可靠性        | 内置重试机制        | 需要额外配置        |
| 部署复杂度    | 简单                | 较复杂              |
| 插件生态      | 丰富                | 非常丰富            |
### 1.3 EFK工作流程
典型的EFK日志处理流程如下:
1. **日志收集**:Fluentd从各种数据源(应用日志、系统日志、网络设备日志等)收集日志数据
2. **日志处理**:Fluentd对收集到的日志进行解析、过滤和格式化
3. **日志存储**:处理后的日志被发送到Elasticsearch进行索引和存储
4. **日志展示**:用户通过Kibana查询、分析和可视化日志数据
## 第二章:环境准备
### 2.1 系统要求
在开始部署前,请确保您的CentOS7系统满足以下要求:
- **硬件配置**:
  - 最低配置:2核CPU,4GB内存,50GB磁盘空间
  - 生产环境推荐:8核CPU,16GB内存,500GB+ SSD存储
- **软件环境**:
  - CentOS 7.6或更高版本
  - JDK 11或更高版本(Elasticsearch依赖)
  - Ruby 2.4+(Fluentd依赖)
### 2.2 系统初始化配置
#### 2.2.1 更新系统
```bash
sudo yum update -y
sudo yum install -y epel-release
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sudo systemctl start firewalld
sudo firewall-cmd --add-port={9200/tcp,5601/tcp,24224/tcp,24224/udp} --permanent
sudo firewall-cmd --reload
编辑/etc/sysctl.conf,添加以下内容:
vm.max_map_count=262144
fs.file-max=65536
应用配置:
sudo sysctl -p
Elasticsearch依赖Java环境,推荐安装OpenJDK 11:
sudo yum install -y java-11-openjdk java-11-openjdk-devel
验证安装:
java -version
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
创建仓库文件/etc/yum.repos.d/elasticsearch.repo:
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
sudo yum install -y elasticsearch
编辑主配置文件/etc/elasticsearch/elasticsearch.yml:
cluster.name: efk-cluster
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["127.0.0.1"]
cluster.initial_master_nodes: ["node-1"]
bootstrap.memory_lock: true
配置JVM参数(/etc/elasticsearch/jvm.options):
-Xms2g
-Xmx2g
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
curl -X GET "localhost:9200/"
正常输出示例:
{
  "name" : "node-1",
  "cluster_name" : "efk-cluster",
  "cluster_uuid" : "xxxxxxxx",
  "version" : {
    "number" : "7.10.2",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "xxxxxx",
    "build_date" : "2021-01-13T00:42:12.435326Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
编辑/etc/systemd/system/multi-user.target.wants/elasticsearch.service,添加:
[Service]
LimitMEMLOCK=infinity
重新加载配置:
sudo systemctl daemon-reload
sudo systemctl restart elasticsearch
对于日志类数据,建议配置索引生命周期策略:
curl -X PUT "localhost:9200/_ilm/policy/log_policy" -H 'Content-Type: application/json' -d'
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_size": "50GB",
            "max_age": "30d"
          }
        }
      },
      "delete": {
        "min_age": "90d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}
'
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent4.sh | sh
sudo /usr/sbin/td-agent-gem install fluent-plugin-elasticsearch
sudo /usr/sbin/td-agent-gem install fluent-plugin-multi-format-parser
编辑主配置文件/etc/td-agent/td-agent.conf:
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>
<source>
  @type tail
  path /var/log/messages
  pos_file /var/log/td-agent/syslog.log.pos
  tag system.syslog
  <parse>
    @type syslog
  </parse>
</source>
<filter system.**>
  @type record_transformer
  <record>
    hostname ${hostname}
  </record>
</filter>
<match system.**>
  @type elasticsearch
  host localhost
  port 9200
  logstash_format true
  logstash_prefix system
  logstash_dateformat %Y.%m.%d
  include_tag_key true
  type_name fluentd
  <buffer>
    @type file
    path /var/log/td-agent/buffer/elasticsearch
    flush_interval 10s
  </buffer>
</match>
sudo systemctl enable td-agent
sudo systemctl start td-agent
发送测试日志:
echo '{"message":"test log"}' | fluent-cat debug.test
检查Elasticsearch中是否已创建索引:
curl -X GET "localhost:9200/_cat/indices?v"
sudo yum install -y kibana
编辑配置文件/etc/kibana/kibana.yml:
server.port: 5601
server.host: "0.0.0.0"
server.name: "efk-kibana"
elasticsearch.hosts: ["http://localhost:9200"]
kibana.defaultAppId: "discover"
logging.dest: /var/log/kibana/kibana.log
sudo systemctl enable kibana
sudo systemctl start kibana
在浏览器中访问:http://<your-server-ip>:5601
system-*@timestampsystem-*索引模式<system>
  workers 4
</system>
<match system.**>
  @type elasticsearch
  # ...其他配置...
  <buffer>
    @type file
    path /var/log/td-agent/buffer/elasticsearch
    chunk_limit_size 8MB
    total_limit_size 4GB
    flush_interval 5s
    retry_max_interval 30
    retry_forever true
  </buffer>
</match>
在其他服务器上重复Elasticsearch安装步骤,修改配置文件:
cluster.name: efk-cluster
node.name: node-2
discovery.seed_hosts: ["node1-ip"]
cluster.initial_master_nodes: ["node-1"]
curl -X PUT "localhost:9200/_template/log_template" -H 'Content-Type: application/json' -d'
{
  "index_patterns": ["system-*"],
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}
'
编辑elasticsearch.yml:
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
设置密码:
sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
编辑kibana.yml:
elasticsearch.username: "kibana_system"
elasticsearch.password: "your_password"
解决方案:
sudo sysctl -w vm.max_map_count=262144
检查: - 网络连通性 - 集群名称是否一致 - discovery.seed_hosts配置是否正确
检查:
sudo tail -f /var/log/td-agent/td-agent.log
常见原因: - Elasticsearch服务不可达 - 缓冲区已满 - 网络防火墙阻止
解决方案: - 增加Fluentd worker数量 - 调整缓冲区大小 - 考虑使用Fluent Bit作为轻量级替代
检查: - Elasticsearch服务状态 - Kibana配置中的Elasticsearch地址 - 安全认证配置
优化建议: - 减少一次显示的数据量 - 使用索引模式过滤不必要的数据 - 增加Kibana服务器资源
启用内置监控:
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.collection.enabled: true
配置Fluentd暴露Prometheus指标:
<source>
  @type prometheus
  port 24231
</source>
<source>
  @type prometheus_output_monitor
  interval 10
</source>
配置共享存储:
path.repo: ["/mnt/elasticsearch_backups"]
创建仓库:
curl -X PUT "localhost:9200/_snapshot/my_backup" -H 'Content-Type: application/json' -d'
{
  "type": "fs",
  "settings": {
    "location": "/mnt/elasticsearch_backups"
  }
}
'
创建快照:
curl -X PUT "localhost:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true"
配置Fluentd收集Docker日志:
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>
<source>
  @type tail
  path /var/lib/docker/containers/*/*-json.log
  pos_file /var/log/td-agent/docker.log.pos
  tag docker.*
  <parse>
    @type json
    time_key time
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </parse>
</source>
使用Fluentd DaemonSet部署:
”`yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd namespace: logging spec: selector: matchLabels: app: fluentd template: metadata: labels: app: fluentd spec: containers: - name: fluentd image: fluent/fluentd-kubernetes-daemonset:v1.11.5-debian-elasticsearch7-1.0 env: - name: FLUENT_ELASTICSEARCH_HOST value: “elasticsearch.logging.svc.cluster.local” - name: FLUENT_ELASTICSEARCH_PORT value: “920
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。