一、Docker安装-离线

1.1下载 Docker 离线包

链接:https://pan.baidu.com/s/1HTEHMuU3K0k07Ej97CFPRQ?pwd=7734 提取码:7734
–来自百度网盘超级会员V6的分享

在这里可以选择自己需要的版本进行下载:
https://download.docker.com/linux/static/stable/

1.2离线安装工具

https://github.com/Jrohy/docker-install/
按图示下载安装工具:
在这里插入图片描述

链接:https://pan.baidu.com/s/1PYqAU2jOadCWrjjnjtmPOQ?pwd=7734 提取码:7734
–来自百度网盘超级会员V6的分享

1.3安装

将前面下载的以下文件放入服务器的 /root/docker-install 文件夹下:

- [docker-install]
	- docker-20.10.6.tgz
	- install.sh
	- docker.bash

执行安装:

# 进入 docker-install 文件夹
cd docker-install

# 为 docker-install 添加执行权限
chmod +x install.sh

# 安装
./install.sh -f docker-20.10.6.tgz

1.4镜像加速

由于国内网络问题,需要配置加速器来加速。
修改配置文件 /etc/docker/daemon.json

下面命令直接生成文件 daemon.json

cat <<EOF > /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}
EOF

1.5确认安装结果

docker info

docker run hello-world

ps:在线安装Docker

我们使用 Docker 来运行 Elasticsearch,首先安装 Docker,参考下面笔记:

Docker笔记

二、Docker搭建ES集群

2.1关闭防火墙

后面我们要使用多个端口,为了避免繁琐的开放端口操作,我们关掉防火墙

# 关闭防火墙
systemctl stop firewalld.service

# 禁用防火墙
systemctl disable firewalld.service

2.2下载 Elastic Search 镜像

docker pull elasticsearch:7.9.3

链接:https://pan.baidu.com/s/1s9BCzzE-BmKAbU2IAjLouQ?pwd=7734 提取码:7734
–来自百度网盘超级会员V6的分享

2.3集群部署结构

在这里插入图片描述
在一台服务器上,使用Docker部署三个ES容器组成的集群

2.4准备虚拟网络和挂载目录

# 创建虚拟网络
docker network create es-net

# node1 的挂载目录
mkdir -p -m 777 /var/lib/es/node1/plugins
mkdir -p -m 777 /var/lib/es/node1/data

# node2 的挂载目录
mkdir -p -m 777 /var/lib/es/node2/plugins
mkdir -p -m 777 /var/lib/es/node2/data

# node3 的挂载目录
mkdir -p -m 777 /var/lib/es/node3/plugins
mkdir -p -m 777 /var/lib/es/node3/data

2.5设置 max_map_count

必须修改系统参数 max_map_count,否则 Elasticsearch 无法启动:

/etc/sysctl.conf 文件中添加 vm.max_map_count=262144

echo 'vm.max_map_count=262144' >>/etc/sysctl.conf

# 立即生效
sysctl -p

确认参数配置:

cat /etc/sysctl.conf

2.6启动 Elasticsearch 集群

node1:

docker run -d \
  --name=node1 \
  --restart=always \
  --net es-net \
  -p 9200:9200 \
  -p 9300:9300 \
  -v /var/lib/es/node1/plugins:/usr/share/elasticsearch/plugins \
  -v /var/lib/es/node1/data:/usr/share/elasticsearch/data \
  -e node.name=node1 \
  -e node.master=true \
  -e network.host=node1 \
  -e discovery.seed_hosts=node1,node2,node3 \
  -e cluster.initial_master_nodes=node1 \
  -e cluster.name=es-cluster \
  -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
  elasticsearch:7.9.3

环境变量说明:
在这里插入图片描述参考 https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html

node2:

docker run -d \
  --name=node2 \
  --restart=always \
  --net es-net \
  -p 9201:9200 \
  -p 9301:9300 \
  -v /var/lib/es/node2/plugins:/usr/share/elasticsearch/plugins \
  -v /var/lib/es/node2/data:/usr/share/elasticsearch/data \
  -e node.name=node2 \
  -e node.master=true \
  -e network.host=node2 \
  -e discovery.seed_hosts=node1,node2,node3 \
  -e cluster.initial_master_nodes=node1 \
  -e cluster.name=es-cluster \
  -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
  elasticsearch:7.9.3

node3:

docker run -d \
  --name=node3 \
  --restart=always \
  --net es-net \
  -p 9202:9200 \
  -p 9302:9300 \
  -v /var/lib/es/node3/plugins:/usr/share/elasticsearch/plugins \
  -v /var/lib/es/node3/data:/usr/share/elasticsearch/data \
  -e node.name=node3 \
  -e node.master=true \
  -e network.host=node3 \
  -e discovery.seed_hosts=node1,node2,node3 \
  -e cluster.initial_master_nodes=node1 \
  -e cluster.name=es-cluster \
  -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
  elasticsearch:7.9.3

2.7查看启动结果结果

http://192.168.128.136:9200
在这里插入图片描述
http://192.168.128.136:9200/_cat/nodes
在这里插入图片描述

2.8chrome浏览器插件:elasticsearch-head

elasticsearch-head 项目提供了一个直观的界面,可以很方便地查看集群、分片、数据等等。elasticsearch-head最简单的安装方式是作为 chrome 浏览器插件进行安装。

  1. 在 elasticsearch-head 项目仓库中下载 chrome 浏览器插件
    https://github.com/mobz/elasticsearch-head/raw/master/crx/es-head.crx
  2. 将文件后缀改为 zip
  3. 解压缩
  4. 在 chrome 浏览器中选择“更多工具”–“扩展程序”
  5. 在“扩展程序”中确认开启了“开发者模式”
  6. 点击“加载已解压的扩展程序”
  7. 选择前面解压的插件目录
  8. 在浏览器中点击 elasticsearch-head 插件打开 head 界面,并连接
    在这里插入图片描述

2.9Elasticsearch安装IK中文分词器

从 ik 分词器项目仓库中下载 ik 分词器安装包,下载的版本需要与 Elasticsearch 版本匹配:
https://github.com/medcl/elasticsearch-analysis-ik

链接:https://pan.baidu.com/s/11omvwfDly4_HU-z8ESCkeQ?pwd=7734 提取码:7734
–来自百度网盘超级会员V6的分享

下载 elasticsearch-analysis-ik-7.9.3.zip 复制到 /root/ 目录下

在三个节点上安装 ik 分词器

cd ~/

# 复制 ik 分词器到三个 es 容器
docker cp elasticsearch-analysis-ik-7.9.3.zip node1:/root/
docker cp elasticsearch-analysis-ik-7.9.3.zip node2:/root/
docker cp elasticsearch-analysis-ik-7.9.3.zip node3:/root/

# 在 node1 中安装 ik 分词器
docker exec -it node1 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip

# 在 node2 中安装 ik 分词器
docker exec -it node2 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip

# 在 node3 中安装 ik 分词器
docker exec -it node3 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip

# 重启三个 es 容器
docker restart node1 node2 node3

查看安装结果
在浏览器中访问 http://192.168.128.136:9200/_cat/plugins
在这里插入图片描述

如果插件不可用,可以卸载后重新安装:


docker exec -it node2 elasticsearch-plugin remove analysis-ik

docker exec -it node3 elasticsearch-plugin remove analysis-ik ```

ik分词测试
ik分词器提供两种分词器: ik_max_wordik_smart

ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;

ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。

ik_max_word 分词测试
使用 head 执行下面测试:
http://192.168.128.136:9200/_analyze 路径提交 POST 请求,并在协议体中提交 Json 数据:

{
  "analyzer":"ik_max_word",
  "text":"中华人民共和国国歌"
}

在这里插入图片描述
ik_smart 分词测试
使用 head 执行下面测试:
http://192.168.128.136:9200/_analyze 路径提交 POST 请求,并在协议体中提交 Json 数据:

{
  "analyzer":"ik_smart",
  "text":"中华人民共和国国歌"
}

在这里插入图片描述

三、Docker搭建Kibana

3.1下载 Kibana 镜像

docker pull kibana:7.9.3

3.2启动 Kibana 容器

docker run \
-d \
--name kibana \
--net es-net \
-p 5601:5601 \
-e ELASTICSEARCH_HOSTS='["http://node1:9200","http://node2:9200","http://node3:9200"]' \
--restart=always \
kibana:7.9.3

Kibana汉化:

docker exec -it kibana bash

echo -e "\ni18n.locale: \"zh-CN\"">>/usr/share/kibana/config/kibana.yml

exit

docker restart kibana

启动后,浏览器访问 Kibana,进入 Dev Tools
http://192.168.128.136:5601/
在这里插入图片描述

四、Docker搭建Logstash和使用方法

4.1下载Logstash镜像

docker pull logstash:7.9.3

4.2建立文件夹,给data文件夹777权限

[root@centos7964 /var/lib/elk/logstash]# ll
总用量 0
drwxrwxrwx. 2 root root 47 514 09:59 config
drwxrwxrwx. 4 root root 69 514 10:11 data
drwxrwxrwx. 2 root root 27 515 09:33 pipeline

只需要建logstash.yml、pipelines.yml、logstash.conf文件

[root@centos7964 /var/lib/elk/logstash]# tree
.
├── config
│   ├── jvm.options
│   ├── logstash.yml
│   └── pipelines.yml
├── data
│   ├── dead_letter_queue
│   ├── queue
│   └── uuid
└── pipeline
    └── logstash.conf

5 directories, 5 files

4.3只需要建logstash.yml、pipelines.yml、logstash.conf文件

内容分别为

path.logs: /usr/share/logstash/logs
config.test_and_exit: false
config.reload.automatic: false
http.host: "0.0.0.0" 
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.133.100:9200" ]
# This file is where you define your pipelines. You can define multiple.
# # For more information on multiple pipelines, see the documentation:
# #   https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
#
- pipeline.id: main
  path.config: "/usr/share/logstash/pipeline/logstash.conf"
input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 5044
    codec => json_lines
  }
}
filter{
}
output {
    elasticsearch {
      hosts => ["192.168.128.136:9200"]
      index => "elk_logstash"
    }
    if [appname] == "Saledev" {
        elasticsearch {
            hosts => "192.168.128.136:9200"
            index => "saledevlog_%{+YYYY.MM.dd}"
        }
    }
    if [appname] == "Qualitydev" {
        elasticsearch {
            hosts => "192.168.128.136:9200"
            index => "qualitydevlog_%{+YYYY.MM.dd}"
        }
    }
    if [appname] == "Purchasedev" {
        elasticsearch {
            hosts => "192.168.128.136:9200"
            index => "purchasedevlog_%{+YYYY.MM.dd}"
        }
    }
    if [appname] == "MESdev" {
        elasticsearch {
            hosts => "192.168.128.136:9200"
            index => "mesdevlog_%{+YYYY.MM.dd}"
        }
    }
    stdout { codec => rubydebug }
}

4.4创建容器

docker run -it \
--name logstash \
--restart=always \
--privileged \
-p 5044:5044 \
-p 9600:9600 \
--net es-net \
-v /etc/localtime:/etc/localtime \
-v /var/lib/elk/logstash/config:/usr/share/logstash/config \
-v /var/lib/elk/logstash/pipeline:/usr/share/logstash/pipeline \
-v /var/lib/elk/logstash/data:/usr/share/logstash/data \
-d logstash:7.9.3

查看日志是否启动成功,没报错就可以

4.5SpringBoot整合logstash

引入依赖

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.3</version>
</dependency>

配置spring-logback.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
                 当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
    <property name="log.path" value="./logs"/>
    <springProperty scope="context" name="env" source="spring.profiles.active"/>
    <springProperty scope="context" name="appName" source="spring.application.name"/>
    <property name="console.log.pattern"
              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>

    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${console.log.pattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
    </appender>

    <!-- 控制台输出 -->
    <appender name="file_console" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-console.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-console.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大 1天 -->
            <maxHistory>1</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
        </filter>
    </appender>

    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- info异步输出 -->
    <appender name="async_info" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="file_info"/>
    </appender>

    <!-- error异步输出 -->
    <appender name="async_error" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="file_error"/>
    </appender>

    <!--LOGSTASH config -->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>192.168.128.136:5044</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <!--自定义时间戳格式, 默认是yyyy-MM-dd'T'HH:mm:ss.SSS<-->
            <timestampPattern>yyyy-MM-dd HH:mm:ss</timestampPattern>
            <customFields>{"appname":"${appName}${env}"}</customFields>
        </encoder>
    </appender>

    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="async_info" />
        <appender-ref ref="async_error" />
        <appender-ref ref="file_console" />
        <appender-ref ref="LOGSTASH"/>
    </root>

</configuration>

主要配置ip地址和端口

4.6使日志插入logstash

只需要使用lombok依赖的@Slf4j注解,把要放入日志的东西加进去即可

package com.wnhz.smart.es.controller;

import com.wnhz.smart.common.http.ResponseResult;
import com.wnhz.smart.es.doc.BookTabDoc;
import com.wnhz.smart.es.service.IBookTabDocService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author Hao
 * @date 2023-12-06 10:40
 */
@RestController
@RequestMapping("/api/query")
@Slf4j
public class QueryController {
    @Autowired
    private IBookTabDocService iBookTabDocService;

    @GetMapping("/test")
    public ResponseResult<List<BookTabDoc>> test() {
        List<BookTabDoc> allBooks = iBookTabDocService.getAllBooks();
        log.debug("从es中查询到的所有数据:{}", allBooks.subList(0, 1000));
        return ResponseResult.ok(allBooks.subList(0, 3));
    }
}

这样所有的数据就会自动插入logstash

4.7配置kibana

进入http://192.168.128.136:5601/app/management(原网页点击Stack Management),点击index Patterns创建匹配模式,输入logstash.conf文件中的index后面的名字,这里是elk_logstash
在这里插入图片描述
查询方法:message 内容
日志的条数查询错误解决
当日志的条数太多会出现下面的错误警告

The length [1417761] of field [message] in doc[20]/index[elk_logstash] exceeds the
[index.highlight.max_analyzed_offset] limit [1000000]. To avoid this
error, set the query parameter [max_analyzed_offset] to a value less
than index setting [1000000] and this will tolerate long field values
by truncating them.

解决方法

解决方案,使用任意一个可以put http值和参数的工具,对目标主机上部署的es进行put命令配置:
!!!注意是put请求,请求地址和body参数分别为:

 http://localhost:9200/_all/_settings?preserve_existing=true
{
  "index.highlight.max_analyzed_offset" : "999999999"
}

返回结果这样就是成功了

{
"acknowledged": true
}

五、Docker搭建Filebeat和使用方法

5.1下载Filebeat镜像

docker pull elastic/filebeat:7.9.3

5.2临时启动镜像

docker run -d --name=filebeat elastic/filebeat:7.9.3

5.3拷贝数据文件

docker cp filebeat:/usr/share/filebeat /var/lib/elk/
chmod 777 -R /var/lib/elk/filebeat
chmod go-w /var/lib/elk/filebeat/filebeat.yml

5.4编辑配置文件

# 收集系统日志
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/messages

filebeat.config:
  modules:
    path: ${path.config}/modules.d/*.yml
    reload.enabled: false

processors:
- add_cloud_metadata: ~
- add_docker_metadata: ~

output.elasticsearch:
  hosts: '192.168.31.196:9200'
  indices:
    - index: "filebeat-%{+yyyy.MM.dd}"

5.5以新的方式启动

docker rm -f filebeat
docker run -d \
  --name=filebeat \
  --user=root \
  --restart=always \
  --net es-net \
  -v /var/lib/elk/filebeat:/usr/share/filebeat \
  -v /var/lib/elk/logdemo:/var/log/messages \
  elastic/filebeat:7.9.3

等待30秒,查看日志是否有错误

docker logs -f filebeat

5.6查看日志

访问elasticsearch head

http://192.168.128.136:9200/

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐