开发者

ShardingSphere之读写分离方式

目录
  • ShardingSphere-读写分离
    • 读写分离
    • mysql主从集群
    • 创建 user 表
      • 主节点执行见表语句
    • 项目代码
      • 读写分离配置
        • 测试结果
          • 新增测试
          • 删除测试
          • 查询测试
      • 总结

        ShardingSphere-读写分离

        读写分离

        • 依赖于 MySQL的主从集群 搭建手册
        • 查询 走的是从库(Slave)
        • 新增、更新、删除走的是主库(Master)

        MySQL主从集群

        节点角色主机地址端口用户名密码库名
        master192.168.40.1283306rootRoot@123456db_demo
        slave192.168.40.1293306rootRoot@123456db_demo

        创建 user 表

        主节点执行见表语句

        CREATE TABLE `user`  (编程客栈
          `id` bigint NOT NULL,
        	`client_id` bigint NOT NULL,
          `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
          `age` int NULL DEFAULT NULL,
          PRIMARY KEY (`id`) USING BTREE
        ) ENGINE = InnoDBybIguB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

        ShardingSphere之读写分离方式

        从节点刷新查看

        ShardingSphere之读写分离方式

        项目代码

        复用之前的 user 表操作代码即可

        读写分离配置

        application.yml

        # 主从配置  读写分离
        server:
          port: 8081
        
        spring:
          main:
            # 一个实体类对应两张表,覆盖
            allow-bean-definition-overjsriding: true
          shardingsphere:
            datasource:
              names: m1,s1 # 主库 从库
              m1:
                type: com.alibaba.druid.pool.DruidDataSource
                driver-class-name: com.mysql.cj.jdbc.Driver
                url: jdbc:mysql://192.168.40.128:3306/db_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
                username: root
                password: Root@123456
              s1:
                type: com.alibaba.druid.pool.DruidDataSource
                driver-class-name: com.mysql.cj.jdbc.Driver
                url: jdbc:mysql://192.168.4http://www.devze.com0.129:3306/db_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
                username: root
                password: Root@123456
            sharding:
              tables:
                user:
                  # 分表策略  固定分配到主库的user表 即 m1.user
                  actual-data-nodes: m1.user
              # 主库从库规则定义
              master-slave-rules:
                m1:
                    # 主库
                    master-data-source-name: m1
                    # 从库
                    slave-data-source-names: s1
            props:
              # 打印SQL日志
              sql:
                show: true
        

        测试结果

        新增测试

        • 测试类代码
        @Test
        void insert() {
             for (int i = 0; i < 5; i++) {
                 User user = new User();
                 user.setId(i + 1);
                 user.setName("user_" + user.getId());
                 user.setCandroidlientId(10000);
                 user.setAge(18 + i);
                 userMapper.insert(user);
             }
         }
        • 运行结果

        操作的必须是主库 对应的数据源 m1

        ShardingSphere之读写分离方式

        主库查看

        ShardingSphere之读写分离方式

        从库查看

        ShardingSphere之读写分离方式

        更新测试修改前

        ShardingSphere之读写分离方式

        • 测试类代码

        修改 id=5 的记录的 name, user_5 => Tom

        @Test
         void update() {
             User user = new User();
             user.setId(5);
             user.setName("Tom");
             userMapper.updateById(user);
         }
        • 运行结果

        操作的必须是主库 对应的数据源 m1

        ShardingSphere之读写分离方式

        查看主库

        ShardingSphere之读写分离方式

        查看从库

        ShardingSphere之读写分离方式

        删除测试

        删除 id=5 的记录

        • 测试代码
        @Test
        void delete() {
            userMapper.deleteById(5);
        }
        • 运行结果

        操作的必须是主库 对应的数据源 m1

        ShardingSphere之读写分离方式

        查看主库

        ShardingSphere之读写分离方式

        查看从库

        ShardingSphere之读写分离方式

        查询测试

        指定ID查询,查找id为 2、3 的记录

        • 测试代码
        @Test
        void selectById() {
            List<User> list = userMapper.selectList(new QueryWrapper<User>().in("id", 2, 3));
            System.out.println(jsONArray.toJSONString(list));
        }
        • 运行结果

        操作的必须是从库 对应的数据源 s1

        ShardingSphere之读写分离方式

        总结

        • 完美的诠释了 读写分离
        • 验证了 MySQL主从集群的正确性
        • 新增、更新、删除 都 操作主库 且 同步到从库
        • 查询 只能操作 从库

        以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

        0

        上一篇:

        下一篇:

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        最新开发

        开发排行榜