Mysql: Trabajando con 192 trillones de registros ... (Sí, 192 trillones)


39

Aquí está la pregunta ...

Considerando 192 trillones de registros, ¿cuáles deberían ser mis consideraciones?

Mi principal preocupación es la velocidad.

Aquí está la mesa ...

    CREATE TABLE `ref` (
  `id` INTEGER(13) AUTO_INCREMENT DEFAULT NOT NULL,
  `rel_id` INTEGER(13) NOT NULL,
  `p1` INTEGER(13) NOT NULL,
  `p2` INTEGER(13) DEFAULT NULL,
  `p3` INTEGER(13) DEFAULT NULL,
  `s` INTEGER(13) NOT NULL,
  `p4` INTEGER(13) DEFAULT NULL,
  `p5` INTEGER(13) DEFAULT NULL,
  `p6` INTEGER(13) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY (`s`),
  KEY (`rel_id`),
  KEY (`p3`),
  KEY (`p4`)
    );

Aquí están las consultas ...

SELECT id, s FROM ref WHERE red_id="$rel_id" AND p3="$p3" AND p4="$p4"

SELECT rel_id, p1, p2, p3, p4, p5, p6 FROM ref WHERE id="$id"

INSERT INTO rel (rel_id, p1, p2, p3, s, p4, p5, p6)
VALUES ("$rel_id", "$p1", "$p2", "$p3", "$s", "$p4", "$p5", "$p6")

Aquí hay algunas notas ...

  • Los SELECT se realizarán con mucha más frecuencia que el INSERT. Sin embargo, ocasionalmente quiero agregar algunos cientos de registros a la vez.
  • En cuanto a la carga, no habrá nada durante horas, entonces tal vez algunos miles de consultas a la vez.
  • No creo que pueda normalizar más (necesito los valores de p en una combinación)
  • La base de datos en su conjunto es muy relacional.
  • Esta será la mesa más grande con diferencia (la siguiente más grande es de aproximadamente 900k)

ACTUALIZACIÓN (08/11/2010)

Curiosamente, me dieron una segunda opción ...

En lugar de 192 billones, podría almacenar 2.6 * 10 ^ 16 (15 ceros, lo que significa 26 billones) ...

Pero en esta segunda opción solo necesitaría almacenar un bigint (18) como índice en una tabla. Eso es todo, solo una columna. Así que solo estaría comprobando la existencia de un valor. Ocasionalmente agrega registros, nunca los elimina.

Eso me hace pensar que debe haber una solución mejor que mysql para simplemente almacenar números ...

Dada esta segunda opción, ¿debería tomarla o seguir con la primera ...

[editar] Acabo de recibir noticias de algunas pruebas que se han realizado: 100 millones de filas con esta configuración devuelven la consulta en 0.0004 segundos [/ editar]


77
¿Qué tan establecido estás usando MySQL para esto? ¿Podría estar convencido de cambiar a un dbms diferente si alguien proporciona argumentos sólidos para hacerlo?
WheresAlice

3
¿Trillón como en 10 ^ 12 o como en 10 ^ 18?
andol

15
Con 192 trillones de registros, debe tener un presupuesto que le permita hacer preguntas a los encargados de MySQL, no a algunos foros de discusión.
Remus Rusanu

55
Con una base de datos tan grande (y obviamente un presupuesto decente), ¿por qué no optar por una solución de servidor Oracle o SQL que ha demostrado manejar fácilmente bases de datos grandes?
Jim B

55
Asegúrese de mantenernos actualizados cuando implemente esto. Ciertamente estaría interesado. También puede escribirlo en highscalability.com
Tom O'Connor

Respuestas:


30

La estimación de pQd de 7 PB parece razonable, y esa es una gran cantidad de datos para un RDBMS. No estoy seguro de haber oído hablar de alguien haciendo 7PB con cualquier sistema de disco compartido, y mucho menos MySQL. Consultar este volumen de datos con cualquier sistema de disco compartido será inusualmente lento. El hardware SAN más rápido alcanza un máximo de 20 GB / seg incluso cuando está sintonizado para grandes consultas de transmisión. Si puede permitirse el hardware SAN de esta especificación, puede usar algo que se adapte mejor al trabajo que MySQL.

De hecho, estoy luchando por concebir un escenario en el que pueda tener un presupuesto para un subsistema de disco de esta especificación, pero no para una mejor plataforma DBMS. Incluso utilizando discos de 600GB (la unidad de '' empresa '' más grande de 15K actualmente en el mercado) tiene alrededor de 12,000 unidades de disco físico para almacenar 7PB. Los discos SATA serían más baratos (y con discos de 2TB necesitarías alrededor de 1/3 del número), pero un poco más lento.

Una SAN de esta especificación de un proveedor importante como EMC o Hitachi costaría muchos millones de dólares. La última vez que trabajé con equipos SAN de un proveedor importante, el costo de transferencia de espacio en un IBM DS8000 fue de más de £ 10k / TB, sin incluir ninguna asignación de capital para los controladores.

Realmente necesita un sistema de nada compartido como Teradata o Netezza para esta cantidad de datos. Es posible que particionar una base de datos MySQL, pero recomendaría una plataforma VLDB especialmente diseñada. Un sistema de nada compartido también le permite usar un disco de conexión directa mucho más barato en los nodos: eche un vistazo a la plataforma Sun X4550 (thumper) para una posibilidad.

También debe pensar en sus requisitos de rendimiento.

  • ¿Qué es un tiempo de ejecución aceptable para una consulta?
  • ¿Con qué frecuencia consultará su conjunto de datos?
  • ¿Se pueden resolver la mayoría de las consultas utilizando un índice (es decir, van a ver una pequeña fracción, digamos: menos del 1%, de los datos) o necesitan hacer un análisis completo de la tabla?
  • ¿Qué tan rápido se cargarán los datos en la base de datos?
  • ¿Sus consultas necesitan datos actualizados o podría vivir con una tabla de informes actualizada periódicamente?

En resumen, el argumento más fuerte contra MySQL es que estaría haciendo backflips para obtener un rendimiento de consulta decente sobre 7PB de datos, si es posible. Este volumen de datos realmente lo coloca en un territorio de nada compartido para hacer algo que lo consultará razonablemente rápido, y probablemente necesitará una plataforma diseñada desde el principio para una operación de nada compartido. Los discos por sí solos reducirán el costo de cualquier plataforma DBMS razonable.

Nota: Si divide sus bases de datos operativas y de informes, no necesariamente tiene que usar la misma plataforma DBMS para ambas. Obtener inserciones rápidas e informes de menos de un segundo de la misma tabla de 7 PB será un desafío técnico al menos.

Debido a sus comentarios de que puede vivir con cierta latencia en los informes, puede considerar sistemas de captura e informes separados, y es posible que no necesite mantener todos los 7 PB de datos en su sistema de captura operacional. Considere una plataforma operativa como Oracle (MySQL puede hacer esto con InnoDB) para la captura de datos (nuevamente, el costo de los discos solo reducirá el costo del DBMS a menos que tenga muchos usuarios) y una plataforma VLDB como Teradata, Sybase IQ, RedBrick, Netezza (nota: hardware propietario) o Greenplum para informes


1
@ConcernedOfTunbridgeW: siempre pueden ir de esta manera: blog.backblaze.com/2009/09/01/… : mucho más divertido que SAN, solo se necesitan ~ 120-130 cajas de 4U ... pero no estoy seguro de si negocio 'sería feliz ....
pQd

Esencialmente un Sun Thumper con un presupuesto y realmente un ejemplo de una opción para un nodo en un sistema de nada compartido. Estoy seguro de que también he visto otras opciones para esto, pero no puedo pensar en dónde. La pregunta no es tanto qué hardware sino qué plataforma de base de datos.
Preocupado por

Sin embargo, los observadores entusiastas notarán que cualquier tipo de cuadro basado en conexión directa como este es mucho, mucho más barato por TB que cualquier otro basado en una SAN, que es al menos un argumento significativo a favor de algo diseñado para funcionar en una plataforma de nada compartido. .
Preocupado por

@ConcernedOfTunbridgeWells y puede ejecutar todas esas consultas / mantenimiento y cualquier otra cosa en paralelo en varios cuadros [de lo contrario hambrientos de energía].
pQd

1
@ConcernedOfTunbridgeWells - para responder sus preguntas ... Necesito alrededor de 500 consultas para regresar en menos de un segundo, si es posible. Haré esto solo unas pocas cientos de veces al día. Sin embargo, cuando se ejecuta una consulta, es necesario escanear la tabla completa. Además, los INSERT son de menor prioridad que los SELECT, por lo que no tiene que estar cerca del instante. Puedo esperar unas horas para que los datos "nuevos" entren en la base de datos.
Sarah

16

fragmentarlo En este tamaño, tener una instancia grande es un suicidio: piense en posibles restauraciones de copias de seguridad, daños en el espacio de tablas, agregando nuevas columnas o cualquier otro proceso de 'mantenimiento de la casa'; todo eso es imposible de hacer en un tiempo razonable a esta escala.

cálculos simples del reverso de la envolvente: suponiendo enteros de 32 bits para todas las columnas, excepto la identificación de 64 bits; sin índices incluidos:

8 * 4B + 8B = 40B por fila [y esto es muy optimista]

192 trillones de filas 40B cada uno nos da casi 7 PB

tal vez pueda repensar todo el asunto, resumir información para informes rápidos y almacenar registros comprimidos para intervalos de tiempo determinados cuando alguien necesita profundizar en detalles más profundos.

preguntas para responder:

  • ¿Cuál es el tiempo de inactividad aceptable en caso de que el sistema se bloquee / reinicie?
  • cuál es el tiempo de inactividad accesible cuando necesita recuperar una copia de seguridad o sacar el servidor de producción para el mantenimiento planificado.
  • ¿con qué frecuencia y dónde desea hacer una copia de seguridad?

enlaces aleatorios - velocidad de las inserciones:


Estoy de acuerdo, 7 PB es bastante pesado. Me encantaría repensarlo y encontrar una solución más ligera, pero necesito encontrar la existencia (o inexistencia) de una combinación particular de los campos p. Separar las tablas me pasó por la mente: es más sensato, pero solo significa que tengo la consulta de cada tabla por turno. Por interés, ¿en cuántas tablas recomendaría dividir aquí?
Sarah

55
@Sarah: no solo recomendaría dividir en tablas sino también en máquinas. puede ejecutar sus consultas en paralelo para ganar rendimiento [lo hago a menor escala]. ¿Qué pasa con las corrupciones del sistema de archivos o incluso el chequeo de rutina después del reinicio del servidor? No estoy seguro de qué quieres decir con encontrar una combinación particular ... ¿tal vez sería útil una simple tienda de valores clave? tamaño de la tabla: no más de unas pocas decenas de GB; datos en un solo servidor: no más de unos pocos TB. mira stackoverflow.com/questions/654594 para saber qué dolor de cabeza esperar a una escala mucho menor; use innodb_file_per_table
pQd


2

Puede haber otra forma, en lugar de almacenar miles de millones de números si todo lo que quiere hacer es ver si están en el conjunto. Los filtros de Bloom son un método probabilístico, mediante hashing de múltiples maneras. Además, los falsos positivos son posibles, pero los falsos negativos no lo son. (Entonces, podría decir que el número está en el conjunto, y estar equivocado, pero no dirá que no está allí, si realmente estaba). También existe el problema de la gran cantidad de artículos para almacenar, pero al menos podría reducir un poco el tamaño del conjunto de datos de trabajo.


Suena interesante, aunque podría vivir con falsos negativos, pero no con los falsos positivos :)
Sarah

2

Editar: en realidad, si es solo la existencia o no de un "registro" en la ubicación X en un rango de enteros, podría eliminar el almacén de datos y simplemente usar el mapa de bits ... Entonces, aproximadamente 10 máquinas con 100 TB de espacio en disco (por lo que tiene 10 copias de su mapa de bits para el rendimiento y la copia de seguridad) y si hiciera 128 GB de RAM por servidor, podría ajustar un índice de grupo de bloques de nivel superior de alta resolución en la memoria para hacer una primera comprobación antes de golpear el disco para el bit X de 26 Quadrillion .

Iría por la opción # 2 si tomas:

375 máquinas con 64TB (32 unidades de 2TB) cada una (en realidad 400 máquinas para fallas) luego simplemente mapean los registros en ZVOL que son 2TB cada uno. Luego, en uno o más servidores de índice, almacene en una matriz Judy o matriz critbit o simplemente en un mapa de bits simple, una asignación de si ha agregado un registro a esa 1 de 26 ubicaciones de Quadrillion. El índice estaría entre 50 y 100TB e incluso podría tener un índice de segundo nivel que indicara si hay registros escritos en un determinado bloque de direcciones de 64k que cabría en menos de 64 GB de RAM y proporcionaría un nivel rápido de verificación inicial si cierto "barrio" estaba vacío o no.

Luego, para leer ese registro, primero verificará si hay un registro para buscar mirando el índice. Si lo hay, vaya a la máquina # (X) / ZOL # (Y) en esa máquina / registre la ubicación # (Z) dentro de ese blob de 2TB basado en el cálculo de índice simple. Las búsquedas de registros individuales serían extremadamente rápidas y podría probar cargar algunas partes del almacén de datos en diferentes bases de datos (mientras usa el almacén de datos para un trabajo real) y realizar pruebas de rendimiento para ver si son capaces de admitir toda su base de datos, o no, solo usa el almacén de datos de esa manera.

Un ZOL es una cosa de ZFS que podría pensarse en un archivo disperso en otros sistemas de archivos, por lo que se aplicarían cosas similares. O simplemente puede indexar a un cierto número de bytes en un disco, pero esto se vuelve complicado si los discos son de diferentes tamaños si no limita el número de bytes utilizados por disco en un nivel que funcione para todos los discos, es decir, 1.75TB por disco de 2TB . O cree metadispositivos de tamaño fijo, etc.


Hola, Sarah: no estoy seguro de si todavía estás trabajando en esto, pero si necesitas ayuda, podría crear un prototipo de mi idea para ti en una máquina de 100 TB y también estaría dispuesto a alojar (en un importante centro de datos de EE. UU.) Y administrar el grupo completo de producción de 400-500 máquinas según sea necesario. Por cierto, ¿alguna vez trabajaste en CNET en SF?

1

Además de ajustar sus parámetros de base de datos como locos (use mysqltuner para ayudar) para tratar de mantener sus SELECT almacenados en caché tanto como sea humanamente posible, una cosa que podría investigar es INICIAR TRANSACCIÓN / COMMIT (suponiendo InnoDB) al insertar sus cientos de registros para evitar fila por fila se bloquea por encima y reduce el tiempo de inserción por un factor enorme. También crearía la tabla como MyISAM e InnoDB y realizaría pruebas en ella para ver cuál es realmente más rápido una vez que apriete el almacenamiento en caché; no siempre es que MyISAM sea más rápido para las lecturas.

http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/

Durante la prueba, la cantidad de subprocesos concurrentes también debe variar de arriba a abajo hasta que encuentre el punto óptimo para la cantidad de RAM que puede permitirse en el servidor para dedicar a ajustar las cachés; es posible que, si bien puede admitir más subprocesos por las matemáticas, el DB en sí mismo puede funcionar peor si el recuento de subprocesos es demasiado alto.

Además, si usa MyISAM y / o InnoDB archivo por tabla, podría investigar la creación de un punto de montaje de sistema de archivos diferente para / var / lib / mysql que se ajustó a un tamaño de bloque más pequeño y ajustó los parámetros de tipo fs, es decir, ext3 / ext4 / resiserfs puede usar data = writeback para el diario y deshabilitar la actualización de los tiempos de acceso en el sistema de archivos para la velocidad de E / S.


1
myisam parece estar fuera de cuestión debido a los requisitos de la transacción.
pQd

0

Para la segunda opción, ¿cuántos números se pueden colocar realmente?

Si solo habrá uno en mil, o 10K, 100K, etc., el almacenamiento de rangos de números usados ​​(o no usados) podría ahorrar billones de entradas. por ejemplo: almacenamiento ('libre', 0,100000), ('tomado', 100000,100003), ('libre', 100004,584234): división de filas en dos o tres filas según sea necesario e indexación en el primer número, buscando x <= {aguja} para ver si el rango que contiene el número buscado es tomado o libre.

Es posible que ni siquiera necesite ambos estados. Simplemente almacene el estado que sea menos probable.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.