una soporta segundo rapida por optimizar optimizacion mas lentas hacer cuantas consultas consulta con como cassandra

soporta - Cómo crear ID de incremento automático en Cassandra



optimizacion de consultas sql (8)

Sabemos que es fácil crear identificadores de incremento automático en bases de datos SQL. ¿Existe una buena solución en Cassandra? Los ID deben ser para la clave o el nombre de la columna.


¿ Realmente necesitan ser secuenciales, o solo necesitas contar números que son mucho más pequeños que un UUID que ingresa fácilmente una persona?

Si realmente necesita números secuenciales, necesitará hacer uno de los siguientes.

  • Tenga una mesa en cassandra donde la clave / id es un campo para el generador, y el valor es un número ... realice actualizaciones condicionales en un bucle hasta que incremente exitosamente el conteo. (mala idea)

  • Tenga un servicio de generador que le dará el próximo número. Esto solo puede ejecutarse en un solo sistema y ser un único punto de falla, pero dependiendo de sus necesidades, esto podría ser lo mejor.

Alternativamente ... Similar al primero, pero obtenga lotes de 100 o más números a la vez, y trátelos dentro de su proceso / hilo ... Esto tendrá menos contención, pero no garantía de orden secuencial, solo unicidad. Si solo quieres números más cortos que sean únicos para mostrar, esta puede ser tu mejor opción.


¿Qué tal lo siguiente, usando las transacciones de peso ligero de Cassandra?

1 - Crear tabla de ID:

CREATE TABLE ids ( id_name varchar, next_id int, PRIMARY KEY (id_name) )

2 - Inserta todos los ID que quieras usar en una secuencia global con

Por ejemplo:

INSERT INTO ids (id_name, next_id) VALUES (''person_id'', 1)

3 - Luego, al insertar en una tabla donde le gustaría usar una clave autoincrementada, haga lo siguiente:

3.1 - Obtenga el next_id de la tabla de ids:

SELECT next_id FROM ids WHERE id_name = ''person_id''

Digamos que el resultado es next_id = 1

3.2 - Incrementar next_id, de la siguiente manera:

UPDATE ids SET next_id = 2 WHERE id_name = ''person_id'' IF next_id = 1

El resultado debería verse así:

[{[applied]: True}]

Si se actualizó con éxito, O

[{[applied]: False, next_id: 2}]

Si alguien más ya lo ha actualizado.

Entonces, si tienes True, usa la identificación ''1'' - es tuya. De lo contrario, incremente next_id (o simplemente use el next_id devuelto) y repita el proceso.


Crear una secuencia secuencial global de números realmente no tiene sentido en un sistema distribuido. Use UUIDs

(Porque tendrías que hacer que todos los participantes estén de acuerdo y acepten la evolución de la secuencia, bajo una implementación ingenua)


Creo que en mi humilde opinión, con la expectativa de que Cassandra brinde un campo de auto incremento es MAL

Cassandra es una elegante base de datos descentralizada, por lo que se espera que proporcione un campo de autoincrustación, que grava y derrota el propósito original, ya que este valor debe mantenerse en un lugar central.

Por lo tanto, no haga ninguna solución que DB base para obtener un número de auto-incremento

En su lugar, genere la ID en el código o servicio de su aplicación, que puede seguir generando ID únicos al azar y usar eso para aplicar en su modelo de datos, de esta forma el objetivo y el beneficio de Cassandra no serán derrotados.


Esta pregunta es bastante antigua, pero me gustaría completarla con otra solución.

Cualquier solución que dependa de la sincronización de nodos no es razonable. Seguramente se romperá bloqueando la generación de ID o creando ID duplicados.

Forma de MySQL

Puede reproducir la forma en que se hace con la réplica master-master de mysql con los parámetros auto_increment_increment y auto_increment_offset .

Para reproducirlo, necesita saber la cantidad de nodos o la cantidad máxima de nodos esperados y debe crear un contador (que no sea cassandra) (un archivo por ejemplo) en cada nodo.

Cada vez que desee generar un nuevo número, encontrará el valor actual, agregará el incremento y lo guardará. Si aún no existe, es el desplazamiento.

Entonces para 10 nodos, tendría un incremento de 10 y un desplazamiento de 1 para el primer nodo, 2 para el segundo nodo, etc. El nodo 1 crearía los ID 1, 11, 21. El nodo 2 crearía los ID 2, 21, 22.

Si desea que sus ID se ordenen (aproximadamente) entre nodos, debe mantener un contador compartido y asegurarse de que cada ID generada sea más alta que el contador compartido. De esta forma, a menos que sus nodos / datacenters no estén sincronizados durante mucho tiempo, no debería notar mucha diferencia.

Prefijo

Puede hacer básicamente lo mismo prefijando la ID (si es una solución aceptable) con el número de nodo (o nombre). Y no tienes que saber la cantidad de nodos. El nodo 1 crearía 1_1, 1_2, 1_3. El nodo 2 crearía 2_1, 2_2, 2_3.


No hay una buena solución.

  1. Cree una columna con un número, aumente el número y guárdelo en todas las réplicas junto con una identificación temporal, lea todas las réplicas y verifique si la identificación temporal es "suya", de lo contrario vuelva a hacerlo ... no es una gran solución y no lo hará escala.

o

  1. Crea tu propio servicio de id donde obtendrás tu próxima identificación. Este servicio solo se ejecutará en una sola instancia y será un factor que no escalará el miedo.

Tan pronto como algo va más allá de una sola instancia, la secuencia de los identificadores se complica, al menos si lo quiere escalar. Eso incluye bases de datos relacionales.


hay un tipo de datos de contador que se puede usar. Considera el siguiente ejemplo.

CREATE KEYSPACE counterks WITH REPLICATION = { ''class'' : ''NetworkTopologyStrategy'', ''datacenter1'' : 3 };

Crea una tabla para la columna del contador.

CREATE TABLE counterks.page_view_counts (counter_value counter, url_name varchar, page_name varchar, PRIMARY KEY (url_name, page_name) );

Cargar datos en la columna del contador.

UPDATE counterks.page_view_counts SET counter_value = counter_value + 1 WHERE url_name=''www.datastax.com'' AND page_name=''home'';

Eche un vistazo al valor del contador.

SELECT * FROM counterks.page_view_counts;

La salida es:

url_name | page_name | counter_value ------------------+-----------+--------------- www.datastax.com | home | 1

Aumenta el valor del contador.

UPDATE counterks.page_view_counts SET counter_value = counter_value + 2 WHERE url_name=''www.datastax.com'' AND page_name=''home'';

Eche un vistazo al valor del contador.

url_name | page_name | counter_value ------------------+-----------+--------------- www.datastax.com | home | 3

Remítalo para más detalles: http://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html


Editar: esta solución no es adecuada. Ver el primer comentario.

Mi solución:

1 - Crear tabla de ID:

CREATE TABLE ids ( id_name varchar, next_id counter, PRIMARY KEY (id_name) )

2 - Cuando inserte en una tabla donde desea usar una tecla de incremento automático, haga lo siguiente:

2.1 - Contador de incremento (se creará si no existe), utilizando el nivel de consistencia más alto

UPDATE ids SET next_id = next_id + 1 WHERE id_name = $AUTO_INCREMENTED_ID USING CONSISTENCY ALL

2.2 - Obtenga el nuevo valor de identificación:

SELECT next_id FROM ids WHERE id_name = $AUTO_INCREMENTED_ID

2.3 - Insertar el valor con el ID autoincrementado

INSERT INTO some_table ($AUTO_INCREMENTED_ID, ...) VALUES ($RESULT_FROM_PREVIOUS_QUERY, ...)

Las palabras que comienzan con ''$'' en mi respuesta son marcadores de posición que se explican por sí mismos (espero) ...

Por supuesto, este no es un método recomendado. Úselo solo si es necesario.