[Sharding-JDBC Series 1] Spring Boot intègre Sharding-JDBC pour séparer la lecture et l'écriture

table des matières

Introduction à Sharding-JDBC

Construire la base de données maître-esclave mysql

Construction de l'application Springboot

dépendance pom

configuration de l'application.properties

tester

Activer le journal (non requis)


Introduction à Sharding-JDBC

ShardingSphere-JDBC se positionne comme une solution middleware de base de données distribuée légère qui fournit des services supplémentaires dans la couche JDBC de Java. Il utilise le client pour se connecter directement à la base de données et fournit des services sous forme de packages jar sans déploiement ni dépendances supplémentaires. Il peut être compris comme un pilote JDBC amélioré, entièrement compatible avec JDBC et divers frameworks ORM.

  • Applicable à tout cadre ORM basé sur JDBC, tel que: JPA, Hibernate, Mybatis, Spring JDBC Template ou directement à l'aide de JDBC.
  • Prend en charge tout pool de connexion de base de données tiers, tel que: DBCP, C3P0, BoneCP, Druid, HikariCP, etc.
  • Il prend en charge toute base de données qui implémente la spécification JDBC et prend actuellement en charge MySQL, Oracle, SQLServer, PostgreSQL et toute base de données qui suit la norme SQL92.

Traits:

  • Sous-bibliothèque et sous-table
  • Séparation de lecture et d'écriture
  • Personnalisation de la stratégie de sharding
  • Clé primaire distribuée décentralisée
  • Gouvernance distribuée
  • Transaction flexible
  • Interface de transaction standardisée

Construire la base de données maître-esclave mysql

Vous pouvez vous référer à l'article précédent, "[Mycat Series One] Tutoriel détaillé sur la création d'une réplication maître-esclave MySQL basée sur Docker" pour construire un mysql maître et deux esclaves , bien sûr, vous pouvez également utiliser plusieurs Linux pour construire sans utiliser docker, les détails sont les suivants:

Type de base de données base de données IP dans le conteneur Docker IP hôte (IP externe)
Principal: mysql-master tester 172.17.0.2:3306 192.168.239.128:3307
De: mysql-slave1 tester 172.17.0.3:3306 192.168.239.128:3308
De: mysql-slave2 tester 172.17.0.4:3306 192.168.239.128:3309

Après avoir configuré le maître et l'esclave, créez un nouveau test de base de données dans la bibliothèque maître. Vous pouvez utiliser des outils clients tiers tels que Navicat ou des scripts de ligne de commande. Les scripts SQL sont les suivants:

USE `test`;

DROP TABLE IF EXISTS `t_user`;

CREATE TABLE `t_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT '' COMMENT '名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1307873057269878786 DEFAULT CHARSET=utf8 COMMENT='用户表';

Les effets Navicat sont les suivants:

Construction de l'application Springboot

Cet article intégrera SpringBoot + Mybatis-plus + Druid + Sharding-JDBC + MySQL , comme suit:

dépendance pom

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

        <!-- 数据库连接池 -->
       <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.22</version>
        </dependency>

        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>3.1.0.M1</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.2</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.2</version>
        </dependency>

configuration de l'application.properties

# 服务端口
server.port=8080

# mysql-plus 配置
mybatis-plus.mapper-locations=classpath:/mapper/*.xml
mybatis-plus.type-aliases-package=com.stwen.shardingjdbc.entity

spring.main.allow-bean-definition-overriding=true

# sharding-jdbc 配置主从
sharding.jdbc.dataSource.names=master,slave1,slave2

# sharding-jdbc 主数据库
sharding.jdbc.dataSource.master.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.dataSource.master.driverClassName=com.mysql.jdbc.Driver
sharding.jdbc.dataSource.master.url=jdbc:mysql://192.168.239.128:3307/test?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
sharding.jdbc.dataSource.master.username=root
sharding.jdbc.dataSource.master.password=123456
sharding.jdbc.dataSource.master.maxPoolSize=20

# sharding-jdbc 从数据库一
sharding.jdbc.dataSource.slave1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.dataSource.slave1.driverClassName=com.mysql.jdbc.Driver
sharding.jdbc.dataSource.slave1.url=jdbc:mysql://192.168.239.128:3308/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
sharding.jdbc.dataSource.slave1.username=root
sharding.jdbc.dataSource.slave1.password=123456
sharding.jdbc.dataSource.slave1.maxPoolSize=20

# sharding-jdbc 从数据库二
sharding.jdbc.dataSource.slave2.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.dataSource.slave2.driverClassName=com.mysql.jdbc.Driver
sharding.jdbc.dataSource.slave2.url=jdbc:mysql://192.168.239.128:3309/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
sharding.jdbc.dataSource.slave2.username=root
sharding.jdbc.dataSource.slave2.password=123456
sharding.jdbc.dataSource.slave2.maxPoolSize=20

# 配置从库选择策略,提供轮询与随机,这里选择用轮询,random-随机
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
# 配置主从读写分离
sharding.jdbc.config.masterslave.name=master-slave 
sharding.jdbc.config.masterslave.master-data-source-name=master
sharding.jdbc.config.masterslave.slave-data-source-names=slave1,slave2
# 开启SQL显示,默认值: false,注意:仅配置读写分离时不会打印日志
sharding.jdbc.props.sql.show=true

Description des paramètres de configuration:

  • mybatis-plus.mapper-locations : le chemin du fichier de mappage XXXmapper.xml
  • mybatis-plus.type-aliases-package : nom du package de classe d'entité
  • sharding.jdbc.dataSource.names : la configuration est le nom de la base de données, qui est le nom des multiples sources de données créées ci-dessus
  • sharding.jdbc.dataSource : configurer plusieurs sources de données

Les autres paramètres détaillés ne seront pas expliqués un par un, il suffit de regarder et de comprendre.

Parmi eux, spring.main.allow-bean-definition-overriding = true est ajouté pour éviter que les erreurs suivantes ne soient signalées:

Dans la classe de démarrage Springboot, ajoutez la configuration, analysez le package d'interface dao de mybatis, comme suit

Capture d'écran WeChat_20190626145550.png

tester

Écrire la classe de test, ajouter deux interfaces: ajouter une nouvelle liste de requêtes

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    @PutMapping("/save")
    public Object save() {
        User user = new User();
        user.setName("新增");
        return userService.save(user);
    }
    
    @GetMapping("/list")
    public Object list() {
        // 强制路由主库
        //HintManager.getInstance().setMasterRouteOnly();
        return userService.list();
    }
    
}

Démarrez l'application, accédez à l'interface: localhost: 8080 / user / save, vous pouvez afficher les données et constater qu'une nouvelle donnée a été ajoutée

Visitez à nouveau l'interface de requête de liste: localhost: 8080 / user / list

Activer le journal (non requis)

(Pas nécessaire) Activez le journal de l'instruction SQL. Il n'est pas recommandé de l'activer dans l'environnement de production. Il s'agit simplement de vérifier si l'effet de la séparation de lecture et d'écriture est atteint.

Affichez le répertoire du journal et ouvrez le journal des instructions SQL:

mysql>  show variables like '%general_log%';
mysql>  set global general_log=on;

Remarque:

  • Connectez-vous aux trois bases de données configurées ci-dessus, exécutez la commande ci-dessus et activez la journalisation SQL (pas besoin de redémarrer pour prendre effet).
  • Lorsque Mysql est redémarré, la configuration du journal ci-dessus sera invalide.

Une fois les trois bases de données configurées, visitez à nouveau les deux interfaces de test, puis vérifiez le journal SQL:

Comme suit, dans le conteneur mysql-master, vérifiez le journal sql, vous pouvez voir que le sql inséré est exécuté dans la base de données principale

Comme suit, vérifiez le journal sql de mysql-slave2 et les données de la liste de lecture sont exécutées à partir de la base de données, indiquant que la séparation lecture-écriture que nous avons configurée est réussie.

Délai de synchronisation maître-esclave

  Il apparaît souvent dans l'architecture de séparation lecture-écriture, c'est-à- dire comment résoudre le problème du retard de lecture ?

  Insérez simplement une donnée, puis lisez-la tout de suite, ne peut-elle pas être lue pour le moment? En dernière analyse, c'est parce que les données sont copiées sur le nœud esclave après l'écriture du nœud maître. La raison pour laquelle les données ne peuvent pas être lues est que le temps de copie est relativement long, c'est-à-dire que les données n'ont pas été copiées sur le nœud esclave, vous devez lire depuis le nœud Je ne peux pas le lire. La réplication maître-esclave de mysql5.7 est multithread , ce qui signifie que la vitesse deviendra plus rapide, mais il n'est peut-être pas garanti qu'elle soit lue à 100% immédiatement . Nous pouvons résoudre ce problème de deux manières:

  (1) Compromis au niveau de l'entreprise, s'il sera lu immédiatement après la fin de l'opération

  (2) Pour ceux qui seront lus immédiatement après l'opération et ne peuvent être compromis en entreprise, nous pouvons aller directement à la bibliothèque principale pour ce type de lecture . Bien sûr, Sharding-JDBC considère également l'existence de ce problème, nous nous fournissons donc un La fonction permet à l'utilisateur de spécifier s'il doit utiliser la bibliothèque principale pour la lecture. Utilisez la méthode suivante pour configurer avant de lire:

    @GetMapping("/list")
    public Object list() {
        // 强制路由主库
        HintManager.getInstance().setMasterRouteOnly();
        return userService.list();
    }

Vérifiez le journal sql de la configuration de la bibliothèque principale, vous verrez l'impression suivante, indiquant la bibliothèque principale que l'opération de lecture est forcée d'aller:

SELECT  id,name  FROM t_user

● La meilleure optimisation des performances Tomcat8 de l'histoire

Pourquoi Alibaba peut-il résister à 10 milliards en 90 secondes? - L'évolution de l'architecture distribuée à haute concurrence côté serveur

Plateforme de commerce électronique B2B - Fonction de paiement électronique ChinaPay UnionPay

Apprenez le verrouillage distribué de Zookeeper, laissez les enquêteurs vous regarder avec admiration

SpringCloud e-commerce spike microservice-solution de verrouillage distribué Redisson

Découvrez d'autres bons articles, entrez dans le compte officiel - s'il vous plaît moi - excellent dans le passé

Un compte public profond et émouvant 0.0

Je suppose que tu aimes

Origine blog.csdn.net/a1036645146/article/details/108705394
conseillé
Classement