Todos los productos
Search
Centro de documentos

Lindorm:Use sharding (aliases)

Última actualización: Sep 05, 2026

Gestionar datos de series temporales a gran escala requiere particionar la información en varias colecciones y, al mismo tiempo, mantener simple el código de su aplicación. Sin alias, tendría que actualizar los nombres de las colecciones en el código cada vez que rota o reconstruye una colección. Los alias de LindormSearch desacoplan el nombre de la colección que usa su aplicación de la colección física que almacena los datos. Esto le permite intercambiar colecciones o automatizar el particionamiento por tiempo sin modificar ninguna línea de código.

LindormSearch admite dos tipos de alias:

Tipo

Función

Cuándo usarlo

Alias estándar

Apunta a una o más colecciones existentes. Permite cambiar la colección de destino en cualquier momento.

Reconstrucción de índices sin tiempo de inactividad, intercambio de colecciones

Alias enrutado por tiempo

Crea colecciones nuevas según una programación y elimina automáticamente las caducadas.

Cargas de trabajo de series temporales, particionamiento de datos activos

Casos de uso

  • Gestión de datos de series temporales: Cree una colección nueva cada semana para que cada una contenga solo datos recientes. Las consultas sobre datos activos examinan un índice más pequeño, lo cual mejora el rendimiento. LindormSearch se encarga de crear y eliminar las colecciones automáticamente, por lo que no necesita gestionar tablas manualmente.

  • Reconstrucción de un índice: Compile una colección de reemplazo en segundo plano. Cuando esté lista, apunte el alias a la nueva colección. Las consultas continúan sin interrupciones y no se requieren cambios en el código.

Crear un alias estándar

Apunte un alias nuevo a una colección existente:

curl "http://solrhost:8983/solr/admin/collections?action=CREATEALIAS&name=your_alias_name&collections=your_collection_name_A"

El kernel de LindormSearch reenvía todas las solicitudes dirigidas a your_alias_name hacia your_collection_name_A. Su aplicación accede únicamente al nombre del alias y no necesita conocer la colección subyacente.

Para cambiar el alias a una colección diferente, utilice ALIASPROP:

curl "http://solrhost:8983/solr/admin/collections?action=ALIASPROP&name=your_alias_name&collections=your_collection_name_B"

Su aplicación continúa accediendo a your_alias_name. No se requieren cambios en el código.

Configurar alias enrutados por tiempo (sharding automático)

Un alias enrutado por tiempo crea una colección nueva en cada intervalo y elimina las que han caducado. El siguiente ejemplo crea un alias semanal que comienza hace 30 días y conserva las colecciones durante 90 días.

curl "http://solrhost:8983/solr/admin/collections?action=CREATEALIAS\
&name=test_router_alias\
&router.name=time\
&router.start=NOW-30DAYS/DAY\
&router.interval=%2B7DAY\
&router.autoDeleteAge=/DAY-90DAYS\
&router.field=your_timestamp_l\
&router.maxFutureMs=8640000000\
&create-collection.collection.configName=_indexer_default\
&create-collection.numShards=2"

Parámetros:

Parámetro

Valor de ejemplo

Descripción

router.name

time

Estrategia de enrutamiento. Establezca este valor en time para habilitar el enrutamiento basado en tiempo.

router.start

NOW-30DAYS/DAY

Inicio del rango temporal para la primera colección. NOW-30DAYS/DAY indica que la hora de inicio es 30 días antes de la hora actual.

router.interval

+7DAY

Frecuencia con la que se crea una colección nueva. +7DAY genera una colección por semana.

router.autoDeleteAge

/DAY-90DAYS

Antigüedad a partir de la cual se elimina una colección. Las colecciones con más de 90 días se quitan automáticamente. Este valor debe representar un periodo mayor que router.start.

router.field

your_timestamp_l

Campo de sus documentos que determina el enrutamiento. Debe estar presente en todos los documentos. Tipos aceptados: DATE o LONG (por ejemplo, System.currentTimeMillis()).

router.maxFutureMs

8640000000

Diferencia máxima permitida, en milisegundos, entre el valor de router.field y la hora actual. El valor 8640000000 ms equivale a 100 días; por lo tanto, se rechazan los documentos con fecha superior a 100 días en el futuro o en el pasado.

create-collection.collection.configName

_indexer_default

Conjunto de configuración que utiliza la colección. Para obtener más información, consulte Actualizar el conjunto de configuración.

create-collection.numShards

2

Número de shards por colección. Valor predeterminado: 2.

Resultado: A partir de hace 30 días, LindormSearch crea una colección cada 7 días con el nombre test_router_alias_<date> (por ejemplo, test_router_alias_2020-03-04). Las colecciones con más de 90 días se eliminan automáticamente.

Todos los documentos deben incluir el campo especificado en router.field . De forma predeterminada, se consultan todas las colecciones bajo el alias. Para restringir una consulta a un rango de tiempo específico, identifique primero las colecciones de destino y pase sus nombres explícitamente; consulte el ejemplo de Java a continuación.

Consultar un rango de tiempo con una marca de tiempo tipo LONG

Cuando router.field utiliza un tipo LONG (milisegundos desde epoch), restrinja la consulta a un rango de tiempo específico. Para ello, resuelva el alias a sus colecciones constituyentes y filtre aquellas que se superponen con su rango.

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.ClusterStateProvider;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.util.StrUtils;

import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;

public class SolrDemo {
  private static final DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
      .append(DateTimeFormatter.ISO_LOCAL_DATE).appendPattern("[_HH[_mm[_ss]]]")
      .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
      .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
      .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
      .toFormatter(Locale.ROOT).withZone(ZoneOffset.UTC);

  private static final String zkHost = "localhost:2181/solr";
  private CloudSolrClient cloudSolrClient;
  private ClusterStateProvider clusterStateProvider;

  public SolrDemo() {
    cloudSolrClient = new CloudSolrClient.Builder(
        Collections.singletonList(zkHost), Optional.empty()).build();
    cloudSolrClient.connect();
    clusterStateProvider = cloudSolrClient.getClusterStateProvider();
  }

  public void close() throws Exception {
    if (null != cloudSolrClient) {
      cloudSolrClient.close();
    }
  }

  // Returns the collections that overlap the [start, end] epoch-millisecond range.
  // Collection names follow the pattern: test_router_alias_2020-03-04
  private List<String> findCollection(String aliasName, long start, long end) {
    List<String> collections = new ArrayList<>();
    if (start > end) {
      return collections;
    }

    if (clusterStateProvider.getState(aliasName) == null) {
      // Resolve the alias to its backing collections, e.g.:
      // [test_router_alias_2020-03-04, test_router_alias_2020-02-26, ...]
      List<String> aliasedCollections = clusterStateProvider.resolveAlias(aliasName);

      // Parse the date suffix from each collection name and map it to an Instant
      List<Map.Entry<Instant, String>> collectionsInstant = new ArrayList<>(aliasedCollections.size());
      for (String collectionName : aliasedCollections) {
        String dateTimePart = collectionName.substring(aliasName.length() + 1);
        Instant instant = DATE_TIME_FORMATTER.parse(dateTimePart, Instant::from);
        collectionsInstant.add(new AbstractMap.SimpleImmutableEntry<>(instant, collectionName));
      }

      // Keep only collections whose start time falls within the query range
      Instant startI = Instant.ofEpochMilli(start);
      Instant endI = Instant.ofEpochMilli(end);
      for (Map.Entry<Instant, String> entry : collectionsInstant) {
        Instant colStartTime = entry.getKey();
        if (!endI.isBefore(colStartTime)) {
          collections.add(entry.getValue());
          System.out.println("find collection: " + entry.getValue());
          if (!startI.isBefore(colStartTime)) {
            break;
          }
        }
      }
    } else {
      collections.add(aliasName);
    }
    System.out.println("query " + collections);
    return collections;
  }

  public void run() throws Exception {
    try {
      // Query the range [2020-03-07, 2020-03-10]
      long start = 1583538686312L;
      long end   = 1583797886000L;
      String aliasName = "test_router_alias";

      // Join matched collection names and run the query
      String collections = StrUtils.join(findCollection(aliasName, start, end), ',');
      QueryResponse res = cloudSolrClient.query(collections, new SolrQuery("*:*"));
      for (SolrDocument sd : res.getResults()) {
        System.out.println(sd.get("id") + " " + sd.get("gmtCreate_l"));
      }
    } finally {
      cloudSolrClient.close();
    }
  }

  public static void main(String[] args) throws Exception {
    SolrDemo solrDemo = new SolrDemo();
    solrDemo.run();
    solrDemo.close();
  }
}

Eliminar un alias

Eliminar un alias no afecta las colecciones subyacentes en ninguno de los dos tipos. En el caso de los alias enrutados por tiempo, las colecciones creadas automáticamente permanecen y deben eliminarse manualmente.

Alias estándar: Ejecute el siguiente comando para eliminar el alias.

curl "http://solrhost:8983/solr/admin/collections?action=DELETEALIAS&name=your_alias_name"

Alias enrutado por tiempo: Después de eliminar el alias, elimine manualmente cada colección asociada.

  1. Liste todas las colecciones para identificar las asociadas con el alias:

    curl "http://solrhost:8983/solr/admin/collections?action=LIST"

    Las colecciones con nombre test_router_alias_<date> están asociadas con el alias.

  2. Elimine el alias:

    curl "http://solrhost:8983/solr/admin/collections?action=DELETEALIAS&name=test_router_alias"
  3. Elimine cada colección asociada:

    curl "http://solrhost:8983/solr/admin/collections?action=DELETE&name=<collection_name>"

Referencias