Diseño de sistema de almacenamiento distribuido (2) - fragmentación de datos (transferencia)

En un sistema de almacenamiento distribuido, los datos deben ser distribuidos y almacenados en múltiples dispositivos.El fragmentación es una técnica utilizada para determinar la distribución de datos en múltiples dispositivos de almacenamiento. La división de datos tiene tres propósitos:

  1. Distribución uniforme, es decir, la cantidad de datos en cada dispositivo debe ser lo más cercana posible;
  2. El equilibrio de carga, es decir, la cantidad de solicitudes en cada dispositivo debe ser lo más cercana posible;
  3. Minimice la migración de datos durante la expansión y contracción.

Método de segmentación de datos

El fragmentación de datos generalmente usa el valor de clave o hash de clave para calcular la distribución de la clave. Varios métodos comunes de fragmentación de datos son los siguientes:

  1. Divide el segmento numérico. Esto generalmente se aplica al caso en que la Clave es un tipo entero. Cada dispositivo almacena el mismo rango de números de tamaño. Por ejemplo, coloque los datos con la Clave [1, 10000] en el primer dispositivo, y la Clave es [10001, 20000 ] Los datos en el segundo dispositivo, y así sucesivamente. Este método es muy sencillo de implementar y es más conveniente expandir la capacidad. Es suficiente aumentar el equipo exponencialmente. Por ejemplo, si hay N equipos, agregue N equipos para expandir la capacidad y migre la mitad de los datos de cada equipo antiguo al nuevo equipo. El dispositivo con el segmento de número original [1, 10000] solo retiene los datos del segmento de número [1, 5000] después de la expansión, y migra los datos con el segmento de número [5001, 10000] a un dispositivo recién agregado. La desventaja de este método es que los datos pueden estar distribuidos de manera desigual. Por ejemplo, el volumen de datos del segmento de tamaño pequeño puede ser mayor que el tamaño de datos del segmento de tamaño grande, y el calor del mismo segmento de número también puede ser diferente, lo que resulta en una carga desigual de cada dispositivo; y la expansión Tampoco es lo suficientemente flexible como para aumentar solo el equipo exponencialmente.
  2. Módulo. Este método calcula primero el valor hash de la clave, y luego modula el número de dispositivos (la clave entera también puede ser modulada directamente con la clave), suponiendo que haya N dispositivos, numerados 0 ~ N-1, a través de Hash (clave) % N puede determinar el número de dispositivo donde se encuentran los datos. Este método también es muy simple de implementar, la distribución de datos y la carga serán relativamente uniformes, y se puede agregar cualquier cantidad de dispositivos para expandir la capacidad. El problema principal es que cuando se expande la capacidad, se producirá una gran cantidad de migración de datos, por ejemplo, de N dispositivos a N + 1, la mayoría de los datos se migrarán entre los dispositivos.
  3. Tabla de búsqueda Almacene la relación de mapeo entre la clave y el dispositivo en la tabla de búsqueda. La distribución de datos se puede determinar buscando la tabla de búsqueda. La tabla de búsqueda aquí también puede ser más flexible. Puede almacenar la relación de mapeo para cada clave, o puede combinar métodos como la segmentación de números. Reduzca la capacidad de la tabla de búsqueda. De esta manera, los datos se pueden distribuir uniformemente, equilibrar la carga y se puede reducir la cantidad de migración de datos. La desventaja es que el espacio requerido para almacenar la tabla de búsqueda puede ser relativamente grande, y para asegurar que la cantidad de migración de datos causada por la expansión y contracción sea relativamente pequeña, el algoritmo para determinar la relación de mapeo también es relativamente complicado.
  4. Hash constante. Hashing consistente (Hashing constante) es un algoritmo de implementación de hashing distribuido (DHT) propuesto por el Instituto de Tecnología de Massachusetts en 1997. El objetivo del diseño es resolver el problema del punto caliente en Internet. Los detalles del método Para la introducción, consulte http://blog.csdn.net/sparkliang/article/details/5279393 . El algoritmo de hashing consistente es simple e ingenioso, es fácil lograr una distribución de datos uniforme y su monotonicidad también asegura que la migración de datos de expansión y contracción sea relativamente pequeña.

A través de la comparación anterior, en este sistema, se selecciona un método hash consistente para la división de datos.

Servidor virtual

Para hacer que el sistema sea más escalable, aquí se propone el concepto de capa de almacenamiento VServer (servidor virtual). Un VServer es un servidor de almacenamiento lógico y una unidad de almacenamiento de un sistema de almacenamiento distribuido. Se pueden implementar múltiples dispositivos físicos. Un VServer, un VServer admite un proceso de escritura y múltiples procesos de lectura.

A través de VServer, habrá los siguientes beneficios:

  1. Mejora el rendimiento independiente. Para no introducir un mecanismo de bloqueo complicado, se adopta un diseño de proceso de escritura única. Si una sola máquina tiene un solo proceso de escritura, la capacidad de concurrencia de escritura será limitada y los recursos de almacenamiento (memoria, disco duro) en la máquina individual se dividen en múltiples unidades de almacenamiento a través de VServer , Para que múltiples procesos de escritura puedan funcionar al mismo tiempo, lo que mejora en gran medida la capacidad de concurrencia de escritura independiente.
  2. La escalabilidad de implementación es mejor. El método VServer es muy flexible en la implementación. Puede determinar el número de VServers de acuerdo con la situación de los recursos de una sola máquina. Configure diferentes números de VServer para diferentes modelos, de modo que los diferentes modelos puedan hacer un uso completo de los recursos en la máquina, incluso en un sistema Al utilizar varios modelos, la carga de la máquina también puede equilibrarse.

Aplicación de hashing consistente

El fragmentación de datos se implementa en la capa de interfaz, el propósito es dividir los datos de manera uniforme en diferentes VServers. Con la existencia de la capa de interfaz, el direccionamiento de la capa lógica es mucho más ligero. La capa de almacenamiento de direccionamiento VServer es responsable de la capa de interfaz. La capa lógica solo necesita seleccionar aleatoriamente una máquina de capa de interfaz para acceder.

La capa de interfaz utiliza un algoritmo coherente de corte de anillo de corte para implementar el fragmentación de datos. En el algoritmo de corte de anillo, para distribuir los datos de manera uniforme a cada VServer, cada VServer debe tener múltiples VNodes (nodos virtuales). En la siguiente figura se muestra un proceso de direccionamiento de teclas: Primero, encuentre el VNode correspondiente en el anillo hash de acuerdo con Hash (Key) y luego determine el VServer al que pertenece de acuerdo con la tabla de mapeo de VNode y VServer.

Se puede saber del proceso de búsqueda anterior que la distribución de VNode en el anillo de hash y la relación de mapeo entre VServer y VNode deben calcularse sin conexión por adelantado. Para que el resultado del cálculo sea universal, es decir, un sistema con cualquier número de servidores VS puede usar el resultado para obtener una tabla de mapeo hash consistente, que requiere que el resultado sea independiente de la máquina, como no usar IP para calcular VNode. Con suerte Antes de calcular, debe determinar la cantidad de VNodes incluidos en cada VServer y la cantidad máxima de VServers admitidos por un sistema. Un método simple es similar al método mencionado en el enlace anterior, pero no puede estar relacionado con IP. Puede usar los números VServer y VNode para calcular el valor hash, como Hash ("1 # 1"), Hash ("1 # 2 ") ... Este método requiere que el número de VNodes contenidos en un VServer sea relativamente grande. Se necesitan aproximadamente 500 para que los datos en cada VServer sean más uniformes. Por supuesto, hay otras formas de hacer que un VServer contenga un número menor de VNodes y que la desviación de la distribución de datos se encuentre dentro de cierto rango.

Google ha propuesto un nuevo algoritmo de hash coherente Jump Consistent Hash, este algoritmo tiene un consumo de memoria cero, distribución uniforme, rápido y solo 5 líneas de código, las ventajas son muy obvias, la introducción detallada se puede encontrar aquí http: //my.oschina. net / u / 658658 / blog / 424161 . En comparación con el método descrito anteriormente, una de las mayores diferencias es que al expandir y redistribuir datos, en el método anterior, los datos en un VNode de la nueva máquina solo vendrán del VNode en una máquina antigua, y este método Vendrá de VNode en todas las máquinas antiguas. Este problema puede causar algunas complicaciones de diseño, por lo que debe considerarse cuidadosamente al usarlo.

Supongo que te gusta

Origin www.cnblogs.com/jerryliuxin/p/12698458.html
Recomendado
Clasificación