ELK还是学不会

ELK还是学不会

下载镜像

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.1
docker pull docker.elastic.co/kibana/kibana:7.15.1
docker pull docker.elastic.co/logstash/logstash:7.15.1
docker pull docker.elastic.co/beats/filebeat:7.15.1

配置文件路径

/nfs/elk/

mkdir logstash elasticsearch kibana

部署elasticsearch

设置max_map_count不能启动es会启动不起来

查看max_map_count的值 默认是65530
cat /proc/sys/vm/max_map_count
重新设置max_map_count的值
sysctl -w vm.max_map_count=262144

启动镜像

docker run --name es -d \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-p 9200:9200 \
-p 9300:9300 \
docker.elastic.co/elasticsearch/elasticsearch:7.15.1

复制配置文件
docker cp es:/usr/share/elasticsearch/data /nfs/d6g/elk/elasticsearch/
docker cp es:/usr/share/elasticsearch/logs /nfs/d6g/elk/elasticsearch/
docker cp es:/usr/share/elasticsearch/config /nfs/d6g/elk/elasticsearch/
docker run --name es -d \
--restart=always \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-p 9200:9200 \
-p 9300:9300 \
-v /nfs/elk/elasticsearch/config:/usr/share/elasticsearch/config \
-v /nfs/elk/elasticsearch/data:/usr/share/elasticsearch/data \
-v /nfs/elk/elasticsearch/logs:/usr/share/elasticsearch/logs \
docker.elastic.co/elasticsearch/elasticsearch:7.15.1

配置文件

vim elasticsearch.yml

network:
  host: 0.0.0.0
xpack:
  ml:
    enabled: false
  monitoring:
    enabled: false
  security:
    enabled: false
  watcher:
    enabled: false

验证成功

访问 http://192.168.6.71:9200

部署kibana

启动镜像

docker run -d \
  --name=kibana \
  --restart=always \
  -p 5601:5601 \
  -v /nfs/elk/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml \
  docker.elastic.co/kibana/kibana:7.15.1

配置文件

vim kibana.yml

server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.6.71:9200"]
#elasticsearch.url: http://192.168.6.71:9200
i18n.locale: "zh-CN"
xpack:
  apm.ui.enabled: false
  graph.enabled: false
  ml.enabled: false
  monitoring.enabled: false
  reporting.enabled: false
  security.enabled: false
  grokdebugger.enabled: false
  searchprofiler.enabled: false

验证成功

访问 http://192.168.6.71:5601

部署logstash

image-20211117180947652

启动镜像

docker run -d \
--name logstash \
--restart=always \
-p 5044:5044 \
docker.elastic.co/logstash/logstash:7.15.1

复制配置文件
docker cp logstash:/usr/share/logstash/config /nfs/d6g/elk/logstash/config
docker cp logstash:/usr/share/logstash/data /nfs/d6g/elk/logstash/data
docker run -itd \
--name logstash \
--restart=always \
--privileged=true \
--net=host \
-v /nfs/elk/logstash/config:/usr/share/logstash/config \
-v /nfs/elk/logstash/conf.d:/usr/share/logstash/conf.d \
-v /nfs/elk/logstash/data:/usr/share/logstash/data \
-v /nfs/elk/logstash/logs:/usr/share/logstash/logs \
docker.elastic.co/logstash/logstash:7.15.1
docker run -itd \
--name logstash \
--restart=always \
--privileged=true \
--net=host \
-v /nfs/elk/logstash/config:/usr/share/logstash/config \
-v /nfs/elk/logstash/conf.d:/usr/share/logstash/conf.d \
docker.elastic.co/logstash/logstash:7.15.1

logstash.yml

http.host: "0.0.0.0"
#根据实际修改es的ip:port
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.6.70:9200" ]
# 主管道的Logstash配置路径,如果指定目录或通配符,配置文件将按字母顺序从目录中读取
path.config: /usr/share/logstash/conf.d/*.conf
#Logstash将其日志写到的目录
path.logs: /usr/share/logstash/logs
path.data: /usr/share/logstash/data

pipelines.yml

- pipeline.id: main
  path.config: "/usr/share/logstash/conf.d/*.conf"

logstash.conf

input {
 #stdin{} 
 tcp { 
  	port => 5044
  }
}
filter {
    json {
        source => "message"
    }
}
output {
  #stdout { codec => rubydebug }
  elasticsearch {
  	#集群的话,直接添加多个url
    hosts => ["http://172.16.183.133:9200"]
    #es的用户名和密码
	  #建立的索引以日期区分
    index => "log-%{+YYYY.MM.dd}"
 }
}

docker-compose.yml

version: '2'
services:
  es:
    container_name: elk-elasticsearch
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.1
    restart: unless-stopped
    ports:
      - "29200:9200"
      - "29300:9300"
    environment:
      ES_JAVA_OPTS: '-Xms512m -Xmx512m'
      discovery.type: single-node
    volumes:
      - BASE_ELK/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - BASE_ELK/elasticsearch/data:/usr/share/elasticsearch/data
  kibana:
    container_name: elk-kibana
    image: docker.elastic.co/kibana/kibana:7.15.1
    restart: unless-stopped
    depends_on: [es]
    ports:
      - "25601:5601"
    volumes:
      - BASE_ELK/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml
  logstash:
    container_name: elk-logstash
    image: docker.elastic.co/logstash/logstash:7.15.1
    restart: unless-stopped
    ports:
      - "29600:9600"
      - "25044:5044"
    depends_on: [es]
    volumes:
      - BASE_ELK/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml
      - BASE_ELK/logstash/pipelines.yml:/usr/share/logstash/config/pipelines.yml
      - BASE_ELK/logstash/logstash.conf:/usr/share/logstash/conf.d/logstash.conf

ELK安装脚本

#!/bin/bash
# 脚本说明:
#        环境准备:docker docker-compose
#        注意事项:修改存放文件的目录、修改公网ip
BASE_ELK=/nfs/elk
IP=192.168.6.111
echo "============================下载镜像======================================================="
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.1
docker pull docker.elastic.co/kibana/kibana:7.15.1
docker pull docker.elastic.co/logstash/logstash:7.15.1
echo "==========================设置max_map_count==============================================="
sysctl -w vm.max_map_count=262144
echo "==========================配置文件路径====================================================="
mkdir -p $BASE_ELK/elasticsearch $BASE_ELK/elasticsearch/data $BASE_ELK/logstash $BASE_ELK/kibana
echo "=============$BASE_ELK/elasticsearch/elasticsearch.yml===================================="
tee $BASE_ELK/elasticsearch/elasticsearch.yml <<-'EOF'
network:
  host: 0.0.0.0
xpack:
  ml:
    enabled: false
  monitoring:
    enabled: false
  security:
    enabled: false
  watcher:
    enabled: false
EOF
echo "=============$BASE_ELK/kibana/kibana.yml==================================================="
tee $BASE_ELK/kibana/kibana.yml <<-'EOF'
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://IP:29200"]
i18n.locale: "zh-CN"
xpack:
  apm.ui.enabled: false
  graph.enabled: false
  ml.enabled: false
  monitoring.enabled: false
  reporting.enabled: false
  security.enabled: false
  grokdebugger.enabled: false
  searchprofiler.enabled: false
EOF
echo "=============$BASE_ELK/logstash/logstash.yml==============================================="
tee $BASE_ELK/logstash/logstash.yml <<-'EOF'
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://IP:29200" ]
path.config: /usr/share/logstash/conf.d/*.conf
path.logs: /usr/share/logstash/logs
path.data: /usr/share/logstash/data
EOF
echo "=============$BASE_ELK/logstash/pipelines.yml=============================================="
tee $BASE_ELK/logstash/pipelines.yml <<-'EOF'
- pipeline.id: main
  path.config: "/usr/share/logstash/conf.d/*.conf"
EOF
echo "=============$BASE_ELK/logstash/logstash.conf=============================================="
tee $BASE_ELK/logstash/logstash.conf <<-'EOF'
input {
 tcp { 
  	port => 5044
  }
}
filter {
    json {
        source => "message"
    }
}
output {
  elasticsearch {
    hosts => ["http://IP:29200"]
    index => "log-%{+YYYY.MM.dd}"
 }
}
EOF

echo "=============$(pwd)/docker-compose.yml================================================="
tee $(pwd)/docker-compose.yml <<-'EOF'
version: '2'
services:
  es:
    container_name: elk-elasticsearch
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.1
    restart: unless-stopped
    ports:
      - "29200:9200"
      - "29300:9300"
    environment:
      ES_JAVA_OPTS: '-Xms512m -Xmx512m'
      discovery.type: single-node
    volumes:
      - BASE_ELK/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - BASE_ELK/elasticsearch/data:/usr/share/elasticsearch/data
  kibana:
    container_name: elk-kibana
    image: docker.elastic.co/kibana/kibana:7.15.1
    restart: unless-stopped
    depends_on: [es]
    ports:
      - "25601:5601"
    volumes:
      - BASE_ELK/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml
  logstash:
    container_name: elk-logstash
    image: docker.elastic.co/logstash/logstash:7.15.1
    restart: unless-stopped
    ports:
      - "29600:9600"
      - "25044:5044"
    depends_on: [es]
    volumes:
      - BASE_ELK/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml
      - BASE_ELK/logstash/pipelines.yml:/usr/share/logstash/config/pipelines.yml
      - BASE_ELK/logstash/logstash.conf:/usr/share/logstash/conf.d/logstash.conf
EOF
echo "========================================sed================================================="
sed -i "s/IP/192.168.6.111/g" $BASE_ELK/kibana/kibana.yml $BASE_ELK/logstash/logstash.conf $BASE_ELK/logstash/logstash.yml
sed -i 's/BASE_ELK/\/nfs\/elk/g' $(pwd)/docker-compose.yml
echo "=========================docker run cp rm==============================================="
docker run --name es -d \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-p 9200:9200 \
-p 9300:9300 \
docker.elastic.co/elasticsearch/elasticsearch:7.15.1
docker cp es:/usr/share/elasticsearch/data $BASE_ELK/elasticsearch/
docker rm -f es
echo "=========================docker-compose up -d==============================================="
docker-compose up -d

部署filebeat

启动镜像

docker run -d \
  --name=filebeat \
  --restart=always \
  -v /data/elk7/filebeat:/usr/share/filebeat \
  -v /var/log/messages:/var/log/messages \
  elastic/filebeat:7.5.1

配置文件

vim filebeat.yml

filebeat.prospectors:
- input_type: log
  paths:
    - /var/lib/docker/containers/*/*json.log
  document_type: "filebeat" # 定义写入 ES 时的 _type 值
  multiline:
    #pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})'   # 指定匹配的表达式(匹配以 2017-11-15 08:04:23:889 时间格式开头的字符串)
    # pattern: '^\s*("{)'                         # 指定匹配的表达式(匹配以 "{ 开头的字符串)
    # negate: true                                # 是否匹配到
    # match: after                                # 合并到上一行的末尾
    # max_lines: 1000                             # 最大的行数
    timeout: 30s                                # 如果在规定的时候没有新的日志事件就不等待后面的日志
  # fields:
    # logsource: node1
    # logtype: spring-boot-log4j2

#output.elasticsearch:
  #hosts: ["node1:9200"]

# output.logstash:
  # hosts: ["node1:10515"]
output.elasticsearch:
  hosts: 'http://192.168.6.71:9200'
  indices:
    - index: "filebeat-%{+yyyy.MM.dd}"

lockback配置

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <springProperty scope="context" name="appName" source="spring.application.name" />
    <springProperty scope="context" name="LOG_HOST" source="logstash.host"/>
    <springProperty scope="context" name="LOG_PORT" source="logstash.port"/>
    <springProperty scope="context" name="code" source="product.code"/>
    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!--设置输出位置-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--格式布局-->
        <!--这里替换成AspectLogbackEncoder-->
        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
            <!--自定义日志格式-->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 为logstash输出的JSON格式的Appender -->
    <appender name="logstash"
              class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>${LOG_HOST:- }:${LOG_PORT:- }</destination>
        <!-- 日志输出编码 -->
        <encoder charset="UTF-8"
                 class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <pattern>
                    <pattern>
                        {
                        "code": "${code}",
                        "appName": "${appName}",
                        "level": "%level",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "message": "%message",
                        "stack_trace": "%exception{10}"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>
    <springProfile name="dev">
        <!--根日志-->
        <root level="info">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="logstash"/>
        </root>
    </springProfile>
</configuration>

使用apollo中的logstash主机

#logstash服务器地址
#logstash.host=192.168.6.70
#logstash.port=5044
#Bootstrap 阶段注入配置开关
apollo.bootstrap.enabled=true
#Apollo 配置加载提到初始化日志系统之前
apollo.bootstrap.eagerLoad.enabled=true
#Bootstrap 阶段注入配置 application.yml,logback-spring 配置
#apollo.bootstrap.namespaces=application.yml,logback-spring

https://www.kuangstudy.com/bbs/1354069127022583809

部署APM

下载镜像

docker pull docker.elastic.co/apm/apm-server:7.15.1

启动镜像

  docker run -d \
  -p 8200:8200 \
  --name=apm \
  --user=apm-server \
  docker.elastic.co/apm/apm-server:7.15.1 \
  --strict.perms=false -e \
  -E output.elasticsearch.hosts=["192.168.6.69:9200"] \
  -E setup.kibana.host="192.168.6.69:5601" 

启动客户端

  1. 下载 APM 代理 可以通过 Maven Central 下载代理 Jar 包,不需要再项目中引入依赖,

    下载地址:https://search.maven.org/search?q=a:elastic-apm-agent

  2. 使用 javaagent 参数启动应用,并设置好对应的配置项。

    elastic.apm.service_name 为服务名称
    elastic.apm.server_urls 为服务端请求地址
    elastic.apm.application_packages 为项目包路径

  3. 启动参数示例:

java -javaagent:D:\desktop\elastic-apm-agent-1.29.0.jar \
     -Delastic.apm.service_name=saas-platform \
     -Delastic.apm.application_packages=cn.newgrand.dcs \
     -Delastic.apm.server_url=http://192.168.6.69:8200 \
     -jar .\saas-platform.jar

分布式日志追踪Tlog

Tlog最新版已经支持logstash

引入依赖

<!--链路追踪日志-->
<dependency>
    <groupId>com.yomahub</groupId>
    <artifactId>tlog-all-spring-boot-starter</artifactId>
    <version>1.3.4</version>
</dependency>
<!--logstash-->
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.6</version>
</dependency>

定义拦截器

@Component
@Order(99)
public class DCSTLogWebInterceptor extends AbsTLogWebHandlerMethodInterceptor {

    private static volatile Map<String, HashMap<String, String>> tLogContextMap;

    public static Map<String, HashMap<String, String>> getInstance() {
        if (tLogContextMap == null) {
            synchronized (ConcurrentHashMap.class) {
                if (tLogContextMap == null) {
                    tLogContextMap = new ConcurrentHashMap<String, HashMap<String, String>>();
                }
            }
        }
        return tLogContextMap;
    }

    @Override
    public boolean preHandleByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HashMap<String, String> concurrentHashMap = new HashMap<>();
        // concurrentHashMap.put("tlogIp", TLogContext.getCurrIp());
        // concurrentHashMap.put("tlogPreIp", TLogContext.getPreIp());
        // concurrentHashMap.put("tlogApp", TLogContext.getPreIvkApp());
        // concurrentHashMap.put("tlogHost", TLogContext.getPreIvkHost());
        concurrentHashMap.put("tlogTraceId", TLogContext.getTraceId());
        concurrentHashMap.put("tlogSpanId", TLogContext.getSpanId());
        concurrentHashMap.put("tlogValue", AspectLogContext.getLogValue());
        Map<String, HashMap<String, String>> instance = DCSTLogWebInterceptor.getInstance();
        instance.put((Thread.currentThread()).getName(), concurrentHashMap);
        return true;
    }

    @Override
    public void postHandleByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletionByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        tLogContextMap.remove((Thread.currentThread()).getName());
    }
}

SpringMVC配置

@Configuration
public class SpringMVCConfig implements WebMvcConfigurer {
    @Autowired
    private DCSTLogWebInterceptor dcstLogWebInterceptor;

    // 将拦截器注册到Springboot
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(dcstLogWebInterceptor)
                .addPathPatterns("/**");
    }
}

logback自定义 JSON 提供程序

https://github.com/logfellow/logstash-logback-encoder

public class DCSLogstashProvider implements JsonProvider {

    @Override
    public void writeTo(JsonGenerator generator, DeferredProcessingAware deferredProcessingAware) throws IOException {
        ILoggingEvent iLoggingEvent = (ILoggingEvent) deferredProcessingAware;
        HashMap<String, String> concurrentHashMap = DCSTLogWebInterceptor.getInstance().get(iLoggingEvent.getThreadName());
        if (MapUtil.isNotEmpty(concurrentHashMap)) {
            for (Map.Entry<String, String> tlog : concurrentHashMap.entrySet()) {
                String key = tlog.getKey();
                String value = tlog.getValue();
                if (StrUtil.isNotBlank(key) && StrUtil.isNotBlank(value)) {
                    generator.writeFieldName(tlog.getKey());
                    generator.writeObject(tlog.getValue());
                }
            }
        }
    }
}

lockback配置

<appender name="logstash"
              class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>${LOG_HOST:- }:${LOG_PORT:- }</destination>
        <!-- 日志输出编码 -->
        <encoder charset="UTF-8"
                 class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <provider class="cn.newgrand.dcs.common.tlog.DCSLogstashProvider">
                </provider>
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <pattern>
                    <pattern>
                        {
                        "code": "${code}",
                        "appName": "${appName}",
                        "level": "%level",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "message": "%message",
                        "stack_trace": "%exception{10}",
                        "client_time": "%d{yyyy-MM-dd HH:mm:ss.SSS}"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>

elasticsearch

ElasticSearch概述

Elaticsearch,简称为es,es是一个开源的高扩展分布式全文检索引擎,它可以近乎实时的存储检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单

据国际权威的数据库产品评测机构DB Engines的统计,在2016年1月,ElasticSearch已超过Solr等,成为排名第一的搜索引擎类应用

ES和Solr

ElasticSearch简介

  • Elasticsearch是一个实时分布式搜索和分析引擎。 它让你以前所未有的速度处理大数据成为可能。
  • 它用于全文搜索、结构化搜索、分析以及将这三者混合使用:
  • 维基百科使用Elasticsearch提供全文搜索高亮关键字,以及输入实时搜索(search-asyou-type)和搜索纠错(did-you-mean)等搜索建议功能。
  • 英国卫报使用Elasticsearch结合用户日志和社交网络数据提供给他们的编辑以实时的反馈,以便及时了解公众对新发表的文章的回应。
  • StackOverflow结合全文搜索与地理位置查询,以及more-like-this功能来找到相关的问题和答案。
  • Github使用Elasticsearch检索1300亿行的代码。
  • 但是Elasticsearch不仅用于大型企业,它还让像DataDog以及Klout这样的创业公司将最初的想法变成可扩展的解决方案。
  • Elasticsearch可以在你的笔记本上运行,也可以在数以百计的服务器上处理PB级别的数据。
  • Elasticsearch是一个基于Apache Lucene™的开源搜索引擎。无论在开源还是专有领域, Lucene可被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
    • 但是, Lucene只是一个库。 想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是, Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
  • Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

Solr简介

  • Solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置可扩展,并对索引、搜索性能进行了优化
  • Solr可以独立运行,运行在letty. Tomcat等这些Selrvlet容器中 , Solr 索引的实现方法很简单,用POST方法向Solr服务器发送一个描述Field及其内容的XML文档, Solr根据xml文档添加、删除、更新索引。Solr 搜索只需要发送HTTP GET请求,然后对Solr返回xml、json等格式的查询结果进行解析,组织页面布局。
  • Solr不提供构建UI的功能, Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
  • Solr是基于lucene开发企业级搜索服务器,实际上就是封装了lucene.
  • Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交-定格式的文件,生成索引;也可以通过提出查找请求,并得到返回结果。

总结

1、es基本是开箱即用(解压就可以用!) ,非常简单。Solr安装略微复杂一丢丢!
2、Solr 利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调管理功能
3、Solr 支持更多格式的数据,比如JSON、XML、 CSV ,而Elasticsearch仅支持json文件格式
4、Solr 官方提供的功能更多,而Elasticsearch本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑
5、Solr 查询快,但更新索引时慢(即插入删除慢) ,用于电商等查询多的应用;

  • ES建立索引快(即查询慢) ,即实时性查询快,用于facebook新浪等搜索。
  • Solr是传统搜索应用的有力解决方案,但Elasticsearch更适用于新兴的实时搜索应用。

6、Solr比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而Elasticsearch相对开发维护者较少,更新太快,学习使用成本较高。

Api

查询索引:

curl -XGET 'http://127.0.0.1:9200/_cat/indices/?v'

删除索引:

curl -XDELETE 'http://127.0.0.1:9200/logstash-2021-11-*'

定时删除索引

#/bin/bash
#指定日期(7天前)
DATA=`date -d "1 week ago" +%Y.%m.%d`
#当前日期
time=`date`
#删除7天前的日志
curl -XDELETE http://127.0.0.1:9200/log-${DATA}
if [ $? -eq 0 ];then
echo $time"-->del $DATA log success.." >> /root/es-index-clear.log
else
echo $time"-->del $DATA log fail.." >> /root/es-index-clear.log
fi

执行

0 1 * * * /root/es-index-clear.sh > /dev/null 2>&1

crontab命令

  1. crontab -e

    0 1 * * * /root/es-index-clear.sh >> /root/es-index-clear.log

  2. 重启crond

    1. linux

      systemctl reload crond
      systemctl restart crond

    2. ubuntu

      sudo service cron start

  3. 查看当前用户定时任务
    crontab -l

更多内容:https://gitee.com/lofxve/note

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值