IT 老齐的架构 300 讲-16【数据库-4】

2022年04月09日 12:39 · 阅读(236) ·

来源

《IT 老齐的架构 300 讲》

课件地址:https://manongbiji.oss-cn-beijing.aliyuncs.com/ittailkshow/it300/download/ppt_all_in_one.zip

【132】写了份傻瓜文档,20 分钟上手阿里 Canal 数据同步中间件

来源:https://www.bilibili.com/video/BV1jY41177Qh/?spm_id_from=333.788

文档地址:
链接:https://pan.baidu.com/s/13aYcOmk6yUhbILwKHSXQjA
提取码:jm9y

概述

本文演示如何 Canal 如何接入 MySQL 实现数据写操作监听。 关于 Canal 如何接入消息队列、Redis、Canal 的高可用 HA 后文继续讲解。

开发环境

名称 版本
操作系统 Windows 10 X64
VMware® Workstation 12 Pro 12.0.0 build-2985596
CentOS7 CentOS Linux release 7.8.2003 (Core)
Linux 3.10.0-1127.el7.x86_64
mysql 8.0.28,安装在机器 192.168.0.191
Canal 1.1.5,安装在机器 192.168.0.192

安装 MySQL 8.0.28(192.168.0.191)

  1. firewall-cmd --zone=public --add-port=3306/tcp --permanent
  2. firewall-cmd --reload
  3. cd /home/
  4. wget --no-check-certificate https://manongbiji.oss-cn-beijing.aliyuncs.com/ittailkshow/canal/download/world.sql
  5. wget --no-check-certificate https://repo.mysql.com/mysql80-community-release-el7-5.noarch.rpm
  6. yum localinstall -y mysql80-community-release-el7-5.noarch.rpm
  7. #自动安装 MySQL 8.0.28
  8. yum install -y mysql-community-server

调整配置文件

  1. sudo cat >> /etc/my.cnf <<-'EOF'
  2. server-id=1
  3. log-bin=mysql-bin
  4. binlog_format=row
  5. binlog_do_db=world
  6. EOF
  7. #启动 mysql
  8. systemctl start mysqld

获取初始密码

  1. grep 'temporary password' /var/log/mysqld.log

2022-04-09T04:55:23.758813Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Ke1Lo*SvUQg#

设置相关账户密码

  1. #登录 mysqld
  2. mysql -uroot -p
  3. #修改 root 密码
  4. alter user 'root'@'localhost' identified with mysql_native_password by 'asAS123456!';
  5. #mysql 降低密码强度
  6. set global validate_password.policy=0;
  7. set global validate_password.length=4;
  8. #创建 canal 同步账户
  9. create user canal@'%' identified with mysql_native_password by 'canal';
  10. #授权 canal 用户允许远程到 mysql 实现主从复制
  11. grant select,replication slave,replication client on *.* to 'canal'@'%';
  12. create user remote@'%' identified with mysql_native_password by 'remote';
  13. grant all privileges on *.* to remote@'%';
  14. #初始化数据库
  15. source /home/world.sql

安装 Canal-Server(192.168.0.192)

安装 JDK

  1. yum y install java1.8.0openjdkdevel.x86_64
  2. sudo cat >> /etc/profile <<-'EOF'
  3. export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
  4. export JRE_HOME=$JAVA_HOME/jre
  5. export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
  6. export PATH=$JAVA_HOME/bin:$JRE_HOME/lib:$PATH
  7. EOF
  8. source /etc/profile
  9. echo $JAVA_HOME

下载 canal-deployer 最新版

  1. # 下载脚本
  2. wget --no-check-certificate https://manongbiji.oss-cn-beijing.aliyuncs.com/ittailkshow/canal/download/canal.deployer-1.1.5.tar.gz
  3. mkdir /home/canal
  4. tar zxvf canal.deployer-1.1.5.tar.gz -C /home/canal

修改配置文件

  1. vim /home/canal/conf/example/instance.properties

修改下面内容

  1. # 调整 serverId
  2. canal.instance.mysql.slaveId=10
  3. #master 地址
  4. canal.instance.master.address=192.168.0.191:3306
  5. #关闭 tsdb
  6. canal.instance.tsdb.enable=false
  7. #确认 canal 同步用的用户名,密码
  8. canal.instance.tsdb.dbUsername=canal
  9. canal.instance.tsdb.dbPassword=canal

启动服务

  1. cd /home/canal/
  2. sh bin/startup.sh

添加端口

  1. #canal admin 端口
  2. firewall-cmd --zone=public --add-port=11110/tcp --permanent
  3. #canal 监听端口
  4. firewall-cmd --zone=public --add-port=11111/tcp --permanent
  5. #canal 指标监控端口
  6. firewall-cmd --zone=public --add-port=11112/tcp --permanent
  7. firewall-cmd --reload

查看是否启动成功

  1. cd /home/canal/logs/canal
  2. tail canal.log

结果

  1. 2022-04-09 13:00:25.702 [main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## set default uncaught exception handler
  2. 2022-04-09 13:00:26.024 [main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## load canal configurations
  3. 2022-04-09 13:00:26.073 [main] INFO com.alibaba.otter.canal.deployer.CanalStarter - ## start the canal server.
  4. 2022-04-09 13:00:26.645 [main] INFO com.alibaba.otter.canal.deployer.CanalController - ## start the canal server[192.168.122.1(192.168.122.1):11111]
  5. 2022-04-09 13:00:35.164 [main] INFO com.alibaba.otter.canal.deployer.CanalStarter - ## the canal server is running now ......

开发数据监听程序-canal-client

canal-client.zip

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.itlaoqi</groupId>
  7. <artifactId>canal-client</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <repositories>
  10. <repository>
  11. <id>aliyun</id>
  12. <name>aliyun</name>
  13. <url>https://maven.aliyun.com/repository/public</url>
  14. </repository>
  15. </repositories>
  16. <pluginRepositories>
  17. <pluginRepository>
  18. <id>aliyun</id>
  19. <name>aliyun</name>
  20. <url>https://maven.aliyun.com/repository/public</url>
  21. </pluginRepository>
  22. </pluginRepositories>
  23. <properties>
  24. <maven.compiler.source>8</maven.compiler.source>
  25. <maven.compiler.target>8</maven.compiler.target>
  26. </properties>
  27. <dependencies>
  28. <dependency>
  29. <groupId>com.alibaba.otter</groupId>
  30. <artifactId>canal.client</artifactId>
  31. <version>1.1.5</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>com.alibaba.otter</groupId>
  35. <artifactId>canal.protocol</artifactId>
  36. <version>1.1.5</version>
  37. </dependency>
  38. </dependencies>
  39. </project>

编写数据监听程序

  1. package com.itlaoqi;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.alibaba.otter.canal.client.CanalConnector;
  4. import com.alibaba.otter.canal.client.CanalConnectors;
  5. import com.alibaba.otter.canal.protocol.CanalEntry;
  6. import com.alibaba.otter.canal.protocol.Message;
  7. import com.google.protobuf.ByteString;
  8. import com.google.protobuf.InvalidProtocolBufferException;
  9. import java.net.InetSocketAddress;
  10. import java.util.List;
  11. public class AD {
  12. public static void main(String[] args) throws InterruptedException, InvalidProtocolBufferException {
  13. //TODO 获取连接
  14. CanalConnector canalConnector = CanalConnectors.newSingleConnector(new InetSocketAddress("192.168.0.191", 11111), "example", "", "");
  15. while (true) {
  16. //TODO 连接
  17. canalConnector.connect();
  18. //TODO 订阅数据库
  19. canalConnector.subscribe("world.*");
  20. //TODO 获取数据
  21. Message message = canalConnector.get(100);
  22. //TODO 获取Entry集合
  23. List<CanalEntry.Entry> entries = message.getEntries();
  24. //TODO 判断集合是否为空,如果为空,则等待一会继续拉取数据
  25. if (entries.size() <= 0) {
  26. System.out.println("当次抓取没有数据,休息一会。。。。。。");
  27. Thread.sleep(1000);
  28. } else {
  29. //TODO 遍历entries,单条解析
  30. for (CanalEntry.Entry entry : entries) {
  31. //1.获取表名
  32. String tableName = entry.getHeader().getTableName();
  33. //2.获取类型
  34. CanalEntry.EntryType entryType = entry.getEntryType();
  35. //3.获取序列化后的数据
  36. ByteString storeValue = entry.getStoreValue();
  37. //4.判断当前entryType类型是否为ROWDATA
  38. if (CanalEntry.EntryType.ROWDATA.equals(entryType)) {
  39. //5.反序列化数据
  40. CanalEntry.RowChange rowChange = CanalEntry.RowChange.parseFrom(storeValue);
  41. //6.获取当前事件的操作类型
  42. CanalEntry.EventType eventType = rowChange.getEventType();
  43. //7.获取数据集
  44. List<CanalEntry.RowData> rowDataList = rowChange.getRowDatasList();
  45. //8.遍历rowDataList,并打印数据集
  46. for (CanalEntry.RowData rowData : rowDataList) {
  47. JSONObject beforeData = new JSONObject();
  48. List<CanalEntry.Column> beforeColumnsList = rowData.getBeforeColumnsList();
  49. for (CanalEntry.Column column : beforeColumnsList) {
  50. beforeData.put(column.getName(), column.getValue());
  51. }
  52. JSONObject afterData = new JSONObject();
  53. List<CanalEntry.Column> afterColumnsList = rowData.getAfterColumnsList();
  54. for (CanalEntry.Column column : afterColumnsList) {
  55. afterData.put(column.getName(), column.getValue());
  56. }
  57. //数据打印
  58. System.out.println("Table:" + tableName +
  59. ",EventType:" + eventType +
  60. ",Before:" + beforeData +
  61. ",After:" + afterData);
  62. }
  63. } else {
  64. System.out.println("当前操作类型为:" + entryType);
  65. }
  66. }
  67. }
  68. }
  69. }
  70. }

测试

● 启动 canal-client
● 连接数据库 192.168.0.191

新增数据

  1. mysql> insert into city(ID,Name,CountryCode,District,Population) values(99999,'luoma','AFG','luoma',99999);
  2. Query OK, 1 row affected (0.01 sec)

canal-client 控制台输出

  1. 当次抓取没有数据,休息一会。。。。。。
  2. 当前操作类型为:TRANSACTIONBEGIN
  3. Table:city,EventType:INSERT,Before:{},After:{"Population":"99999","ID":"99999","CountryCode":"AFG","District":"luoma","Name":"luoma"}
  4. 当前操作类型为:TRANSACTIONEND
  5. 当次抓取没有数据,休息一会。。。。。。

修改数据

  1. mysql> update city set name='luoma888888' where id = 99999;
  2. Query OK, 1 row affected (0.10 sec)
  3. Rows matched: 1 Changed: 1 Warnings: 0

canal-client 控制台输出

  1. 当前操作类型为:TRANSACTIONBEGIN
  2. Table:city,EventType:UPDATE,Before:{"Population":"99999","ID":"99999","CountryCode":"AFG","District":"luoma","Name":"luoma"},After:{"Population":"99999","ID":"99999","CountryCode":"AFG","District":"luoma","Name":"luoma888888"}
  3. 当前操作类型为:TRANSACTIONEND

删除数据

  1. mysql> delete from city where id = 99999;
  2. Query OK, 1 row affected (0.01 sec)

canal-client 控制台输出

  1. 当次抓取没有数据,休息一会。。。。。。
  2. 当前操作类型为:TRANSACTIONBEGIN
  3. Table:city,EventType:DELETE,Before:{"Population":"99999","ID":"99999","CountryCode":"AFG","District":"luoma","Name":"luoma1"},After:{}
  4. 当前操作类型为:TRANSACTIONEND

【142】简单粗暴,20 分钟 ShardingJDBC 5 实现 MySQL 分库分表

来源:https://www.bilibili.com/video/BV12A4y197sa?spm_id_from=333.999.0.0
文档地址:
链接:https://pan.baidu.com/s/1Y42yVdVcI90kI0eN70GeLA
提取码:rje6

开发环境

名称 版本
操作系统 Windows 10 X64
VMware® Workstation 12 Pro 12.0.0 build-2985596
CentOS7 CentOS Linux release 7.8.2003 (Core)
Linux 3.10.0-1127.el7.x86_64
mysql【第一个数据源】 8.0.11,安装在本机 Windows 机器
mysql【第二个数据源】 5.7.16,安装在 192.168.16.128,CentOS 机器

ShardSphere

https://shardingsphere.apache.org/index_zh.html
https://shardingsphere.apache.org/document/current/cn/overview/

Database Plus
什么是 Apache ShardingSphere?
Apache ShardingSphere 是一套开源的分布式数据库增强计算引擎,其通过可插拔架构构建基于数据库之上的生态系统,实现包括数据分片、弹性伸缩、加密脱敏等功能为代表的增强能力。

ShardingJDBC

定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。
● 适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC;
● 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, HikariCP 等;
● 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,PostgreSQL,Oracle,SQLServer 以及任何可使用 JDBC 访问的数
据库。

ShardingSphere-Proxy

定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。
目前提供 MySQL 和 PostgreSQL(兼容 openGauss 等基于 PostgreSQL 的数据库)版本,它可以使用任何兼容 MySQL/PostgreSQL 协议的访问客户端(如:MySQL Command Client, MySQL Workbench, Navicat 等)操作数据,对 DBA 更加友好。
● 向应用程序完全透明,可直接当做 MySQL/PostgreSQL 使用;
● 适用于任何兼容 MySQL/PostgreSQL 协议的的客户端。

ShardingSphere-Sidecar

定位为 Kubernetes 的云原生数据库代理,以 Sidecar 的形式代理所有对数据库的访问。 通过无中心、零侵入的方案提供与数据库交互的啮合层,即 Database Mesh,又可称数据库网格。
Database Mesh 的关注重点在于如何将分布式的数据访问应用与数据库有机串联起来,它更加关注的是交互,是将杂乱无章的应用与数
据库之间的交互进行有效地梳理。 使用 Database Mesh,访问数据库的应用和数据库终将形成一个巨大的网格体系,应用和数据库只需
在网格体系中对号入座即可,它们都是被啮合层所治理的对象。

对比选型

ShardingSphere-JDBC ShardingSphere-Proxy ShardingSphere-Sidecar
数据库 任意 MySQL/PostgreSQL MySQL/PostgreSQL
连接消耗数
异构语言 仅 Java 任意 任意
性能 损耗低 损耗略高 损耗低
无中心化
静态入口

新建数据库和表

mysql【第一个数据源】

版本 8.0.11,安装在本机 Windows 机器

  1. create database if not exists testdb default character set utf8 collate utf8_general_ci;
  2. use testdb;
  3. create table employee
  4. (
  5. id bigint(20) primary key,
  6. `name` varchar(100)
  7. );

mysql【第二个数据源】

版本 5.7.16,安装在 192.168.16.128,CentOS 机器

  1. create database if not exists testdb default character set utf8 collate utf8_general_ci;
  2. use testdb;
  3. create table employee
  4. (
  5. id bigint(20) primary key,
  6. `name` varchar(100)
  7. );

ShardingJDBC 分库分表快速上手

项目结构

代码下载:shardingjdbc-demo.zip

pom.xml

第一步,新建Spring Boot2.x工程,引入 shardingsphere-jdbc 核心 starter

  1. <dependency>
  2. <groupId>org.apache.shardingsphere</groupId>
  3. <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
  4. <version>5.1.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.baomidou</groupId>
  8. <artifactId>mybatis-plus-boot-starter</artifactId>
  9. <version>3.4.3</version>
  10. </dependency>

完整内容

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>study-2022</artifactId>
  7. <groupId>org.example</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>shardingjdbc-demo</artifactId>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.apache.shardingsphere</groupId>
  19. <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
  20. <version>5.1.0</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.baomidou</groupId>
  24. <artifactId>mybatis-plus-boot-starter</artifactId>
  25. <version>3.4.3</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>mysql</groupId>
  29. <artifactId>mysql-connector-java</artifactId>
  30. <scope>runtime</scope>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. </dependency>
  37. </dependencies>
  38. <properties>
  39. <maven.compiler.source>8</maven.compiler.source>
  40. <maven.compiler.target>8</maven.compiler.target>
  41. </properties>
  42. </project>

application.properties

第二步,配置多数据源与分片策略

  1. # 配置真实数据源,ds{0..1}
  2. spring.shardingsphere.datasource.names=ds0,ds1
  3. # 配置第一个数据源
  4. spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
  5. spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
  6. spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://localhost:3306/testdb
  7. spring.shardingsphere.datasource.ds0.username=root
  8. spring.shardingsphere.datasource.ds0.password=0000abc!
  9. # 配置第二个数据源
  10. spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
  11. spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
  12. spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://192.168.16.128:3306/testdb
  13. spring.shardingsphere.datasource.ds1.username=root
  14. spring.shardingsphere.datasource.ds1.password=0000abc!
  15. # 定义数据源的分片规则,按 employee 表的 id % 2 取模得到数据应该放在哪个数据源
  16. spring.shardingsphere.rules.sharding.sharding-algorithms.database-inline.type=INLINE
  17. spring.shardingsphere.rules.sharding.sharding-algorithms.database-inline.props.algorithm-expression=ds$->{id % 2}
  18. # 定义哪一个列用于生成主键
  19. spring.shardingsphere.rules.sharding.tables.employee.key-generate-strategy.column=id
  20. # 定义 employee 表哪个是分片字段,这里按主键字段 Id
  21. spring.shardingsphere.rules.sharding.tables.employee.database-strategy.standard.sharding-column=id
  22. # 将 employee 表与分片规则 database-inline 绑定
  23. spring.shardingsphere.rules.sharding.tables.employee.database-strategy.standard.sharding-algorithm-name=database-inline
  24. # 默认主键生成策略采用 snowflake
  25. spring.shardingsphere.sharding.default-key-generate-strategy.xxx=snowflake
  26. # snowflake 算法配置
  27. spring.shardingsphere.rules.sharding.key-generators.snowflake.type=SNOWFLAKE
  28. # 机器唯一标识
  29. spring.shardingsphere.rules.sharding.key-generators.snowflake.props.worker-id=666
  30. # 显示分库分表后执行的 SQL 语句
  31. spring.shardingsphere.props.sql-show=true

主启动类-ShardingjdbcApplication

  1. package com.itlaoqi.shardingjdbc;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @MapperScan
  6. @SpringBootApplication
  7. public class ShardingjdbcApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(ShardingjdbcApplication.class,args);
  10. }
  11. }

数据库相关类

  1. package com.itlaoqi.shardingjdbc.entity;
  2. import com.baomidou.mybatisplus.annotation.TableId;
  3. import com.baomidou.mybatisplus.annotation.TableName;
  4. @TableName("employee")
  5. public class Employee {
  6. @TableId
  7. private Long id;
  8. private String name;
  9. public Long getId() {
  10. return id;
  11. }
  12. public void setId(Long id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. }
  1. package com.itlaoqi.shardingjdbc.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.itlaoqi.shardingjdbc.entity.Employee;
  4. public interface EmployeeMapper extends BaseMapper<Employee> {
  5. }

测试类和方法-EmployeeTestor

利用 MyBatis 或者 Hibernate 等 ORM 框架进行数据操作

  1. package com.itlaoqi.shardingjdbc;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.itlaoqi.shardingjdbc.entity.Employee;
  4. import com.itlaoqi.shardingjdbc.mapper.EmployeeMapper;
  5. import org.junit.jupiter.api.Test;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import javax.annotation.Resource;
  8. import java.util.List;
  9. @SpringBootTest
  10. public class EmployeeTestor {
  11. @Resource
  12. private EmployeeMapper employeeMapper;
  13. @Test
  14. public void testInsert(){
  15. for(int i = 0 ; i < 10 ; i++) {
  16. Employee employee = new Employee();
  17. employee.setName("MJ" + i);
  18. employeeMapper.insert(employee);
  19. }
  20. }
  21. @Test
  22. public void testSelect(){
  23. List<Employee> employees = employeeMapper.selectList(new QueryWrapper<>());
  24. }
  25. }

测试

新增数据-testInsert

运行 testInsert 方法,查看控制台日志

部分日志如下,可以看到使用 id 取模 2 在 ds0,ds1 两个节点加入数据

  1. ShardingSphere-SQL: Logic SQL: INSERT INTO employee ( id,name ) VALUES ( ?,? )
  2. ShardingSphere-SQL: SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
  3. ShardingSphere-SQL: Actual SQL: ds0 ::: INSERT INTO employee ( id,name ) VALUES (?, ?) ::: [1514101119097311234, MJ0]
  4. ShardingSphere-SQL: Logic SQL: INSERT INTO employee ( id,name ) VALUES ( ?,? )
  5. ShardingSphere-SQL: SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
  6. ShardingSphere-SQL: Actual SQL: ds1 ::: INSERT INTO employee ( id,name ) VALUES (?, ?) ::: [1514101126974214145, MJ1]
  7. ShardingSphere-SQL: Logic SQL: INSERT INTO employee ( id,name ) VALUES ( ?,? )
  8. ShardingSphere-SQL: SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
  9. ShardingSphere-SQL: Actual SQL: ds0 ::: INSERT INTO employee ( id,name ) VALUES (?, ?) ::: [1514101126974214146, MJ2]
  10. ShardingSphere-SQL: Logic SQL: INSERT INTO employee ( id,name ) VALUES ( ?,? )
  11. ShardingSphere-SQL: SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
  12. ShardingSphere-SQL: Actual SQL: ds1 ::: INSERT INTO employee ( id,name ) VALUES (?, ?) ::: [1514101127502696449, MJ3]
  13. ShardingSphere-SQL: Logic SQL: INSERT INTO employee ( id,name ) VALUES ( ?,? )
  14. ShardingSphere-SQL: SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
  15. ShardingSphere-SQL: Actual SQL: ds0 ::: INSERT INTO employee ( id,name ) VALUES (?, ?) ::: [1514101127825657858, MJ4]
  16. ShardingSphere-SQL: Logic SQL: INSERT INTO employee ( id,name ) VALUES ( ?,? )
  17. ShardingSphere-SQL: SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
  18. ShardingSphere-SQL: Actual SQL: ds1 ::: INSERT INTO employee ( id,name ) VALUES (?, ?) ::: [1514101128157007873, MJ5]
  19. ShardingSphere-SQL: Logic SQL: INSERT INTO employee ( id,name ) VALUES ( ?,? )
  20. ShardingSphere-SQL: SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
  21. ShardingSphere-SQL: Actual SQL: ds0 ::: INSERT INTO employee ( id,name ) VALUES (?, ?) ::: [1514101128157007874, MJ6]
  22. ShardingSphere-SQL: Logic SQL: INSERT INTO employee ( id,name ) VALUES ( ?,? )
  23. ShardingSphere-SQL: SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
  24. ShardingSphere-SQL: Actual SQL: ds1 ::: INSERT INTO employee ( id,name ) VALUES (?, ?) ::: [1514101128475774977, MJ7]
  25. ShardingSphere-SQL: Logic SQL: INSERT INTO employee ( id,name ) VALUES ( ?,? )
  26. ShardingSphere-SQL: SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
  27. ShardingSphere-SQL: Actual SQL: ds0 ::: INSERT INTO employee ( id,name ) VALUES (?, ?) ::: [1514101128475774978, MJ8]
  28. ShardingSphere-SQL: Logic SQL: INSERT INTO employee ( id,name ) VALUES ( ?,? )
  29. ShardingSphere-SQL: SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
  30. ShardingSphere-SQL: Actual SQL: ds0 ::: INSERT INTO employee ( id,name ) VALUES (?, ?) ::: [1514101128815513602, MJ9]

【mysql【第一个数据源】 | 8.0.11,安装在本机 Windows 机器 】

  1. select * from employee

【mysql【第二个数据源】 | 5.7.16,安装在 192.168.16.128,CentOS 机器】

  1. select * from employee

查询数据-testSelect

运行 testSelect 方法,查看控制台日志,可以看到 ds0,ds1 两个节点都查询了数据

  1. ShardingSphere-SQL: Logic SQL: SELECT id,name FROM employee
  2. ShardingSphere-SQL: SQLStatement: MySQLSelectStatement(table=Optional.empty, limit=Optional.empty,lock=Optional.empty, window=Optional.empty)
  3. ShardingSphere-SQL: Actual SQL: ds0 ::: SELECT id,name FROM employee
  4. ShardingSphere-SQL: Actual SQL: ds1 ::: SELECT id,name FROM employee