Muchas de las aplicaciones de LOB que ofrecemos a nuestros clientes son de naturaleza comercial/promocional (sorteos, registro de eventos, etc.). La mayoría de las aplicaciones, aunque son muy simples, son muy exigentes en la base de datos. Imagine un sitio tipo "registro" como respaldo de un comercial que se emite durante la superbowl, por ejemplo (sí, hemos tenido varios).Diseño de base de datos para la aplicación web de escritura pesada
Aunque hemos mejorado la optimización de nuestro código de aplicación web, la base de datos siempre sigue siendo un problema, a pesar de que la aplicación es relativamente simple. El flujo es típicamente algo como:
- Leer de base de datos para detectar registro existente
- de escritura a la base de datos si el registro es nuevo
En muchos casos, se trata de acceder a todos los datos de nuestra aplicación necesita realizar. Sin embargo, dado que es el único propósito de la aplicación, es muy importante que este proceso simple se optimice en gran medida.
Para los fines de esta pregunta, tenemos un único servidor que ejecuta una matriz de discos raid 5 para los archivos de datos y otra matriz raid 5 para los registros. En este momento, el sistema operativo es Windows 2003 estándar de 32 bits y el servidor tiene 4 GB de memoria. Algunas aplicaciones usan el estándar SQL 2005 mientras que otras usan MySQL 5.1. Soy muy consciente que ciertas optimizaciones de SO y hardware son posibles aquí, pero estoy tratando de abordar mis necesidades desde el lado del software primero. El perfil extenso nos ha enseñado que disco IO es generalmente el principal cuello de botella.
Habiendo dicho todo eso, y sabiendo que el almacenamiento en caché no ayudará mucho ya que la mayoría de las lecturas son únicas y devuelven muy pocos datos (a menudo solo un poco indicando si un registro existe o no), estoy considerando dar un salto el ámbito de las bases de datos en memoria como una especie de capa de caché de escritura en la base de datos real. Esto parece una buena opción dado que la mayoría de nuestro tráfico de alto volumen es de naturaleza esporádica y no se mantiene durante varias horas. Además, la pérdida potencial de unos pocos minutos de datos debido a un bloqueo del servidor sería aceptable en la mayoría de los casos.
En la forma más simple, me gustaría modificar una aplicación típica de inscripción para hacer lo siguiente:
- Consulta el disco DB y DB memoria para registros existentes
- si no tiene, escribir datos en la memoria DB y volver
- DB memoria periódicamente descarga a disco DB
Mi pregunta es: ¿cuáles son mis opciones para este intermedio mí en base de datos mory? He experimentado con tablas hash en memoria, tablas de datos, etc., pero estoy buscando otras opciones o incluso sugerencias para un enfoque completamente diferente.
Proporcione un orden de magnitud para el número y tamaño de registros, tal vez diferenciando el conteo antes de una campaña en particular, y después (es decir, incluyendo una idea aproximada del recuento de registros adicionales durante la campaña) – mjv
En una aplicación típica respaldada por conductores de alto tráfico como anuncios de televisión o anuncios de radio, podríamos ver más de ~ 200,000 intentos de registro en un período de 15-30 minutos después del anuncio. La mayor parte de esto generalmente se produce dentro de un período de 3-5 minutos inmediatamente después del spot, de ahí el problema de contención. El volumen no es el problema, es la concurrencia el problema. Nuestra base de datos más grande para una sola aplicación a corto plazo de esta naturaleza se acercó a 10 millones de registros en 2 meses, y la mayor parte del tráfico proviene de anuncios televisivos y campañas de correo electrónico. – Chris
Otra opción sería encapsular la lógica UPSERT en un procedimiento almacenado, lo que le ahorraría un viaje de la base de datos (y gastos indirectos relacionados). –