Tabla de contenido
PalancaPrefacio
Recuerda que estuvimos aquí Introducción a los conceptos básicos de bases de datos: diseño de sistemas 08 Después de explicar la base de datos relacional, este artículo explicará el principio del almacén de valores clave con más profundidad. Por supuesto, también proporcionaré una introducción a NoSQL y la base de datos de valores clave a continuación.
¿Qué es NOSQL?
NoSQL significa No solo SQL y es una base de datos no relacional, lo que significa que no utiliza el modelo de base de datos relacional tradicional para almacenar datos. Las bases de datos NoSQL suelen utilizar modelos de datos más flexibles y extensibles, como pares clave-valor, archivos, gráficos o tablas amplias. Este artículo explicará la base de datos clave-valor.
¿Qué es una base de datos clave-valor?
Las bases de datos clave-valor utilizan métodos clave-valor, como tablas hash, para almacenar datos en forma de pares clave-valor. La clave actúa como clave principal y el valor puede ser cualquier cosa, desde un simple valor escalar hasta un objeto complejo. Las bases de datos de valores clave comunes incluyen: Amazon DynamoDB, Redis.
Tienda de valor clave
Key-Value Store es una tabla hash distribuida, en la que DHT es un método de almacenamiento descentralizado que proporciona búsqueda y almacenamiento similar a una tabla hash. La tabla hash también es un tipo de datos abstractos (ADT). Su ventaja es que normalmente puede completar la operación de búsqueda en un tiempo relativamente rápido. Primero hablemos del principio del hash. Un conjunto de claves se genera mediante una función hash y es una clave única. Key-Value Store vincula la clave a un valor específico y el valor puede ser un tipo de almacenamiento como Mapa o Imagen.
Normalmente limitaremos el valor a un tamaño de archivo relativamente pequeño, aproximadamente de MB a KB de tamaño de contenido. El almacenamiento de datos clave-valor se puede utilizar en muchos escenarios diferentes, como crear un Messenger y almacenar conversaciones de usuarios. Dichos escenarios son muy adecuados para utilizar este enfoque NoSQL.
¿Cómo diseñar un almacén de datos clave-valor?
Si desea diseñar un componente del sistema, primero debe volver a la pregunta original ¿Cuáles son los requisitos para este componente del sistema? Para los lectores que han olvidado sus necesidades, se recomienda que lo vean. Características no funcionales del diseño de software – Diseño de sistemas 03 .
Requerimiento funcional
Generalmente, el almacenamiento clave-valor es el mismo que el de una base de datos general y tiene algunas funciones comunes, como las funciones get y put. Sin embargo, todavía existen algunas diferencias en los requisitos funcionales entre los sistemas de almacenamiento de valor clave y los sistemas de almacenamiento generales.
- Servicios configurables: algunos sistemas pueden sacrificar una fuerte coherencia (Consistencia) por una mayor disponibilidad (Disponibilidad). El almacén de valores clave deberá proporcionar servicios configurables para que el modelo de coherencia pueda utilizarse en diferentes sistemas.
- Capacidad de escribir siempre: el sistema debe tener la capacidad de escribir en el almacén clave-valor. Si el usuario quiere una fuerte coherencia (Consistencia), debido a la influencia del teorema CAP, inevitablemente abandonará la disponibilidad (Disponibilidad). En otras palabras, en CAP, se prefiere C.
Requisito no funcional
Escalabilidad: el almacén clave-valor debe poder ejecutarse en decenas de miles de servidores en todo el mundo. Y agregue o elimine servidores según las necesidades, mientras reduce el impacto en la disponibilidad del servicio o incluso no causa ningún impacto. Además, el sistema debería poder manejar una gran cantidad de usuarios del almacén clave-valor.
Tolerancia a fallos: si un servidor del sistema o un componente del sistema falla, el almacén clave-valor debe continuar funcionando sin interrupción.
Diseñar almacenamiento de datos de valores clave.
Antes de comenzar a diseñar el sistema, primero diseñe el principio simple (Design Simple), debe asumir lo siguiente:
- El centro de datos es confiable.
- Se ha completado la autenticación en el almacén de datos.
- Las solicitudes y respuestas de los usuarios se realizan a través de HTTPS.
diseño de API
El primero es el diseño de la API. Necesitamos pensar qué API se necesitan desde una perspectiva funcional. El almacenamiento de valores clave, como la tabla Hash, proporciona dos funciones principales: obtener y colocar.
Obtener función
obtener la clave)
Devolvemos el valor correspondiente según la clave del parámetro. Déjame mencionar también algo más aquí. ¿Cómo optimiza la replicación de datos la base de datos? - Diseño del sistema 09 Se menciona el problema de copia de datos. Cuando la base de datos clave-valor copia datos, encontrará una copia del objeto asociado con la clave. Esto lo hace el sistema si el almacenamiento está configurado con un modelo de coherencia de datos más débil.
poner función
poner (clave, valor)
Esta función se utiliza para almacenar el valor asociado con la clave. El almacén de datos clave-valor determina automáticamente dónde se deben colocar los datos. Además, el sistema suele conservar metadatos sobre los objetos almacenados. En el futuro, también daremos una buena introducción a qué son los metadatos.
Aumentar la escalabilidad
Para el diseño del sistema, la escalabilidad (Escalabilidad) es muy importante, por lo que al diseñar el almacén clave-valor (Key-Value Store), almacenaremos los datos clave-valor en el nodo de almacenamiento. A medida que cambian las necesidades, es posible que necesitemos agregar o eliminar nodos de almacenamiento. Esto significa que necesitamos particionar los datos en los nodos del sistema para distribuir la carga a todos los nodos. Los lectores que aún no estén familiarizados con la partición pueden consultar Partición de datos ¿Qué es la partición de datos? – Diseño del sistema 10.
Volviendo a la partición en el almacén de datos clave-valor, aquí hay un ejemplo: suponiendo que tenemos cuatro nodos, queremos que se envíen solicitudes 40% a cada nodo para equilibrar la carga. La forma tradicional de resolver este problema es a través del operador de módulo. (Operador de módulo) para realizar los cálculos. Cada solicitud que llega tiene una clave asociada. Cuando llega una solicitud, calculamos el valor hash de la clave. Luego, encontramos el resto combinando el valor hash con el número de nodos m.
Hash consistente
una vez fuimos ¿Qué es DNS? Introducción al sistema de nombres de dominio – Diseño del sistema 06 Se han introducido varios tipos de algoritmos para abordar los problemas de tráfico, por lo que si hablamos de hash, tenemos que hablar del algoritmo Hashing consistente. Este algoritmo es un método muy adecuado para equilibrar la carga del nodo.
En el algoritmo hash consistente, primero debemos asumir que hay un anillo hash (Hash Ring) de 0 a n-1, donde n es el número de valores hash disponibles. Usamos la ID de cada nodo para calcular su valor hash y asignar su valor hash al Hash Ring. Cada solicitud es cumplida por el siguiente nodo que encuentra moviéndose en el sentido de las agujas del reloj en el anillo.
Cada vez que un nuevo nodo se une al anillo, el nodo inmediatamente siguiente se ve afectado. Debe compartir sus datos con los nodos recién agregados, mientras que otros nodos no se ven afectados. Estos algoritmos son fácilmente extensibles y pueden mantener al mínimo los cambios en los nodos. Los valores hash se distribuyen aleatoriamente, por lo que esperamos que la carga de solicitudes sea aleatoria y se distribuya uniformemente alrededor del anillo.
El principal beneficio del hash consistente es que cuando los nodos se unen o salen, debemos asegurarnos de que se mueva la cantidad mínima de claves. Sin embargo, en la práctica, la carga de solicitudes no se distribuye uniformemente. Cualquier servidor que maneje grandes cantidades de datos puede convertirse en un cuello de botella en un sistema distribuido. El nodo recibe una cantidad desproporcionadamente grande de solicitudes de búsqueda y almacenamiento de datos, lo que reduce el rendimiento general del sistema. Aquí proporciono un artículo que creo que es muy detallado, para que los lectores lo utilicen como referencia, y con ilustraciones consistentes y variadas.
Usando nodos virtuales
Además de utilizar algoritmos hash coherentes, también podemos utilizar nodos virtuales para garantizar una distribución de carga más uniforme entre los nodos. Este método utiliza múltiples funciones hash en la misma clave en lugar de aplicar una única función hash.
Aquí hay un ejemplo rápido, digamos que tenemos cuatro funciones hash. Para cada nodo, calculamos cuatro valores hash y los colocamos en el anillo. Para esta solicitud, solo utilizamos una función hash. No importa dónde llegue la solicitud en el anillo, es manejada por el siguiente nodo encontrado mientras se mueve en el sentido de las agujas del reloj. Hay cuatro ubicaciones por servidor, por lo que la carga de solicitudes es más pareja. Además, si un nodo tiene más capacidad de hardware que otros nodos, podemos agregar más nodos virtuales mediante el uso de funciones hash adicionales. De esta manera, ocupará más posiciones en el ring y atenderá más solicitudes.
Replicación de datos
Este artículo ¿Cómo optimiza la replicación de datos la base de datos? - Diseño del sistema 09 He escrito sobre la replicación de bases de datos. Cuando se trata de bases de datos clave-valor, también tendremos muchos métodos diferentes para manejar la replicación de datos. La replicación de datos común incluye: relación maestro-esclavo y relación punto a punto.
Replicación primaria-secundaria
En el método maestro-esclavo, una de las áreas de almacenamiento es el área de almacenamiento principal y las otras áreas de almacenamiento son áreas de almacenamiento auxiliar. La réplica secundaria copia sus datos de la réplica principal. El área de almacenamiento principal se utiliza para manejar solicitudes de escritura, mientras que el servicio secundario atiende solicitudes de lectura. Además, si el repositorio principal falla, no podremos escribir en el almacenamiento y se convertirá en un único punto de falla.
Replicación de igual a igual
En un enfoque de igual a igual, todas las áreas de almacenamiento son áreas de almacenamiento primarias y los datos se replican para mantenerlos actualizados. También se permiten lecturas y escrituras en todos los nodos. Normalmente, replicar en los n nodos es ineficiente y costoso. En cambio, tres o cinco son opciones comunes para la cantidad de nodos de almacenamiento a replicar.
Conclusión
Da la casualidad de que viajaré al extranjero durante casi dos semanas, pero continuaré actualizando artículos técnicos sobre diseño de sistemas y continuaré escribiendo contenido de diseño de sistemas en el futuro. Si te gusta este tipo de artículo, ¡también puedes dejar un mensaje para animarme!
Artículos relacionados
Partición de datos ¿Qué es la partición de datos? – Diseño del sistema 10
¿Cómo optimiza la replicación de datos la base de datos? - Diseño del sistema 09
Introducción a los conceptos básicos de bases de datos: diseño de sistemas 08
Explicación del equilibrador de carga: diseño del sistema 07
¿Qué es DNS? Introducción al sistema de nombres de dominio – Diseño del sistema 06
Introducción al bloque de construcción de componentes de diseño de sistemas: diseño de sistemas 05
Cálculo del reverso del sobre: diseño del sistema 04
Características no funcionales del diseño de software – Diseño de sistemas 03
Aplicación de la abstracción en el diseño de sistemas – Diseño de sistemas 02
Introducción al diseño de sistemas modernos – Diseño de sistemas 01