Expansión horizontal de datos: a medida que el negocio continúa creciendo, la base de datos se hará cada vez más grande, en este momento necesitamos segmentarla para que el tamaño de una sola base de datos no aumente.

Autor: Zen y el arte de la programación informática

1. Introducción

A medida que crecen las empresas de Internet, el rápido crecimiento del volumen de datos se ha convertido en un problema importante al que se enfrentan las empresas. Como sistema de soporte para bases de datos relacionales, la base de datos MySQL también ha mostrado una tremenda presión. Una serie de razones, como la expansión empresarial, la iteración de productos y la actividad de los usuarios, han dado lugar a cantidades masivas de datos, lo que hace que los recursos de hardware de un único servidor no puedan satisfacer la demanda. Por tanto, la planificación e implementación de sistemas de almacenamiento de datos se ha convertido en un vínculo muy importante. Para poder hacer frente a datos masivos, es necesario dividir horizontalmente la base de datos y dividir una base de datos en varias bases de datos pequeñas para reducir la carga de una sola base de datos. En comparación con el método tradicional de división vertical, este método puede satisfacer mejor las capacidades de procesamiento de datos masivos. Además, para las subbases de datos y tablas, también se pueden mejorar la eficiencia de las consultas y las capacidades de concurrencia. Este artículo presentará los siguientes aspectos:

1. Introducción a los antecedentes

La partición horizontal se refiere a dividir la misma tabla de base de datos física en múltiples tablas de base de datos lógicamente independientes de acuerdo con ciertas reglas, de modo que cada tabla de base de datos lógica corresponda a uno o más archivos de disco físico para lograr escalabilidad a nivel de datos. La división horizontal de datos puede reducir efectivamente la presión sobre una sola base de datos, mejorar el rendimiento de la base de datos y permitir que múltiples servidores de aplicaciones compartan los mismos datos, logrando así el intercambio y la redundancia de la base de datos. En entornos distribuidos, la división horizontal de datos también es una solución común. Al fragmentar bases de datos y tablas, no solo puede reducir el retraso cuando las aplicaciones acceden a la base de datos, sino también mejorar las capacidades de lectura y escritura concurrentes de la base de datos, al tiempo que protege la seguridad de la base de datos. La división horizontal de datos es una estrategia típica de optimización de bases de datos que puede acelerar la expansión horizontal de la base de datos mediante los siguientes pasos:

  1. Preparación de datos: limpiar, normalizar datos e importarlos a la base de datos principal MySQL;
  2. Desarrollar un plan de tablas y subbases de datos: analizar las características de los datos comerciales y determinar las reglas de las tablas y subbases de datos;
  3. Las herramientas o scripts de fragmentación de bases de datos y tablas generan declaraciones SQL para fragmentar bases de datos y tablas;
  4. Ejecute las instrucciones SQL para dividir la base de datos y la tabla para generar la nueva estructura de la base de datos y los datos después de dividir la base de datos y la tabla;
  5. Configure reglas de enrutamiento para que las solicitudes se dirijan a nuevas subbases de datos y tablas de acuerdo con reglas preestablecidas;
  6. Pruebas y depuración: verifique si la base de datos después de la subbase de datos y la tabla se está ejecutando correctamente;
  7. Lanzamiento en línea: después de completar el proceso de subdivisión de la base de datos y la tabla, cambie a la nueva base de datos para completar el lanzamiento en línea del negocio.

2. Explicación de conceptos y términos básicos

1. División física y división lógica

La división física es el proceso de dividir una base de datos física en varias bases de datos físicas. Después de la división física, cada base de datos corresponde a uno o más archivos de disco físico. La división física puede mejorar el rendimiento de lectura y escritura de la base de datos hasta cierto punto. Pero también trae las siguientes desventajas:

  1. Mayor complejidad de mantenimiento: debido a la existencia de fragmentación física, las operaciones de inserción, eliminación y actualización de datos y otras operaciones deben considerar la sincronización de datos después de la fragmentación.
  2. Mayor complejidad de la consulta: si la consulta involucra varios fragmentos, se requieren varias consultas para obtener resultados de datos completos.
  3. El mantenimiento de índices se vuelve más difícil: los índices también necesitan mantener datos en múltiples fragmentos.
  4. Dificultades para diseñar una estrategia de fragmentación: cómo decidir una estrategia de fragmentación, como reglas de fragmentación, número de fragmentos, tipo de fragmentos, etc.
  5. Es difícil garantizar la coherencia de las transacciones: puede haber inconsistencias en los datos entre fragmentos.

La división lógica se basa en la división física y, además, divide lógicamente los datos de una sola tabla o de varias tablas de acuerdo con las reglas comerciales. Después de cada división lógica, se obtiene una biblioteca lógica, que se compone de varias tablas lógicas. , cada una La tabla lógica contiene solo una parte de los datos de la biblioteca física. Las ventajas de la división lógica son:

  1. Mejora del rendimiento de las consultas: debido a que solo es necesario acceder a una parte de los datos, la velocidad de las consultas mejorará enormemente.
  2. Disponibilidad de memoria reducida para conjuntos de datos grandes: la división lógica puede cargar conjuntos de datos en la memoria más rápido, lo que resulta beneficioso para consultas de conjuntos de datos grandes.
  3. Proporciona capacidades de computación paralela: se pueden calcular varias bibliotecas lógicas en paralelo para mejorar la eficiencia de las consultas.
  4. Mejor estrategia de mantenimiento: la división lógica se puede aplicar mejor a diferentes escenarios comerciales, como datos de pedidos, datos de registros, etc.
  5. Optimice el plan de consultas: el optimizador prestará más atención a la eficiencia de las consultas de cada biblioteca lógica, adoptará estrategias de índice adecuadas y evitará escaneos completos de la biblioteca.

2. Principio de subbase de datos y subtabla

Los principios de fragmentación de bases de datos y tablas generalmente incluyen:

  1. Granularidad de segmentación de datos razonable: elija la granularidad de segmentación adecuada para garantizar que la cantidad de datos contenidos en cada fragmento cumpla con las expectativas.
  2. Fragmentación de hash basada en la clave principal: generalmente, la clave principal se selecciona como base para la fragmentación y todos los datos de la misma entidad comercial se asignan al mismo fragmento.
  3. Intente mantener cada fragmento dentro de los 2 GB: elija un tamaño de fragmento razonable y el espacio en disco ocupado por cada fragmento no puede ser demasiado grande, de lo contrario provocará un cuello de botella en el rendimiento.
  4. Utilice fragmentación de datos en caliente y en frío: se colocan diferentes niveles de fragmentación en diferentes instancias de bases de datos o hosts, lo que puede aprovechar al máximo los recursos de hardware y mejorar las capacidades de procesamiento concurrente del sistema.
  5. Comparta la presión de lectura y escritura a través del equilibrio de carga: comparta la presión de lectura y escritura a través de componentes o servidores proxy de equilibrio de carga para garantizar el equilibrio de carga del clúster de base de datos.
  6. Automatización de la migración de datos: utilice herramientas o scripts para migrar fragmentos de manera flexible y garantizar datos en tiempo real.
  7. La copia de seguridad y la recuperación se simplifican: solo necesita realizar una copia de seguridad y restaurar un fragmento determinado, sin realizar una copia de seguridad de toda la base de datos.
  8. El monitoreo y la resolución de problemas se simplifican: solo necesita prestar atención al estado de un determinado fragmento para localizar fallas rápidamente.

3. Subalgoritmo de bases de datos y tablas

1. Método del módulo hash

El método de módulo Hash es el algoritmo más simple para fragmentar bases de datos y tablas: realiza una operación hash en todos los registros de acuerdo con un campo determinado (generalmente el ID de la clave principal) y luego utiliza la operación de módulo para determinar la base de datos de destino. El método del módulo Hash puede implementar fácilmente la función de fragmentación de la base de datos, pero su estrategia de fragmentación a menudo no puede garantizar una distribución uniforme de los datos. Por ejemplo, si los mismos datos se dividen en dos bibliotecas, habrá un problema de sesgo de datos, lo que dará como resultado demasiados datos en algunas bibliotecas y muy pocos datos en otras bibliotecas. E incluso si se utiliza un algoritmo hash coherente, no se puede evitar la distorsión de los datos.

2. Método de moldeo por cubeta

El método del módulo de depósito es un algoritmo de fragmentación basado en rangos para bases de datos y tablas. Primero divide una gran cantidad de datos en múltiples depósitos según ciertas condiciones y luego realiza Hash u otros algoritmos similares en estos depósitos para fragmentar bases de datos y tablas. Esta clasificación depende del rendimiento de la propia base de datos y de la distribución de los datos. Cuando la cantidad de datos en una determinada partición es relativamente grande, si la estrategia de fragmentación de tablas y bases de datos seleccionada no es apropiada, se producirán problemas de sesgo de datos.

3. Método Hash de coherencia

Consistent Hash es un algoritmo hash distribuido basado en nodos virtuales. Asigna todos los nodos físicos a un espacio de nodos virtuales común, de modo que cada nodo pueda calcular la ubicación de su propio nodo virtual y determinar qué datos debe almacenar. La ventaja del hash consistente es que puede garantizar que los datos se distribuyan de la manera más uniforme posible. Cuando se agregan, eliminan o redistribuyen nodos, solo afectará a los nodos virtuales relevantes. Sin embargo, el algoritmo Hash consistente todavía tiene los siguientes problemas:

  1. Problema de sesgo de datos: cuando la cantidad de nodos es insuficiente, aún se producirá un sesgo de datos.
  2. Desequilibrio de carga: cuando la carga cambia, también provocará una distribución desigual de los datos.
  3. Es difícil ajustar los nodos: al agregar o eliminar nodos, es necesario volver a calcular la distribución de nodos virtuales de todos los nodos y el costo de ajuste es alto.

4. Subbase de datos y herramienta de tabla.

Las herramientas populares de fragmentación de tablas y bases de datos actualmente en el mercado incluyen MySQL Proxy, Mycat, ShardingSphere y TDDL. Aquí solo presentamos el uso de MySQL Proxy.

1. Proxy MySQL

MySQL Proxy es un middleware de grupo de conexiones JDBC de código abierto que puede ayudar a los desarrolladores a implementar fácilmente la fragmentación de bases de datos y tablas. MySQL Proxy integra el algoritmo de fragmentación internamente, protegiendo a los desarrolladores de los detalles de la fragmentación de bases de datos y tablas. Los desarrolladores solo necesitan una configuración simple para implementar las funciones de subbase de datos y subtabla correspondientes. Los siguientes son los pasos de instalación y configuración de MySQL Proxy:

Instalar el proxy MySQL

MySQL Proxy se puede instalar compilando el código fuente o descargando el paquete de lanzamiento. Si descarga el paquete de lanzamiento y lo instala, debe tener en cuenta que MySQL Proxy debe depender de MySQL Server.

wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.21.tar.gz
tar xzf mysql-connector-java-8.0.21.tar.gz
cd mysql-connector-java-8.0.21/
mvn clean package
cp target/mysql-connector-java-*-bin.jar $INSTALL_DIR/lib/ # 指定安装目录
Configurar el proxy MySQL

El archivo de configuración de MySQL Proxy se encuentra en el archivo mysqlproxy.xml en conf /, modifique los siguientes parámetros:

<server>
  <id>ndbcluster</id>
  <host>$PROXY_HOST</host>
  <port>3306</port>
  <username>root</username>
  <password>$PROXY_PASSWD</password>
  <schema>$SCHEMA_NAME</schema>
</server>
<users>
  <user>
    <username>root</username>
    <password>$ROOT_PASSWD</password>
  </user>
  <!-- additional users -->
</users>
<shardingRule>
  <tables>
    <table name="t" dataNodes="ds_${0..1}.t$->{0..9}">
      <databaseStrategy type="STANDARD"/>
      <tableStrategy type="HASH_MOD">
        <property name="modulo">$MODULUS</property>
        <property name="column">id</property>
      </tableStrategy>
      <keyGenerator class="io.shardingsphere.core.keygen.DefaultKeyGenerator"/>
    </table>
    <!-- other tables -->
  </tables>
</shardingRule>
<!-- sharding rule configuration -->
<dataSource>
  <defaultDSType>masterSlave</defaultDSType>
  <masterSlave>
    <name>ms_$DB_NAME</name>
    <masterDataSourceName>ms_ds_0</masterDataSourceName>
    <slaveDataSourceNames>
      <slaveDataSourceName>ms_ds_1</slaveDataSourceName>
    </slaveDataSourceNames>
    <loadBalanceAlgorithmType>ROUND_ROBIN</loadBalanceAlgorithmType>
  </masterSlave>
  <dataSources>
    <dataSource id="ds_0" url="$DS0_URL" username="$USER" password="$PASSWORD"/>
    <dataSource id="ds_1" url="$DS1_URL" username="$USER" password="$PASSWORD"/>
    <!-- more slave data sources -->
  </dataSources>
</dataSource>
<!-- master-slave data source configuration -->

Aquí se supone que hay dos conjuntos de servicios MySQL, a saber, ds_0 y ds_1, y sus URL, nombres de usuario y contraseñas son consistentes. Especifique las reglas de fragmentación en el elemento de configuración de tablas, especifique el nombre de la tabla lógica por nombre y especifique el nombre de fragmentación por nodos de datos. El elemento de configuración tableStrategy especifica el algoritmo de fragmentación y lo fragmenta en dos bibliotecas según HASH_MOD, es decir, ds_0 y ds_1. En cuanto al elemento de configuración keyGenerator, la clase DefaultKeyGenerator se usa de forma predeterminada y también puede personalizar la clase del generador de claves. En el elemento de configuración dataSource, el modo de fuente de datos maestro-esclavo se adopta de forma predeterminada y el atributo loadBalanceAlgorithmType se establece en ROUND_ROBIN para lograr el equilibrio de carga.

Inicie el servicio MySQL Proxy y ejecute el siguiente comando:

./bin/start.sh
Probar el efecto de la subbase de datos y la subtabla

La prueba del efecto de fragmentar bases de datos y tablas se puede verificar mediante operaciones de cliente o JDBC. Aquí hay un ejemplo de Java:

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/$SCHEMA_NAME", "root", "$ROOT_PASSWD");
PreparedStatement ps = conn.prepareStatement("INSERT INTO t (c1) VALUES (?)");
for (int i = 0; i < 10; i++) {
    ps.setInt(1, i);
    ps.executeUpdate();
}
ps.close();
conn.commit();

// execute query in one of the shards to verify the distribution
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM t WHERE mod(id,$MODULUS)=1"); // where clause is added for testing purpose
while (rs.next()) {
    System.out.println(rs.getInt(1));
}
rs.close();
stmt.close();
conn.close();

Aquí se supone que el nombre de la tabla lógica es t, la clave de fragmentación es id y se utiliza el algoritmo de fragmentación HASH_MOD, por lo que el valor del parámetro de la función mod es MODULUS (generalmente establecido en 10). A través de este ejemplo, puede verificar si las operaciones de inserción y consulta se enrutan correctamente al fragmento especificado.

Supongo que te gusta

Origin blog.csdn.net/universsky2015/article/details/133566217
Recomendado
Clasificación