搭建ELK

1.1 操作系统优化
  • 修改/etc/security/limits.conf文件
    # 设置进程数和文件句柄数,添加以下参数
    * soft nofile 65536
    * hard nofile 131072
    * soft nproc 2048
    * hard nproc 4096
    
  • 修改/etc/sysctl.conf文件
    # 新增以下内容
    vm.max_map_count=262144
    
    # 生效
    sysctl -p
    
1.2 下载解压安装包
1.3 创建数据及日志存放目录
# 创建数据日志目录
mkdir /data/elasticsearch-7.17.22/{data,logs}

# 修改所有者和所属组,因为es不能用root启动,如果你新建了一个elastic用户这里修改成elastic即可
chown zxadmin.zxadmin -R /data/elasticsearch-7.17.22
1.4 修改配置文件
  • 配置文件elasticsearch.yml
    # 配置文件路径
    /data/elasticsearch-7.17.22/config/elasticsearch.yml
    
    # 修改以下内容
    # 集群名
    cluster.name: fkyanshou
    
    # 节点名
    node.name: node-1
    
    # 数据路径
    path.data: /data/elasticsearch-7.17.22/data
    
    # 日志路径
    path.logs: /data/elasticsearch-7.17.22/logs
    
    # 监听地址也可以是0.0.0.0
    network.host: 172.21.126.157
    
    # 设置对外服务的http端口,默认为9200
    http.port: 9201
    
    # 设置节点间交互的tcp端口,默认是9300
    transport.tcp.port: 9301
    
    # 组成集群的节点IP,节点发现
    discovery.seed_hosts: ["172.21.126.157"]
    
    # 初始化有资格成为master的节点,这里配置的三个节点都可以选为master
    cluster.initial_master_nodes: ["node-1"]
    
    # 开启认证
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    
  • 修改 elasticsearch jvm参数配置
    # 配置文件路径
    /data/elasticsearch-7.17.22/config/jvm.options
    
    # 修改以下内容,内存不大的话可以调小
    vim /data/elasticsearch-7.17.22/config/jvm.options
    -Xms4g
    -Xmx4g
    
1.5 启动elasticsearch
  • 启动
    # 注意一定要用普通用户启动,不能使用root启动,要先切换为普通用户
    # 后台启动命令
    bin/elasticsearch -d
    
1.6 设置密码
  • elasticsearch设置密码
    # 手动设置密码,后续kibana,filbeat等连接都需要,密码需牢记
    bin/elasticsearch-setup-passwords interactive
    
1.7 查看集群状态
  • 查看集群是否健康
    # 如果状态显示green说明集群是正常的
    curl -u elastic:123456 -XGET http://172.21.126.157:9201/_cat/health?v
    
1.8 补充集群配置文件并且生成认证文件
  • 生成认证文件并且设置密码

    1. 生成认证文件步骤
    # 步骤一
    获取elastic-stack-ca.p12文件,全部直接回车默认密码为空
    bin/elasticsearch-certutil ca
    
    # 步骤二
    获取elastic-certificates.p12,全部直接回车
    bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
    
    # 步骤三
    执行完成后会生成elastic-certificates.p12和elastic-stack-ca.p12这两个文件
    将文件移动到config目录下,并且要将elastic-certificates.p12文件拷贝到其他机器上也移到config目录下
    
    # 步骤四
    生成密码,要先启动服务
    bin/elasticsearch-setup-passwords interactive    "手动设置"
    bin/elasticsearch-setup-passwords auto    "自动生成"
    
  • 集群配置文件

    其他节点配置文件内容不变只需修改下面两个值node.name和network.host即可

    # 集群名称
    cluster.name: my-es
    # 节点名称
    node.name: node-1
    # 是否有资格为主节点
    node.master: true
    # 是否为数据节点
    node.data: true
    # 数据路径
    path.data: /data/es/data
    # 日志路径
    path.logs: /data/es/logs
    # ip 地址,填入每个节点的ip
    network.host: 172.25.231.67
    # 设置对外服务的http端口,默认为9200
    http.port: 9201
    # 设置节点间交互的tcp端口,默认是9300
    transport.tcp.port: 9301
    # 组成集群的节点IP,节点发现
    discovery.seed_hosts: ["172.25.231.67", "172.25.231.68", "172.25.231.69"]
    #发现超时时间
    discovery.zen.ping_timeout: 3s
    # 初始化有资格成为master的节点,这里配置的三个节点都可以选为master
    cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
    # 跨域
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
    
    # 开启认证
    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
    
1.9 补充内容
  • 设置elasticsearch自带的jdk
    不更改环境变量的情况下,更改bin目录下的elasticsearch-env文件指定自带的jdk,大概在37行的位置添加
    # now set the classpath
    ES_CLASSPATH="$ES_HOME/lib/*"
    # 增加下面这行添加改变量
    ES_JAVA_HOME="$ES_HOME/jdk"
    
    # now set the path to java
    if [ ! -z "$ES_JAVA_HOME" ]; then
      JAVA="$ES_JAVA_HOME/bin/java"
      JAVA_TYPE="ES_JAVA_HOME"
    

2 搭建Kibana

2.1 下载解压安装包
  • 下载链接
    [https://www.elastic.co/downloads/past-releases#kibana]:
  • 解压
    # 解压
    tar -xvf kibana-7.17.22-linux-x86_64.tar.gz -C /data
    
    # 注意kibana和es一样也需要用普通用户启动,因此这里要将解压后的目录重新设置所有者
    chown zxadmin.zxadmin -R kibana-7.17.22-linux-x86_64
    
2.2 修改kibana.yml配置文件
  • 配置文件kibana.yml
    # 配置文件路径
    /data/kibana-7.17.22-linux-x86_64/config/kibana.yml
    
    ### 修改以下内容
    # 服务端口
    server.port: 5601
    
    # 监听地址也可以是0.0.0.0
    server.host: "172.21.126.157"
    
    # 服务名称
    server.name: "kibana"
    
    # 解决server.publicBaseUrl 缺失,在生产环境中运行时应配置。某些功能可能运行不正常,不能以/结尾
    server.publicBaseUrl: "http://172.21.126.157:5601"
    
    # 连接elasticsearch的地址
    elasticsearch.hosts: ["http://172.21.126.157:9201"]
    
    # 使用kibana_system用户连接es集群,密码为上面部署es时候设置的密码
    elasticsearch.username: "kibana_system"
    elasticsearch.password: "123456"
    
    # 设置日志存储路径
    logging.dest: /data/kibana-7.17.22-linux-x86_64/kibana.log
    
    # 设置语言为中文
    i18n.locale: "zh-CN"
    
2.3 启动
  • 后台启动
    # 注意要使用普通用户启动,先切换为普通用户
    # 后台启动命令
    nohup bin/kibana &
    
  • 在浏览器中访问Kibana
    # 访问地址; 并输入elastic账号以及密码, 即你在elasticsearch初始化的账号密码
    172.21.126.157:5601
    

3 搭建FileBeat

3.1 下载解压安装包

注意:收集哪台机器上的日志就需要把filebeat安装到哪台机器

3.2 创建配置文件

创建新配置文件,原来的配置文件也可以使用,只不过内容太多,我们这里创建新的配置文件,只留有用配置,启动的时候指定配置文件路径即可,新建的配置文件以 .yml 结尾,并且权限必须为644也可以是600,只有所有者有写权限

  • 创建收集nginx日志的配置文件
    # 进入解压目录
    cd /data/filebeat-7.17.22-linux-x86_64
    
    # vim nginx.yml
    filebeat.inputs:
    # 新版本使用filestream类型,以前的版本使用的是log类型
    - type: filestream
      # 每个文件流必须具有唯一的id
      id: nginx-access-id
      # 该设置如果是false就会不收取改路径下的日志,收取开关
      enabled: true
      paths:
        - /data/nginx/logs/access.log
      # 设置黑名单排除指定的内容不收取
      exclude_lines: ['^DBG']
      # 设置标签,可以是多个,下面可以用来做判断将日志输出到不同的索引里
      tags: ["access"]
    
    - type: filestream
      id: nginx-error-id
      enabled: true
      paths:
        - /data/nginx/logs/error.log
      exclude_lines: ['^DBG']
      tags: ["error"]
    
    output.elasticsearch:
      hosts: ["172.21.126.157:9201"]
      username: "elastic"
      password: "Ysh#2y6T"
      indices:
        # 设置的索引名称要和下面定义的索引模板名称一样
        - index: "nginx-access-%{+yyyy.MM.dd}"
          when.contains:
            tags: "access"
        - index: "nginx-error-%{+yyyy.MM.dd}"
          when.contains:
            tags: "error"
    
    # 禁⽤索引⽣命周期管理,这个配置不禁用的话,下面的索引模板配置不生效,创建的索引依旧是默认的索引名
    setup.ilm.enabled: false
    # 设置索引模板的名称
    setup.template.name: "nginx"
    # 设置索引模板的匹配模式 
    setup.template.pattern: "nginx*"
    # 覆盖已有的索引模板
    setup.template.overwrite: false
    # 配置索引模板
    setup.template.settings:
      # 设置分⽚数量
      index.number_of_shards: 1
      # 设置副本数量,要求⼩于集群的数量,因为我的es是单节点所以不设置副本
      index.number_of_replicas: 0
    
  • 创建收集java日志的配置文件
    filebeat.inputs:
    #=========================== billing
    - type: filestream
      id: billing-info-id
      enabled: true
      paths:
        - /data/app/billing/logs/info.log
      tags: ["billing-info"]
    
    - type: filestream
      id: billing-error-id
      enabled: true
      paths:
        - /data/app/billing/logs/sys-error.log
      tags: ["billing-error"]
    
    #=========================== business
    - type: filestream
      id: business-info-id
      enabled: true
      paths:
        - /data/app/business/logs/info.log
      tags: ["business-info"]
    
    - type: filestream
      id: business-error-id
      enabled: true
      paths:
        - /data/app/business/logs/sys-error.log
      tags: ["business-error"]
    
    #=========================== customer-manage
    - type: filestream
      id: customer-manage-info-id
      enabled: true
      paths:
        - /data/app/customer-manage/logs/info.log
      tags: ["customer-manage-info"]
    
    - type: filestream
      id: customer-manage-error-id
      enabled: true
      paths:
        - /data/app/customer-manage/logs/sys-error.log
      tags: ["customer-manage-error"]
    
    #=========================== interface
    - type: filestream
      id: interface-info-id
      enabled: true
      paths:
        - /data/app/interface/logs/info.log
      tags: ["interface-info"]
    
    - type: filestream
      id: interface-error-id
      enabled: true
      paths:
        - /data/app/interface/logs/sys-error.log
      tags: ["interface-error"]
    
    #=========================== ruoyi
    - type: filestream
      id: ruoyi-info-id
      enabled: true
      paths:
        - /data/app/ruoyi/logs/sys-info.log
      tags: ["ruoyi-info"]
    
    - type: filestream
      id: ruoyi-error-id
      enabled: true
      paths:
        - /data/app/ruoyi/logs/sys-error.log
      tags: ["ruoyi-error"]
    
    #=========================== work-flow
    - type: filestream
      id: work-flow-info-id
      enabled: true
      paths:
        - /data/app/work-flow/logs/sys-info.log
      tags: ["work-flow-info"]
    
    - type: filestream
      id: work-flow-error-id
      enabled: true
      paths:
        - /data/app/work-flow/logs/sys-error.log
      tags: ["work-flow-error"]
    
    #=========================== work-order
    - type: filestream
      id: work-order-info-id
      enabled: true
      paths:
        - /data/app/work-order/logs/info.log
      tags: ["work-order-info"]
    
    - type: filestream
      id: work-order-error-id
      enabled: true
      paths:
        - /data/app/work-order/logs/sys-error.log
      tags: ["work-order-error"]
    
    #=========================== 输出 
    
    output.elasticsearch:
      hosts: ["172.21.126.157:9201"]
      username: "elastic"
      password: "Ysh#2y6T"
      indices:
        - index: "java-billing-info-%{+yyyy.MM.dd}"
          when.contains:
            tags: "billing-info"
        - index: "java-billing-error-%{+yyyy.MM.dd}"
          when.contains:
            tags: "billing-error"
    
        - index: "java-business-info-%{+yyyy.MM.dd}"
          when.contains:
            tags: "business-info"
        - index: "java-business-error-%{+yyyy.MM.dd}"
          when.contains:
            tags: "business-error"
    
        - index: "java-customer-manage-info-%{+yyyy.MM.dd}"
          when.contains:
            tags: "customer-manage-info"
        - index: "java-customer-manage-error-%{+yyyy.MM.dd}"
          when.contains:
            tags: "customer-manage-error"
    
        - index: "java-interface-info-%{+yyyy.MM.dd}"
          when.contains:
            tags: "interface-info"
        - index: "java-interface-error-%{+yyyy.MM.dd}"
          when.contains:
            tags: "interface-error"
    
        - index: "java-ruoyi-info-%{+yyyy.MM.dd}"
          when.contains:
            tags: "ruoyi-info"
        - index: "java-ruoyi-error-%{+yyyy.MM.dd}"
          when.contains:
            tags: "ruoyi-error"
    
        - index: "java-work-flow-info-%{+yyyy.MM.dd}"
          when.contains:
            tags: "work-flow-info"
        - index: "java-work-flow-error-%{+yyyy.MM.dd}"
          when.contains:
            tags: "work-flow-error"
    
        - index: "java-work-order-info-%{+yyyy.MM.dd}"
          when.contains:
            tags: "work-order-info"
        - index: "java-work-order-error-%{+yyyy.MM.dd}"
          when.contains:
            tags: "work-order-error"
    
    
    
    # 禁⽤索引⽣命周期管理
    setup.ilm.enabled: false
    # 设置索引模板的名称
    setup.template.name: "java"
    # 设置索引模板的匹配模式 
    setup.template.pattern: "java*"
    # 覆盖已有的索引模板
    setup.template.overwrite: true
    # 配置索引模板
    setup.template.settings:
      # 设置分⽚数量
      index.number_of_shards: 1
      # 设置副本数量,要求⼩于集群的数量
      index.number_of_replicas: 0
    
  • 检测配置文件语法是否正确
    # 显示Ok即为正常
    ./filebeat test config nginx.yml 
    Config OK
    
3.3 启动filebeat
  • 启动
    # 前台启动
    ./filebeat -e -c nginx.yml
    
    # 后台启动方式一
    # 如果不加最后的disown 此时你关闭终端,断开ssh连接,会导致这个nohup进程也同时终止。因为断开连接时,会发送SIGHUP信号给当前shell的作业列表的所有进程,nohup进程接收到SIGHUP信号后终止。
    # disown参数将会使启动的nohup进程从当前shell的作业列表中清除,从而避免nohup进程在关闭这个shell时接收到SIGHUP信号。
    nohup ./filebeat -e -c nginx.yml >/dev/null 2>&1 & disown
    
    # 后台启动方式二
    # 注意这里执行之后要使用exit退出终端,不然会直接停掉程序
    nohup ./filebeat -e -c nginx.yml >/dev/null 2>&1 &