Elassandra es una distribución de Apache Cassandra que incluye un motor de búsqueda Elasticsearch. Elassandra es una base de datos y un motor de búsqueda multi-maestro y múltiples nubes con soporte para replicación en múltiples centros de datos en modo activo/activo.
El código de Elasticsearch está integrado en los nodos de Cassanda y proporciona funciones de búsqueda avanzadas en las tablas de Cassandra y Cassandra sirve como almacén de configuración y datos de Elasticsearch.
Elassandra admite vnodes de Cassandra y escala horizontalmente agregando más nodos sin la necesidad de volver a fragmentar los índices.
La documentación del proyecto está disponible en doc.elassandra.io.
Para los usuarios de Cassandra, elassandra proporciona funciones de Elasticsearch:
Para los usuarios de Elasticsearch, elassandra proporciona funciones útiles:
Guía de inicio rápido para ejecutar un clúster Elassandra de un solo nodo en Docker.
Implemente Elassandra lanzando Google Kubernetes Engine:
<<<<<<< HEAD Desde la versión 6.8.4.2, el estado de la aplicación Gossip X1 se puede comprimir usando una propiedad del sistema. Habilitar esta configuración permite la creación de muchos índices virtuales. Antes de habilitar esta configuración, actualice todos los nodos 6.8.4.x a 6.8.4.2 (o superior). Una vez que todos los nodos estén en 6.8.4.2, podrán descomprimir el estado de la aplicación incluso si la configuración aún no está configurada localmente.
Elassandra usa el protocolo Cassandra GOSSIP para administrar la tabla de enrutamiento de Elasticsearch y Elassandra 6.8.4.2+ agrega soporte para la compresión del estado de la aplicación X1 para aumentar el número máximo de índices de Elasticsearch. Para compatibilidad con versiones anteriores, la compresión está deshabilitada de forma predeterminada, pero una vez que todos sus nodos se actualicen a la versión 6.8.4.2+, debe habilitar la compresión X1 agregando -Des.compress_x1=true en su conf/jvm.options y reinicie todo. nodos. Los nodos que ejecutan la versión 6.8.4.2+ pueden leer X1 comprimido y no comprimido.
Antes de la versión 6.2.3.21, el factor de replicación de Cassandra para el espacio de claves elastic_admin (y elastic_admin_[datacenter.group]) se ajustaba automáticamente al número de nodos del centro de datos. Desde la versión 6.2.3.21 y debido a que tiene un impacto en el rendimiento en clústeres grandes, ahora depende de su administrador de Elassandra ajustar adecuadamente el factor de replicación para este espacio de claves. Tenga en cuenta que las actualizaciones de mapeo de Elasticsearch dependen de una transacción PAXOS que requiere que los nodos QUORUM se realicen correctamente, por lo que el factor de replicación debe ser al menos 3 en cada centro de datos.
La versión de metadatos de Elassandra 6.2.3.19 ahora depende de la tabla Cassandra elastic_admin.metadata_log (que era elastic_admin.metadata de 6.2.3.8 a 6.2.3.18) para mantener el historial de actualización del mapeo de elasticsearch y recuperarse automáticamente de un posible problema de tiempo de espera de escritura de PAXOS.
Al actualizar el primer nodo de un clúster, Elassandra copia automáticamente la versión metadata.version actual en la nueva tabla elastic_admin.metadata_log . Para evitar la incoherencia en la asignación de Elasticsearch, debe evitar la actualización de la asignación mientras la actualización continua está en curso. Una vez que se actualizan todos los nodos, elastic_admin.metadata ya no se usa y se puede eliminar. Luego, puede obtener el historial de actualizaciones de mapeo del nuevo elastic_admin.metadata_log y saber qué nodo actualizó el mapeo, cuándo y por qué motivo.
Elassandra 6.2.3.8+ ahora administra completamente el mapeo de elasticsearch en el esquema CQL mediante el uso de extensiones de esquema CQL (consulte system_schema.tables , extensiones de columna). Estas extensiones de tabla y las actualizaciones del esquema CQL resultantes de la creación/modificación del índice elasticsearch se actualizan en actualizaciones del esquema atómico por lotes para garantizar la coherencia cuando se producen actualizaciones simultáneas. Además, estas extensiones se almacenan en binario y admiten actualizaciones parciales para ser más eficientes. Como resultado, el mapeo de elasticsearch ya no se almacena en la tabla elastic_admin.metadata .
ADVERTENCIA: Durante la actualización continua, los cambios en la asignación de elasticserach no se propagan entre los nodos que ejecutan las versiones nueva y antigua, así que no cambie su asignación mientras esté actualizando. Una vez que todos sus nodos se hayan actualizado a 6.2.3.8+ y validados, aplique las siguientes declaraciones CQL para eliminar metadatos inútiles de elasticsearch:
ALTER TABLE elastic_admin.metadata DROP metadata ;
ALTER TABLE elastic_admin.metadata WITH comment = ' ' ;
ADVERTENCIA: Debido a las extensiones de tabla CQL utilizadas por Elassandra, algunas versiones antiguas de cqlsh pueden generar el siguiente mensaje de error "El objeto 'módulo' no tiene el atributo 'viewkeys'". . Esto proviene del antiguo controlador Python Cassandra integrado en Cassandra y se informó en CASSANDRA-14942. Posibles soluciones:
docker run -it --rm strapdata/cqlsh:0.1 node.example.com
Asegúrese de que Java 8 esté instalado y JAVA_HOME
apunte a la ubicación correcta.
export CASSANDRA_HOME=<extracted_directory>
bin/cassandra -e
bin/nodetool status
curl -XGET localhost:9200/_cluster/state
Intente indexar un documento en un índice no existente:
curl -XPUT ' http://localhost:9200/twitter/_doc/1?pretty ' -H ' Content-Type: application/json ' -d ' {
"user": "Poulpy",
"post_date": "2017-10-04T13:12:00Z",
"message": "Elassandra adds dynamic mapping to Cassandra"
} '
Luego busque en Cassandra:
bin/cqlsh -e " SELECT * from twitter. " _doc " "
Detrás de escena, Elassandra ha creado un nuevo Keyspace twitter
y una tabla _doc
.
admin@cqlsh > DESC KEYSPACE twitter;
CREATE KEYSPACE twitter WITH replication = { ' class ' : ' NetworkTopologyStrategy ' , ' DC1 ' : ' 1 ' } AND durable_writes = true;
CREATE TABLE twitter . " _doc " (
" _id " text PRIMARY KEY ,
message list < text > ,
post_date list < timestamp > ,
user list < text >
) WITH bloom_filter_fp_chance = 0 . 01
AND caching = { ' keys ' : ' ALL ' , ' rows_per_partition ' : ' NONE ' }
AND comment = ' '
AND compaction = { ' class ' : ' org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy ' , ' max_threshold ' : ' 32 ' , ' min_threshold ' : ' 4 ' }
AND compression = { ' chunk_length_in_kb ' : ' 64 ' , ' class ' : ' org.apache.cassandra.io.compress.LZ4Compressor ' }
AND crc_check_chance = 1 . 0
AND dclocal_read_repair_chance = 0 . 1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0 . 0
AND speculative_retry = ' 99PERCENTILE ' ;
CREATE CUSTOM INDEX elastic__doc_idx ON twitter. " _doc " () USING ' org.elassandra.index.ExtendedElasticSecondaryIndex ' ;
De forma predeterminada, los campos de Elasticsearch con varios valores se asignan a la lista de Cassandra. Ahora, inserte una fila con CQL:
INSERT INTO twitter. " _doc " ( " _id " , user, post_date, message)
VALUES ( ' 2 ' , [ ' Jimmy ' ], [dateof(now())], [ ' New data is indexed automatically ' ]);
SELECT * FROM twitter. " _doc " ;
_id | message | post_date | user
-- ---+--------------------------------------------------+-------------------------------------+------------
2 | [ ' New data is indexed automatically ' ] | [ ' 2019-07-04 06:00:21.893000+0000 ' ] | [ ' Jimmy ' ]
1 | [ ' Elassandra adds dynamic mapping to Cassandra ' ] | [ ' 2017-10-04 13:12:00.000000+0000 ' ] | [ ' Poulpy ' ]
( 2 rows)
Luego búscalo con la API de Elasticsearch:
curl " localhost:9200/twitter/_search?q=user:Jimmy&pretty "
Y aquí hay una respuesta de muestra:
{
"took" : 3 ,
"timed_out" : false ,
"_shards" : {
"total" : 1 ,
"successful" : 1 ,
"skipped" : 0 ,
"failed" : 0
},
"hits" : {
"total" : 1 ,
"max_score" : 0.6931472 ,
"hits" : [
{
"_index" : " twitter " ,
"_type" : " _doc " ,
"_id" : " 2 " ,
"_score" : 0.6931472 ,
"_source" : {
"post_date" : " 2019-07-04T06:00:21.893Z " ,
"message" : " New data is indexed automatically " ,
"user" : " Jimmy "
}
}
]
}
}
This software is licensed under the Apache License, version 2 ("ALv2"), quoted below.
Copyright 2015-2018, Strapdata ([email protected]).
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy of
the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations under
the License.