Un accidente en línea, me di cuenta de la esencia de MongoDB


Hola a todos, soy Nezha. Recientemente, el proyecto está utilizando MongoDB como base de datos de almacenamiento para imágenes y documentos. ¿Por qué no almacenarlos directamente en MySQL, pero también configurar un clúster de MongoDB, es problemático?

Descubrámoslo juntos, sigamos aprendiendo la teoría y la práctica de la fragmentación de MongoDB , logre un inicio rápido, enriquezca su currículum, mejore su nivel de entrevista, aumente sus recursos de conversación y conviértase en un experto en entrevistas en segundos. BAT no es un sueño.

¿MongoDB rechaza la conexión? Obviamente, el servicio MongoDB está caído nuevamente.

inserte la descripción de la imagen aquí

Conéctese al servidor MongoDB para averiguarlo.

¿ Al ps -aef|grep mongoverificar si el servicio mongo todavía está allí? Como era de esperar, se han ido.

inserte la descripción de la imagen aquí

Lo más probable es que sea porque el disco está lleno.

df -THCompruebe el espacio en disco.

inserte la descripción de la imagen aquí

¿Cómo resolver el problema del disco al 100%?

cd al directorio de registro, rm -rf *elimine todos los registros y luego reinicie MongoDB.

Excepción de inicio de Mongodb: a punto de bifurcar el proceso secundario, esperando hasta que el servidor esté listo para la conexión

inserte la descripción de la imagen aquí

Dado que MongoDB se implementa en un clúster, la sincronización de datos se realizará cuando se inicie, lo que puede llevar mucho tiempo. Estoy impaciente, ¿cómo puedo soportarlo? Simplemente presione Ctrl C, fuerce la detención y luego reinicie.

Al ps -aef|grep mongoobservar el proceso, se enumeran dos procesos idénticos.

Por ps -aef|grep mongo | grep -v grep | awk '{print $2}' | xargs kill -9la fuerza deteniendo todos los procesos de mongo.

inserte la descripción de la imagen aquí

Elimine los archivos mongod.lock y diagnostic.data en el directorio de datos, reinicie MongoDB e inicie el script mongos_start.sh (mongod --config data/mongodb.conf), que es una solución perfecta.

inserte la descripción de la imagen aquí

¿Cuál es el significado del directorio de implementación del servidor MongoDB? Cual es la relacion entre ellos? A continuación se presenta brevemente la fragmentación de MongoDB.

inserte la descripción de la imagen aquí

1. ¿Qué es la fragmentación de MongoDB?

Sharding se refiere al proceso de dividir datos entre máquinas, también conocido como partición.

MongoDB admite el particionamiento manual.Con este método, la aplicación mantiene conexiones a múltiples servidores de bases de datos diferentes, cada servidor es completamente independiente. La aplicación no solo administra el almacenamiento de diferentes datos en diferentes servidores, sino que también administra la consulta de los datos en el servidor apropiado. Pero es difícil de mantener cuando se agregan o eliminan nodos del clúster, o ante cambios en la distribución de datos o patrones de carga.

MongoDB admite la fragmentación automática, que intenta abstraer el esquema de la base de datos de la aplicación y simplificar la administración del sistema. MongoDB equilibra automáticamente los datos entre fragmentos, lo que facilita agregar y eliminar nodos.

El mecanismo de fragmentación de MongoDB le permite crear un grupo de muchos fragmentos y distribuir los datos de la colección en todo el clúster, colocando un subconjunto de los datos en cada fragmento. Esto permite que las aplicaciones excedan los límites de recursos de un servidor independiente o conjunto de réplicas.

Un clúster compuesto de fragmentos es como un servidor independiente para la aplicación. Uno o más procesos de enrutamiento llamados mongos se ejecutan antes de la fragmentación. Mongos mantiene un "directorio" que especifica qué datos contiene cada fragmento. Las aplicaciones pueden conectarse a este servidor de enrutamiento y realizar solicitudes normalmente. El servidor de enrutamiento sabe qué datos se encuentran en qué fragmento y puede reenviar solicitudes al fragmento apropiado. Si hay respuestas a la solicitud, el servidor de Reason las recopila, las fusiona y las devuelve a la aplicación, en la medida en que la aplicación sabe que está conectada a un solo mongod.

inserte la descripción de la imagen aquí

2. ¿Cómo se fragmenta MongoDB?

Configure rápidamente un clúster en una sola máquina. Primero, inicie con las opciones --nodby : .--norcmongo shellmongo --nodb --norc

Cree un clúster con la clase ShardingTest. Ejecute el siguiente código:

st = ShardingTest({
    
    
	name:"one-min-shards",
	chunkSize:1,
	shards:2,
	rs:{
    
    
		nodes:3,
		oplogSize:10
	},
	other:{
    
    
		enableBalancer:true
	}
});
  • nombre: la etiqueta del clúster de fragmentos;
  • fragmentos: especifica que el clúster consta de dos fragmentos;
  • rs: defina cada fragmento como un conjunto de réplicas de 3 nodos;
  • enableBalancer: habilita el balanceador después de que se inicie el clúster;

ShardingTest está diseñado para admitir conjuntos de pruebas del lado del servidor. Proporciona mucha comodidad para mantener el uso de recursos lo más bajo posible y crear clústeres de fragmentación con una arquitectura relativamente compleja. Cuando se ejecuta ShardingTest, crea un clúster con dos fragmentos, cada uno de los cuales es un conjunto de réplicas. Al mismo tiempo, se configura el conjunto de réplicas y se inicia cada nodo con las opciones necesarias para establecer un acuerdo de réplica. Inicia un mongos para administrar las solicitudes entre fragmentos para que los clientes puedan interactuar con el clúster como si se estuvieran comunicando con un mongod independiente. Finalmente, inicia un conjunto de réplicas adicional para el servidor de configuración utilizado para mantener la confianza de la tabla de justificación para garantizar que las consultas se dirijan al fragmento correcto.

El caso de uso principal para la fragmentación es dividir conjuntos de datos para abordar las limitaciones de hardware y costos, o para proporcionar un mejor rendimiento a las aplicaciones.

Cuando ShardingTest termine de configurar el clúster, tendrá 10 procesos en funcionamiento a los que puede conectarse: dos conjuntos de réplicas (3 nodos cada uno), un conjunto de réplicas del servidor de configuración (3 nodos) y un mongos. De forma predeterminada, estos procesos se iniciarán en el puerto 20000. mongos se ejecutará en el puerto 20009.

3. ¿Cuándo fragmentar?

Por lo general, la fragmentación se usa para:

  • aumentar la memoria RAM disponible;
  • aumentar el espacio disponible en disco;
  • Reducir la carga del servidor;
  • Manejar el rendimiento que no puede ser sostenido por un solo MongoDB;

inserte la descripción de la imagen aquí

4. Cree un servidor de fragmentos de MongoDB

1. Configurar el proceso de configuración del servidor

El servidor de configuración es el cerebro del clúster y contiene todos los metadatos sobre los datos que contiene cada servidor, por lo que primero se debe crear el servidor de configuración. Es muy importante configurar el servidor y el tiempo de ejecución debe permitir el registro en diario y asegurarse de que sus datos se almacenen en una unidad no transitoria.

El servidor de configuración debe iniciarse antes de cualquier proceso mongos mongod -f config.conf, porque mongos necesita extraer información de configuración del servidor de configuración.

Al escribir en el servidor de configuración, MongoDB utilizará el nivel de preocupación de escritura "mayoritaria";
al leer desde el servidor de configuración, MongoDB utilizará el nivel de preocupación de lectura "mayoritaria";

Esto garantiza que los metadatos del clúster fragmentado solo se confirmen en el conjunto de réplicas del servidor de configuración sin una reversión. También garantiza que solo se lean aquellos metadatos que no se ven afectados por una falla del servidor de configuración. Esto garantiza que todos los nodos de enrutamiento mongos tengan coherencia en la forma en que se organizan los datos en el clúster fragmentado.

En cuanto a los recursos del servidor, el servidor de configuración debe tener suficientes recursos de red y de CPU. El servidor de configuración solo guarda el directorio de los datos en el clúster, por lo que solo se requieren unos pocos recursos de almacenamiento en el disco duro.

Debido a la importancia del servidor de configuración, se debe hacer una copia de seguridad de los datos del servidor de configuración antes de cualquier mantenimiento del clúster.

2. proceso mongos

mongos es el servidor de enrutamiento y se usa para conexiones de aplicaciones. Al mongod -f config.confiniciar el servidor de enrutamiento, el proceso mongos necesita conocer la dirección del servidor de configuración, por lo que debe configurarse en config.conf, configdb=configReplSet/配置服务器的三个地址y el registro de MongoDB se puede guardar configurando logpath.

Se debe iniciar una cierta cantidad de procesos mongos y colocarlos lo más cerca posible de todos los fragmentos, lo que puede mejorar el rendimiento de las consultas.

3. Convierta el conjunto de réplicas en fragmentos

Después de iniciar el servidor de configuración y el servidor de enrutamiento en secuencia, puede agregar fragmentos.Si ya existe un conjunto de réplicas antes, este conjunto de réplicas se convertirá en el primer fragmento.

A partir de MongoDB 3.4, para clústeres fragmentados, la instancia mongod fragmentada debe configurarse con la opción --shardsvr, que se agrega en config.conf. En shardsvr=trueel proceso de convertir un conjunto de réplicas en un fragmento, cada miembro del conjunto de réplicas necesita a configurar Repita las acciones anteriores.

Después de agregar el conjunto de réplicas al clúster como un fragmento, puede cambiar la conexión de la aplicación del conjunto de réplicas al servidor de enrutamiento mongos y cortar la conexión directa entre la aplicación y el fragmento configurando un firewall.

4. Fragmentación de datos

(1) Cómo fragmentar datos

Suponga que tiene una base de datos de prueba y fragmenta la colección de trabajadores en la clave de nombre.

  1. Primero fragmente la base de datos, > sh.enableSharding("test");
  2. Luego divida la colección, sh.shardCollection("test.worker",{"name":1});

Si la colección de trabajadores ya existe, debe haber un índice en el campo de nombre; de ​​lo contrario, shardCollection devolverá un error. Si la colección fragmentada no existe, mongos creará automáticamente un índice en la clave de fragmento de nombre.

El comando shardCollection dividirá la colección en varios bloques de datos y MongoDB distribuirá uniformemente los datos de la colección entre los fragmentos del clúster.

inserte la descripción de la imagen aquí

5. ¿Cómo rastrea MongoDB los datos del clúster?

1. Bloque de datos

Debido a la gran cantidad de datos en MongoDB, MongoDB generalmente agrupa documentos en forma de bloques de datos. Estos bloques de datos son documentos dentro del rango especificado de la clave de sector. MongoDB generalmente usa una tabla más pequeña para mantener la relación entre bloques de datos y fragmentos. relación de mapeo.

requiere atención:

  1. Los bloques no se pueden superponer;
  2. Cuando la cantidad de documentos en un bloque es demasiado grande, se dividirá automáticamente en dos documentos;
  3. Un documento pertenece siempre a uno y sólo a un bloque;

2. Gama de bloques

  1. Solo hay un bloque en la colección del nuevo fragmento, y el límite del bloque es desde el infinito negativo hasta el infinito positivo;
  2. A medida que crece el fragmento, MongoDB lo dividirá automáticamente en dos fragmentos que van desde el infinito negativo hasta el valor y el valor hasta el infinito positivo. Los bloques con un rango menor contienen valores menores que valor, y los bloques con un rango mayor contienen valor y valores mayores que valor;

Por lo tanto, mongos puede encontrar fácilmente en qué bloque se encuentra el documento.

3. Bloques divididos

El proceso de mongod del nodo maestro de cada fragmento realiza un seguimiento de sus bloques actuales y, una vez que se alcanza un cierto umbral, verifica si el bloque debe dividirse y, de ser así, mongod solicita el valor de configuración del tamaño de bloque global del servidor de configuración. y luego realice divisiones de fragmentos y actualice los metadatos en el servidor de configuración. El servidor de configuración crea nuevos documentos de fragmentos y modifica el alcance de los fragmentos antiguos.

Cuando un cliente escribe un bloque, mongod verifica el umbral de división para ese bloque.

inserte la descripción de la imagen aquí

Si se alcanzó el umbral de división, mongod envía una solicitud al balanceador para migrar el fragmento superior; de lo contrario, el fragmento permanece en el fragmento.

inserte la descripción de la imagen aquí

Debido a que dos documentos con la misma clave de partición están obligados a estar en el mismo fragmento, las divisiones solo se pueden realizar entre documentos con diferentes valores de clave de partición.

Si los siguientes documentos están fragmentados por readTime, es posible.

Sin embargo, si leo libros más rápido y termino de leer todos los libros en un mes, el tiempo de lectura será el mismo y la fragmentación no será posible.

Por lo tanto, es especialmente importante tener diferentes valores de clave de fragmento al fragmentar.

{"name":"哪吒编程","book":"Java核心技术","readTime":"October"}
{"name":"哪吒编程","book":"Java编程思想","readTime":"October"}
{"name":"哪吒编程","book":"深入理解Java虚拟机","readTime":"October"}
{"name":"哪吒编程","book":"effective java","readTime":"November"}
{"name":"哪吒编程","book":"重构 改善既有代码的设计","readTime":"November"}
{"name":"哪吒编程","book":"高性能MySQL","readTime":"December"}
{"name":"哪吒编程","book":"Spring技术内幕","readTime":"December"}
{"name":"哪吒编程","book":"重学Java设计模式","readTime":"December"}
{"name":"哪吒编程","book":"深入理解高并发编程","readTime":"January"}
{"name":"哪吒编程","book":"Redis设计与实现","readTime":"January"}

Un requisito previo para la fragmentación es que todos los servidores de configuración deben estar activos y accesibles. Si mongod sigue recibiendo solicitudes de escritura para un bloque, seguirá intentando y fallando en dividir ese bloque, y estos intentos de división ralentizarán a mongod. El proceso de mongod que intenta fragmentar repetidamente sin éxito se llama tormenta dividida .

inserte la descripción de la imagen aquí

6. Ecualizador

El equilibrador es responsable de la migración de datos. El equilibrador comprueba periódicamente si hay desequilibrios entre los fragmentos y, de ser así, se migran los bloques. En MongoDB 3.4+, el equilibrador reside en el miembro principal del conjunto de réplicas del servidor de configuración.

El equilibrador es un proceso en segundo plano en el maestro del conjunto de réplicas del servidor de configuración que supervisa la cantidad de bloques en cada fragmento. El equilibrador se activa solo cuando la cantidad de bloques en un fragmento alcanza un cierto umbral de migración.


inserte la descripción de la imagen aquí

Resumen de la ruta de aprendizaje de Java, los constructores de ladrillos atacan a los arquitectos de Java

Resumen de 100.000 palabras y 208 preguntas de entrevista clásicas de Java (con respuestas)

Serie de tutoriales básicos de Java

Serie de programación de alta concurrencia de Java

Serie de combate avanzado de base de datos

Supongo que te gusta

Origin blog.csdn.net/guorui_java/article/details/128424399
Recomendado
Clasificación