Optimización de base de datos-sincronización maestro-esclavo, separación lectura-escritura

Preparando el entorno
Se requieren al menos dos servidores, que deben ser dos equipos independientes, por supuesto, también se pueden utilizar máquinas virtuales.
1) Construya las bases de datos maestra y esclava por separado y los registros de salida (para una fácil localización de problemas)
configure la ruta del registro
2) Instalación y arranque:
modifique la ruta my.ini en el maestro a la ruta maestra
mysqld --install MySQLXY --defaults -file = "C: \ Archivos de programa \ MySQL \ MySQL Server XY \ my.ini"
(instalar / eliminar el servicio denegado el permiso no es suficiente para ejecutarlo como administrador)
net start MySQLXY
Sc eliminar maestro / esclavo Si realiza un error, puede eliminar el servicio y reiniciar la operación para
abrir el registro (no es necesario)

(No es necesario) Active el registro de la declaración SQL, no se recomienda activarlo en el entorno de producción:

Verifique el directorio de registro y abra el registro de la declaración sql:
mysql> mostrar variables como '% general_log%';
mysql> set global general_log = on;
Después de abrir, reinicie Mysql, la configuración de registro de apertura mencionada anteriormente no será válida.

configuración del servidor maestro

1) Modificar mysql.ini del maestro

 log-bin=mysql-bin
 server-id=1
 innodb_flush_log_at_trx_commit=1
 sync_binlog=1
 binlog_ignore_db=mysql
 binlog_checksum=none

2) Reinicie el servicio maestro e inicie sesión.
3) Autorice la cuenta y los permisos del servidor savle.
Escenario:
servidor maestro maestro: 192.168.1.101
servidor esclavo: 192.168.1.102
1. Derecho al servidor de base de datos esclavo 192.168.10.131 (usuario maestro , solo para El servidor esclavo está abierto) La
sintaxis es: GRANT REPLICATION SLAVE ON . to'Username'@'192.168.0.102 'identificado por'Password';

 Mysql>  GRANT REPLICATION SLAVE ON *.* to 'lvtest'@'192.168.77.128'identified   by 'admin';

Descripción del parámetro:
lvtest: cuenta
IDENTIFICADA POR'admin 'utilizada por el esclavo para conectarse al maestro: contraseña utilizada por el esclavo para conectarse al maestro
192.168.77.128 : IP del esclavo

2 Consultar el estado de la base de datos maestra
Mysql> mostrar estado maestro;
± ------------------- ± --------- ± ----- --- ------ ± ----------------------------- +
| Archivo | Posición | Binlog_Do_DB | Binlog_Ignore_DB |
± --- ---------------- ± --------- ± -------------- ± ----- --- --------------------- +
| mysql-bin.000002 | 226 | | mysql |
± ------------ --- ---- ± --------- ± -------------- ± ----------------- --- --------- +
Registre el valor de Archivo y Posición, úselo en el lado esclavo

configuración esclava

1. Modifique el archivo de configuración my.ini del servidor esclavo para cambiar server-id = 1 a server-id = 10, y asegúrese de que este
ID no sea utilizado por otros servicios MySQL.
2. Inicie el servidor esclavo e inicie sesión.
3. En el lado esclavo, configure la información del enlace maestro (declaración de ejecución)
1) Configure
Mysql> cambie maestro a
master_host = '192.168.77.1', #master IP
master_user = 'lvtest' , # la base de datos maestra pasó GRANT cuenta autorizada
master_password = 'admin', # contraseña de la base de datos maestra autorizada por GRANT
master_port = 3307, # contraseña de la base de datos
maestra master_log_file = 'mysql-bin.000001',
# nombre del archivo de la base de datos maestra mostrado por show master status
master_log_pos = 296
# base de datos master Valor de posición mostrado por show master status
2) (reiniciar) conectar
Mysql> iniciar esclavo;

        3)主从同步检查
        show slave status;
        其中Slave_IO_Running 与 Slave_SQL_Running 的值都必须为YES,才表明状态正常。

4. Prueba
1) En el maestro, construya una base de datos, cree tablas y agregue datos.
2) Actualice la base de datos esclava, y los registros también existen.
A partir de esto, se completa todo el proceso de replicación maestro-esclavo de MySQL. A continuación, realizar la instalación y configuración de separación lectura-escritura de MySQL.

Leer y escribir separación-fragmentación-jdbc

Inserte la descripción de la imagen aquí
Archivo de
configuración Configuración básica -> application.yml

server:
  port: 8018

spring:
  application:
    name: bj-sharding-jdbc
  main:
    allow-bean-definition-overriding: true
  profiles:
    # rw-读写分离配置  table-数据分表+读写分离   dt-分库分表+读写分离
    active: dt
mybatis:
  mapper-locations: classpath:/top/qrainly/**/dao/**/*.xml

Configuración de separación de lectura y escritura -> application-rw.yml

sharding:
  jdbc:
    dataSource:
      names: db-test0,db-test1
      db-test0:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/bj_sharding?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
        username: root
        password: 123456
        maxPoolSize: 20
      db-test1:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3307/bj_sharding?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
        username: root
        password: 123456
        maxPoolSize: 20
    config:
        # 仅配置读写分离时打开此配置
      masterslave:
        # 配置从库选择策略,提供轮询与随机,这里选择用轮询//random 随机 //round_robin 轮询
        load-balance-algorithm-type: round_robin
        name: db1s2
        master-data-source-name: db-test0
        slave-data-source-names: db-test1
    props:
      sql:
        # 开启SQL显示,默认值: false,注意:仅配置读写分离时不会打印日志!!!
        show: true

Tabla de datos + configuración de separación de lectura-escritura -> application-table.yml

sharding:
  jdbc:
    dataSource:
      names: db-test0,db-test1
      db-test0:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/bj_sharding?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
        username: root
        password: 123456
        maxPoolSize: 20
      db-test1:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3307/bj_sharding?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
        username: root
        password: 123456
        maxPoolSize: 20
    config:
      # 配置数据分表
      sharding:
        tables:
          user:
            table-strategy:
              standard:
                sharding-column: id
                precise-algorithm-class-name: top.qrainly.sharding.jdbc.config.MyPreciseShardingAlgorithm
            # 读取ds_0数据源的user_0、user_1、user_2、user_3
            actual-data-nodes: ds_0.user_$->{
    
    0..3}
        master-slave-rules:
          ds_0:
            master-data-source-name: db-test0
            slave-data-source-names: db-test1
    props:
      sql:
        # 开启SQL显示,默认值: false,注意:仅配置读写分离时不会打印日志!!!
        show: true

Sub-base de datos subtabla + configuración de separación de lectura-escritura -> application-dt.yml

---
sharding:
  jdbc:
    datasource:
      names: ds-master-0,ds-master-1,ds-master-0-slave-0,ds-master-1-slave-0
      # 主库0
      ds-master-0:
        password: 123456
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/bj_sharding?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
        username: root
      # 主库0-从库0
      ds-master-0-slave-0:
        password: 123456
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3307/bj_sharding?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
        username: root
      # 主库1
      ds-master-1:
        password: 123456
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/bj_sharding1?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
        username: root
      # 主库1-从库0
      ds-master-1-slave-0:
        password: 123456
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3307/bj_sharding1?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
        username: root
    config:
      sharding:
        tables:
          user:
            table-strategy:
              inline:
                sharding-column: id
                algorithm-expression: user_$->{
    
    id % 5}
            key-generator-column-name: id
            actual-data-nodes: ds_$->{
    
    0..1}.user_$->{
    
    0..4}
        default-database-strategy:
          inline:
            # 置的分库的字段,本案例是根据id进行分
            sharding-column: id
            # 置的分库的逻辑,根据id%2进行分
            algorithm-expression: ds_$->{
    
    id % 2}
        master-slave-rules:
          ds_1:
            slave-data-source-names: ds-master-1-slave-0
            master-data-source-name: ds-master-1
          ds_0:
            slave-data-source-names: ds-master-0-slave-0
            master-data-source-name: ds-master-0

Nota: El parámetro exclude = {DataSourceAutoConfiguration.class} debe agregarse a @SpringBootApplication en la configuración de la subbase de datos y la subtabla

ok, cambia spring.profiles.active para jugar en diferentes modos de configuración.
Artículo de referencia: https://my.oschina.net/qrainly/blog/3072946

Supongo que te gusta

Origin blog.csdn.net/weixin_45528650/article/details/108975697
Recomendado
Clasificación