搭建ELK
1 搭建Elastic search
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 下载解压安装包
- 下载地址
[https://www.elastic.co/cn/downloads/past-releases#elasticsearch]: - 解压
# 解压 tar -xvf elasticsearch-7.17.22 -C /data
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安装到哪台机器
- 下载链接
[https://www.elastic.co/downloads/past-releases#filebeat]: - 解压
# 解压 tar -xvf filebeat-7.17.22-linux-x86_64.tar.gz -C /data
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 &