docker -v
注:若已安装的docker满足需求,则无需重新安装docker
# 查询docker相关rpm
rpm -qa | grep docker
# 移除相关rpm(将上一步查询出来的进行移除)
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 移除后,再查询docker相关rpm,确保移除成功
rpm -qa | grep docker
提示:中间需要确认几次,输入y回车即可
#安装所需资源包
sudo yum install -y yum-utils
#设置docker下载地址
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
yum list docker-ce --showduplicates | sort -r
sudo systemctl start docker
#查看docker的版本
docker -v
# 查看本地主机上已有镜像的基本信息。
docker images
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
ll /usr/local/bin
chmod +x /usr/local/bin/docker-compose
ll /usr/local/bin
docker-compose -v
# 创建目录/usr/local/elk/es/data和/usr/local/elk/es/plugins和/usr/local/elk/es/config和/usr/local/elk/logstash和/usr/local/elk/kibana
mkdir -p /usr/local/elk/{es/data,es/plugins,es/config,logstash,kibana/config,kibana/data}
ll /usr/local/elk
ll /usr/local/elk/es
ll /usr/local/elk/kibana
# 授权相关文件夹权限
chmod -R 777 /usr/local/elk/es
chmod -R 777 /usr/local/elk/logstash
chmod -R 777 /usr/local/elk/kibana
vim /usr/local/elk/docker-compose.yml
内容如下
version: '3' #指定compose文件的版本号,目前有1,2,3这三个版本
services:
elasticsearch: # 指定服务名
image: elasticsearch:7.17.5 #镜像
container_name: elasticsearch-7.17.5 #定义容器名称
restart: always #开机启动,失败也会一直重启
environment:
- "cluster.name=elasticsearch" #设置集群名称为elasticsearch
- "discovery.type=single-node" #以单一节点模式启动
# 若启动时报错 exited with code 137,则调大此参数即可
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" #设置使用jvm内存大小
volumes:
- /usr/local/elk/es/plugins:/usr/share/elasticsearch/plugins #插件文件挂载({宿主机目录}:{容器目录})
- /usr/local/elk/es/data:/usr/share/elasticsearch/data #数据文件挂载({宿主机目录}:{容器目录})
- /usr/local/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml # 配置文件挂载({宿主机文件}:{容器文件})
ports:
- "9200:9200" # {宿主机端口}:{容器端口}, 9200是ES节点与外部通讯使用的端口。它是http协议的RESTful接口(各种CRUD操作都是走的该端口,如查询:http://localhost:9200/user/_search)
- "9300:9300" # {宿主机端口}:{容器端口}, 9300是ES节点之间通讯使用的端口。它是tcp通讯端口,集群间和TCPclient都走的它。(java程序中使用ES时,在配置文件中要配置此端口)
kibana: # 指定服务名
image: kibana:7.17.5
container_name: kibana-7.17.5
restart: always
volumes:
- /usr/local/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml #挂载logstash的配置文件 {宿主机文件}:{容器文件}
- /usr/local/elk/kibana/data:/usr/share/kibana/data #数据文件挂载({宿主机目录}:{容器目录})
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
environment:
- ELASTICSEARCH_URL=http://172.31.113.186:9200 #设置访问elasticsearch的地址,不能写localhost或者127.0.0.1,可以写内网(或公网)地址
ports:
- "5601:5601" # {宿主机端口}:{容器端口}
logstash: # 指定服务名
image: logstash:7.17.5
container_name: logstash-7.17.5
restart: always
volumes:
- /usr/local/elk/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml #挂载logstash的配置文件 {宿主机文件}:{容器文件}
- /usr/local/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的数据传输配置文件 {宿主机文件}:{容器文件}
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
ports:
- "5044:5044" #{宿主机端口}:{容器端口}, logstash中输入源涉及到的所有端口号都需要映射,5044为默认端口号
vim /usr/local/elk/es/config/elasticsearch.yml
内容如下
network.host: 0.0.0.0 #使用的网络
http.cors.enabled: true #跨域配置
http.cors.allow-origin: "*"
xpack.security.enabled: true #开启密码配置
http.cors.allow-headers: Authorization
xpack.security.transport.ssl.enabled: true
# 禁止启动时更新地图相关数据库
ingest.geoip.downloader.enabled: false
# 创建配置文件logstash配置文件
vim /usr/local/elk/kibana/config/kibana.yml
内容如下
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: ["http://172.31.113.186:9200"] #es地址;不能写localhost或者127.0.0.1,可以写内网(或公网)地址
i18n.locale: "zh-CN" #汉化
elasticsearch.username: elastic # 设置账号密码
elasticsearch.password: elastic123
xpack.encryptedSavedObjects.encryptionKey: "fhjskloppd678ehkdfdlliverpoolfcr" # 任意不少于32位的字符即可, 官方解释https://www.elastic.co/guide/en/kibana/7.16/alert-action-settings-kb.html#general-alert-action-settings
logstash.yml,logstash配置
# 创建配置文件logstash.yml
vim /usr/local/elk/logstash/logstash.yml
内容如下
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://172.31.113.186:9200" ] # es地址,不能写localhost或者127.0.0.1,可以写内网(或公网)地址
xpack.monitoring.elasticsearch.username: "elastic" # es账号
xpack.monitoring.elasticsearch.password: "elastic123" # es密码
logstash.config,数据传输配置
# 创建配置文件logstash配置文件
vim /usr/local/elk/logstash/logstash.conf
内容如下
更多可参考:https://blog.csdn.net/qq330983778/article/details/105644835/
# 数据输入配置
input {
# 从TCP套接字读取数据
tcp {
mode => "server"
host => "0.0.0.0"
port => 5044 # 每个输入源都可以使用不同的端口号。 注:这里是容器内的端口
codec => json_lines
}
# 从Elastic Beats框架(如filebeat)接收数据
#beats {
# port => 5044 注:这里是容器内的端口
#}
}
# 数据处理配置
# 数据输出配置
output {
elasticsearch {
hosts => ["http://172.31.113.186:9200"] # es的地址和端口,不能写localhost或者127.0.0.1,可以写内网(或公网)地址
user => "elastic" # es的账号密码
password => "elastic123" # es的账号密码
index => "all-log-%{+YYYY.MM.dd}" # 索引(自定义即可,因为想要按天分索引,所以后面使用变量%{+YYYY.MM.dd})
}
}
提示:docker-compose相关指令详见[01]docker-compose相关指令.md
# 报错的话,尝试切换至docker-compose.yml所在目录执行此指令试试 cd /usr/local/elk
# 启动elk
docker-compose up -d
# docker-compose stop # 停止所有
# docker-compose rm # 移除所有
# 报错的话,尝试切换至docker-compose.yml所在目录执行此指令试试 cd /usr/local/elk
docker-compose ps
提示:启动ELK需要一点时间,等一会儿(或通过docker-compose logs -f --tail=100 {es的服务名}观察到elasticsearch服务启动完成后。 注:此时查看es的日志,可能会报类似于
Authentication of [elastic] was terminated by realm
这样的错,这是因为我们还没进行完此步)再进行此步骤
进入es容器
# docker exec -it {es容器名} /bin/bash
# 注:docker ps可查看容器名或容器id
docker exec -it elasticsearch-7.17.5 /bin/bash
执行设置密码的脚本
# 若执行上面的步骤后,马上进入容器执行此指令,可能会报错。 可以等一会儿再进入容器来执行此指令。或者当执行报错时,退出容器再进入,再试
./bin/elasticsearch-setup-passwords interactive
然后依次给各个账号设置密码
elastic、apm_system、kibana_system、logstash_system、beats_system、remote_monitoring_user 注:本人设置的密码较简单,直接以
{账号名}123
作为的密码
退出容器Ctrl+P+Q
,然后重启es容器即可
# docker-compose restart {服务名}
# 注:docker-compose.yaml中可查看服务名
docker-compose restart elasticsearch
# 分别检查这三个的日志是否正常
docker-compose logs -f --tail=100 elasticsearch
docker-compose logs -f --tail=100 kibana
docker-compose logs -f --tail=100 logstash
提示:如果用的阿里云,那么还需要在阿里云控制台配置开启端口
# es端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --zone=public --add-port=9300/tcp --permanent
# kibina端口
firewall-cmd --zone=public --add-port=5601/tcp --permanent
# logstash端口(只设置了一个端口为5044的输入源,这里只需要开放一个端口即可)
firewall-cmd --zone=public --add-port=5044/tcp --permanent
firewall-cmd --reload
访问elastic(地址http://{address}:9200
):
访问kibana(地址http://{address}:5601
):
密码也是第四步我们设置的
elastic
/elastic123
提示:
此方式(logstash-logback-encoder)会受到项目日志级别的影响,即:只会往logstash传哪些会被打印出来的日志。即:可以通过设置日志级别,控制哪些日志不需要打印即可实现:控制哪些日志不往logstash中传输
你也可以直接使用curl进行测试,执行curl向logstash发送一个json请求
# 多发几条 curl 'http://192.168.44.141:5044' -H "Content-Type:application/json" -X POST -d '{"name":"邓沙利文","msg":"test-logstash"}'然后登录kibana也能看到数据
第一步:创建一个临时的spring-boot项目
第二步:引入logstash依赖支持
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.2</version>
</dependency>
第二步:编写日志配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty name="appName" scope="context" source="spring.application.name"/>
<springProperty name="serverPort" scope="context" source="server.port" defaultValue="0000"/>
<property name="pattern"
value="${appName}:${serverPort} %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%X{traceId}] %thread %logger{50}:%L %msg%n"/>
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${pattern}</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
</appender>
<!--配置logstash 发送日志数据的地址 -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>47.105.39.189:5044</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<root level="INFO">
<appender-ref ref="consoleAppender"/>
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>
第四步:启动项目,随便打点日志
测试代码
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
/**
* start class
*/
@Slf4j
@RestController
@SpringBootApplication
public class DemoApplication implements ApplicationRunner {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
CarInfoPO carInfo = new CarInfoPO();
carInfo.setId(123L);
carInfo.setStatus(0);
carInfo.setCreatedAt(LocalDateTime.now());
carInfo.setUpdatedAt(LocalDateTime.now());
carInfo.setZjPlateNo("你好啊");
carInfo.setZjRegionId("嘿嘿");
log.info(JSON.toJSONStringWithDateFormat(carInfo, "yyyy-MM-dd HH:mm:ss"));
}
}
第五步:去kibana查看日志
提示:需要再kibana的Discover里面简单找一下,才能看到日志信息
假设logback-spring.xml中LogstashTcpSocketAppender记录了不同的字段标识:
<appender name="elkEventAppender" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:5044</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
<customFields>{"elk_data_type": "listen_data"}</customFields>
</encoder>
</appender>
<appender name="elkAppender" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:5044</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
<customFields>{"elk_data_type": "all_data"}</customFields>
</encoder>
</appender>
logstash.config是这样配置的
# 数据输入配置
input {
# 从TCP套接字读取数据
tcp {
mode => "server"
host => "0.0.0.0"
port => 5044 # 每个输入源都可以使用不同的端口号
codec => json_lines
}
}
# 数据处理
filter {
if [elk_data_type] == "listen_data" {
json {
source => "message"
}
}
}
# 数据输出配置
output {
if [elk_data_type] == "listen_data" {
elasticsearch {
hosts => ["http://172.31.113.186:9200"]
user => "elastic"
password => "elastic123"
index => "listen-log-%{+YYYY.MM.dd}"
}
} else {
elasticsearch {
hosts => ["http://172.31.113.186:9200"]
user => "elastic"
password => "elastic123"
index => "all-log-%{+YYYY.MM.dd}"
}
}
}
本示例中的elasticsearch-7.17.5版本,不支持直接重置密码,需要把原来的密码删了,再重新设置
第一步:先关闭elasticsearch认证
vim /usr/local/elk/es/config/elasticsearch.yml
将elasticsearch.yml中xpack.security.enabled注释掉(可以将xpack打头的都注释掉),注释后如下:
network.host: 0.0.0.0 #使用的网络
http.cors.enabled: true #跨域配置
http.cors.allow-origin: "*"
# xpack.security.enabled: true #开启密码配置
http.cors.allow-headers: Authorization
# xpack.security.transport.ssl.enabled: true
第二步:重启elastic
docker-compose stop elasticsearch
docker-compose rm elasticsearch
docker-compose up -d elasticsearch
第三步:查询所有索引,找到密码认证相关索引并删除
# 请求es,查询到所有的索引,找到 密码认证相关的索引
curl -XGET "127.0.0.1:9200/_cat/indices" -H 'Content-Type: application/json'
# 从响应中找到当前es版本的密码认证相关索引,elasticsearch-7.17.5版本的密码认证相关索引为.security-7,这里直接删除
curl -XDELETE 127.0.0.1:9200/.security-7
第四步:重新执行上文中设置密码的操作即可
第五步:上述(第一步至第三步)操作完成后,因为索引不同步,可能会导致kibana连不上es,需要先把es中kibana的相关数据删了后,再重启kibana即可
注:此操作会删除kibana的配置,即:登录kibana后需要重新配置相关索引信息
# 把es中kibana的相关数据删除
curl -XDELETE http://localhost:9200/.kibana_task_manager_1
curl -X DELETE http://localhost:9200/.kibana*
# 重启kibana
docker-compose restart kibana
es状态值说明
red:不健康(即:不可用)
green:健康
yellow:部分不健康(即:部分不可用)
# 如浏览器访问:http://192.168.75.210:9200/_cat/allocation?v&pretty,然后输入账号密码
http://{esip}:{es端口:}/_cat/allocation?v&pretty
# curl访问:curl -X GET "http://elastic:tQOUk%3Ffyz%263zkn_S@localhost:9200/_cat/allocation?v&pretty"
# 注:如果用户名或密码中有特殊字符那么需要进行urlencode处理
curl -X GET "http://{username}:{password}@{esip}:{es端口:}/_cat/allocation?v&pretty"
# 如浏览器访问:http://192.168.75.210:9200/_cluster/health?pretty,然后输入账号密码
http://{esip}:{es端口:}/_cluster/health?pretty
# curl访问:curl -X GET "http://elastic:tQOUk%3Ffyz%263zkn_S@localhost:9200/_cluster/health?pretty"
# 注:如果用户名或密码中有特殊字符那么需要进行urlencode处理
curl -X GET "http://{username}:{password}@{esip}:{es端口:}/_cluster/health?pretty"
# 如浏览器访问:http://192.168.75.210:9200/_cat/indices?v,然后输入账号密码
http://{esip}:{es端口:}/_cat/indices
# curl访问:curl -X GET "http://elastic:tQOUk%3Ffyz%263zkn_S@localhost:9200/_cat/indices?v"
# 注:如果用户名或密码中有特殊字符那么需要进行urlencode处理
curl -X GET "http://{username}:{password}@{esip}:{es端口:}/_cat/indices?v"
手动删除索引
# curl访问:curl -X DELETE "http://elastic:tQOUk%3Ffyz%263zkn_S@localhost:9200/all-log-2023.01.17"
# 注:如果用户名或密码中有特殊字符那么需要进行urlencode处理
curl -X DELETE "http://{username}:{password}@{esip}:{es端口:}/{要删除的索引名}"
通过脚本定时删除索引
创建一个删除es索引的脚本/www/wwwroot/backend/del-es-index.sh
#!/bin/bash
# 这里date -d "7 days ago" +%Y.%m.%d的结果形如2023.01.24
DATE=`date -d "7 days ago" +%Y.%m.%d`
# 通过管道符|分割,这里有3个部分,功能分别是:1-获取es索引;2-过滤出包含特定字符的行;3-将第三列输出到/tmp/es-index.log文件中
curl -X GET http://elastic:tQOUk%3Ffyz%263zkn_S@localhost:9200/_cat/indices?v| grep $DATE | awk '{print $3}' > /tmp/es-index.log
# 循环删除/tmp/es-index.log中记录的es索引
for idx in `cat /tmp/es-index.log`
do
curl -X DELETE "http://elastic:tQOUk%3Ffyz%263zkn_S@localhost:9200/$idx"
done
注:你需要将里面获取es索引、删除es索引对应的地址账号密码换成你自己的
注:编写完脚本后,记得sh /www/wwwroot/backend/del-es-index.sh
验证一下
crontab -e
编辑定时任务,设置定时执行上述shell脚本
时间表达式:minute hour day month week command
crontab -l
查看定时任务
[root@psys-prd-210 backend]# crontab -l
0 1,5,9,13,17,21,23 * * * /www/wwwroot/backend/restart-acs-camera.sh
0 1 * * * /www/wwwroot/backend/del-es-index.sh
可参考Open / Close Index API /启动关闭索引
关闭索引的作用:
- 关闭索引后,不能再对索引进行读写
- 索引数据会持久化到磁盘,不再占用内存资源
打开索引
# curl访问:curl -X POST "http://elastic:tQOUk%3Ffyz%263zkn_S@localhost:9200/user-index-2023-02-17/_close?ignore_unavailable=true"
# 注:如果用户名或密码中有特殊字符那么需要进行urlencode处理
# 注:索引名称支持模糊匹配多个(默认开启了模糊匹配的),可详见参考文档【Open / Close Index API /启动关闭索引】
curl -X POST "http://{username}:{password}@{esip}:{es端口:}/{索引名称}/_open?ignore_unavailable=true"
关闭索引
# curl访问:curl -X POST "http://elastic:tQOUk%3Ffyz%263zkn_S@localhost:9200/user-index-2023-02-17/_open?ignore_unavailable=true"
# 注:如果用户名或密码中有特殊字符那么需要进行urlencode处理
# 注:索引名称支持模糊匹配多个(默认开启了模糊匹配的),可详见参考文档【Open / Close Index API /启动关闭索引】
curl -X POST "http://{username}:{password}@{esip}:{es端口:}/{索引名称}/_close?ignore_unavailable=true"
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。