table des matières
Construire la base de données maître-esclave mysql
Construction de l'application Springboot
configuration de l'application.properties
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
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
● 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