Arquitectónicamente, ¿cuál es la mejor manera de convertir un motor de base de datos de instancia única a distribuida?

De acuerdo, de varios comentarios he reunido la siguiente información sobre sus limitaciones y requisitos. Avísame si tengo algo mal aquí.

  1. Cifrado para satisfacer las reglas de seguridad de HIPAA
  2. Cumplimiento con el plan de recuperación ante desastres que cumple con HIPAA de su empresa
  3. Capaz de escalar a múltiples máquinas bajo una carga creciente del servidor
  4. Permitir la tenencia múltiple como parte de un producto PaaS.
  5. Los datos actuales se almacenan en múltiples archivos con formato JSON
  6. Los archivos de datos actuales son muy jerárquicos, y cada JSON tiene datos lógicamente similares (uno con información de muchos médicos, un archivo separado para los datos de las pruebas médicas de cada médico, etc.)

PaaS multi-tenancy puede brindarle la forma más fácil de distribución. Puede segmentar sus datos según el inicio de sesión de sus clientes. Mantenga una tabla en el nivel de API de inicio de sesión que le indique qué servidor aloja los datos de cada cliente. Esto probablemente no tendría casi ningún impacto en su arquitectura actual, aparte del enrutamiento inicial de las solicitudes de API.

Si cree que un solo cliente aún requeriría escalabilidad más allá de un solo servidor, elija algunos objetos raíz de alto nivel y particione en ellos. Esto puede ser tan simple como la primera letra del apellido de un médico. O el primer número en su número NPI. O quizás segmente por región, nombre del hospital o especialidad. Puede segmentar fácilmente sin divulgar información de salud protegida, por lo que las reglas de HIPAA no deberían ser un obstáculo.

En cuanto a las reglas de recuperación de desastres de HIPAA, probablemente no sean tan estrictas como cree. Por lo general, solo necesita un plan de recuperación ante desastres razonable y apropiado. A menos que esté construyendo un sistema en el que estar inactivo durante tres minutos le costará vidas, puede estar exagerando sus necesidades de conmutación por error. He trabajado en sistemas que cumplen con HIPAA para el almacenamiento y la recuperación de medicamentos y registros médicos programados, y ninguno de ellos tenía un requisito de tiempo de actividad de tres nueves.

El cumplimiento de la recuperación ante desastres de HIPAA tiene más que ver con un plan detallado de cómo se recuperará, a quién se le notificará y cuándo, y cómo se asegurará de que la información de salud protegida se mantenga segura durante el proceso. Sí, se le pedirá que se recupere “rápidamente”, pero eso será muy subjetivo.

De cualquier manera, la replicación básica maestro-esclavo probablemente resolverá sus necesidades de replicación. La implementación puede no ser trivial, pero las decisiones arquitectónicas se entienden bien en la industria, por lo que puede encontrar mucho material sobre esto.

En cuanto a la teoría del nivel de implementación de aprendizaje, sugiero los Principios de los sistemas de bases de datos distribuidas (Ozsu, Valduriez). Lo compré dos veces después de que la encuadernación se cayera de mi edición anterior, y creo que se extiende muy bien entre la teoría y los detalles de implementación. Es bastante largo, pero está estructurado de tal manera que solo necesita leer las secciones que sean apropiadas para sus necesidades.

FYI: edité esta respuesta en gran medida después de leer los comentarios proporcionados por el autor de la pregunta.

Dos cosas a considerar aquí:

Un archivo JSON no es más que un archivo de texto plano, especialmente si observa el “nivel de archivo físico”. Es solo en el nivel de la aplicación donde el código JSON comienza a derivar su estructura jerárquica. Por lo tanto, debe distribuir el archivo en sí (la replicación / partición tiene ventajas y desventajas) o su nivel de aplicación divide los datos por jerarquía (es decir, está implementando una partición de tamaño variable en un nivel superior).

¿Cuál es el motivo de la distribución? ¿Es para dividir la carga de trabajo de modo que se puedan realizar múltiples consultas / modificaciones simultáneamente a través de diferentes servidores? ¿O es para mantener múltiples copias de trabajo de los mismos datos? ¿O algo mas?

Primero, ignorando un enfoque híbrido: veamos la replicación. Esto significa que las modificaciones deben enviarse a todos los servidores. Esto a su vez significa que podría haber inconsistencias entre los servidores, ya que dicha distribución no es algo instantáneo. Esto causa problemas de versión, ya que cada servidor puede estar trabajando con una versión diferente de cualquier dato a la vez. Un método para evitarlo sería bloquear ciertas operaciones mientras se realiza dicha actualización, pero esto suele ser una muy mala idea para la concurrencia.

Segundo, particionamiento: ¿Dónde definir tales límites? En una tienda de tablas, puede elegir entre el tipo de datos (es decir, la columna) o el grupo de datos (es decir, las filas). Y esto funciona más fácilmente a nivel físico solo si se utilizan datos de longitud fija, especialmente si se dividen en filas.

Pero dado que sus datos son un archivo de texto plano sin formato con su estructura solo definida a nivel de aplicación, es muy difícil acceder a estos puntos sin analizar realmente la estructura de nivel de aplicación. Es posible dividir toda la estructura en archivos separados, por ejemplo, la agrupación de primer nivel en el archivo JSON puede dividirse en archivos separados.

La división en cualquier forma de partición de longitud fija es muy problemática en el mejor de los casos, a menos que cambie toda la estructura de base de datos en una variante de longitud fija, lo que normalmente no es posible para tales campos de longitud variable en estructuras jerárquicas. E implementar esto utilizando dicha estructura de capa de aplicación sería más adecuado para tenerlo también a nivel de aplicación, especialmente debido a la longitud variable impuesta por estructuras como JSON. Esto también significa que terminará con un límite impuesto por los datos sobre el número de nodos de distribución, que no se escala fácilmente a más, a menos que también comience a particionar en un nivel posterior. Además, la distribución impone un conjunto fijo de grupos permitidos en cada uno de estos niveles divididos; esto no es impuesto por JSON, por lo que deberá imponerlo en un nivel de aplicación de su propia creación.

Entonces ambas ideas son menos que ideales. La replicación aún ayudaría, ya que las consultas se pueden distribuir fácilmente, pero pueden hacer que las modificaciones sean mucho más lentas, sin mencionar que está desperdiciando mucho espacio al duplicar datos. La partición es difícil de lograr a menos que lo haga a nivel de aplicación y defina diferentes rutas a diferentes jerarquías.

Un enfoque híbrido en realidad no ayuda con esos aspectos negativos. En efecto, simplemente agregaría problemas de versión / bloqueo en la partición y aún requeriría que se dividiera a nivel de aplicación.

Mi temor es que su elección de estructura de datos no se preste bien a la distribución. Es decir, JSON no debe usarse de esta manera. Esto tiende a ser debido a la nueva palabra de moda de “noSQL” como si fuera algo “nuevo”. Especialmente la idea “no estructurada” de noSQL se parece más al enfoque de archivo plano utilizado en los mainframes de los años 60 que al enfoque estructurado en bases de datos de tipo SQL desde los años 70. Es decir, el nivel físico más bajo no tiene conocimiento de la estructura de los datos y, por lo tanto, no puede hacer tal división y replicación por sí solo. En casi todos los casos de distribución noSQL, se realiza a través de la replicación únicamente como una forma de respaldo en lugar de concurrencia.

Si observa las bases noSQL diseñadas específicamente para la distribución concurrente, todas utilizan un almacén de datos de longitud fija más estructurado en lugar de archivos planos no estructurados de longitud variable basados ​​como Json / XML / s-expr / etc. Como ejemplo, observe uno de los más comunes: NoSQL distribuido: Cassandra que básicamente implementa una tienda “sin tipo” estructurada en la parte superior de una tienda de tablas estructuradas. Es decir, implementa noSQL sobre SQL para permitir los beneficios de los datos estructurados para permitir una partición y una replicación más fáciles y más eficientes.

Dependería de los datos que se supone que almacenará la base de datos y el propósito de los datos.

Un archivo de propósito general (digamos un archivo de texto) como la estructura de datos sería bueno para la distribución. Según el tamaño de los datos o algún otro parámetro, distribuya los datos.

O una tienda de columnas. Por ejemplo, distribuir según la letra inicial de cada atributo de columna.

Si se trata de un almacén de filas, puede tener varias instancias, cada una con todas las tablas, pero digamos que instancia1 contendrá los datos hasta la fila 50. Instancia2 de 51-100 y así sucesivamente. Y luego master db puede contener los índices de cada columna asignada con la instancia. Así, master db sabrá qué instancia buscar.

Estas son solo algunas de las sugerencias, pero el principio subyacente (según mi opinión) se basa en el formato en el que se deben almacenar los datos.

La mejor manera de mover datos de un motor a otro y retener todos los beneficios del nuevo motor de base de datos es volver a transmitir los datos a la nueva base de datos. De esta manera, todos los índices / particiones / clústeres / cubos se crean correctamente desde cero y están en su estado óptimo y / o equilibrado. Esto también evita tener que entender las estructuras de archivos físicos de la base de datos subyacente.

More Interesting

¿Cuál es el mejor software o aplicación para programar ingenieros en muchos proyectos diferentes?

¿Qué es el diseño estructural en ingeniería de software?

¿Cuáles son los mejores eventos que pueden formar parte de un foro de tecnología de software?

¿Por qué un reproductor de audio no tiene problemas al reproducir audio directamente desde un archivo de video intercalado?

¿Cuáles son las buenas certificaciones para los probadores de software?

¿Cuáles son las principales ciudades de EE. UU. A las que mudarse si uno quiere encontrar una entrada para un trabajo de desarrollo de software de nivel junior?

¿Cómo describirías la "forma Linux" de diseñar software?

¿Cuáles son algunas de las medidas de éxito y KPI para un producto de software basado en SaaS?

¿Qué es Selenium RC y para qué se utiliza?

¿Puedo cambiar a su dominio después de tener 1 año de experiencia en el dominio de telecomunicaciones?

¿Qué es una biblioteca y cómo uso diferentes bibliotecas en C ++?

¿Dónde puedo encontrar una buena plantilla para probar el software? ¿Usted tiene alguna?

Muchas empresas que adoptan Agile están utilizando un sistema de evaluación del desempeño, por ejemplo, estableciendo un objetivo de equipo para aumentar la velocidad xx% para fin de año. ¿Esto es bueno o malo?

¿Por qué son importantes las habilidades de programación en la industria del desarrollo de software?

¿Qué carrera profesional ofrece un mejor crecimiento y seguridad laboral en el punto de un estudiante de ECE, desarrollo de productos de software o desarrollo de productos integrados?