Mycat(实践篇 - 基于PostgreSQL的水平切分、主从复制、读写分离)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 写在前面  Mycat作为独立的数据库中间件,我们只需要进行相关的配置,就可以非常方便的帮我们实现水平切分、垂直切分、读写分离等功能,但PostgreSQL的主从复制需要我们通过其它方式实现。

写在前面

  Mycat作为独立的数据库中间件,我们只需要进行相关的配置,就可以非常方便的帮我们实现水平切分、垂直切分、读写分离等功能,但PostgreSQL的主从复制需要我们通过其它方式实现。这里假设我们已经搭建好相关的环境,下面就开始我们的实践吧!

准备环境

  • PostgreSQL(Version : 10.1)主从环境搭建
  • 对应数据库建立(以下例子中使用的都是默认存在的postgres数据库,可以不用额外添加)

配置server.xml

         
                postgresmycat
                postgresmycats
        

配置schema.xml

        
                
select user select user

dbDriver 属性

  指定连接后端数据库使用的 Driver,目前可选的值有 native 和 jdbc。使用 native 的话,因为这个值执行的
是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持

引述《Mycat权威指南》里面的原话:

从 1.6 版本开始支持 postgresql 的 native 原始协议。
如果使用 JDBC 的话需要将符合 JDBC4 标准的驱动 JAR 包放到 MYCAT\lib 目录下,并检查驱动 JAR 包中
包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的 Driver 类名,例如:
com.mysql.jdbc.Driver。

  所以,具体的解决方案就是找一个postgresql的jar包,然后丢到mycat的lib目录下,不然就会出现启动失败或者连接不到postgre数据库的异常情况。本例中用到的jar包是:postgresql-42.1.4.jar

配置rule.xml

       
                
                        id
                        mod-long
                
        
       
                
                        user_id
                        mod-long
                
        

        
            2
        

  修改了配置文件后,别忘了重启Mycat,如果有异常出现,请通过查看logs目录下的日志文件进行排查。

项目搭建(SpringBoot + JPA)

  • 准备:首次建表,设置application.yml中的spring.jpa.hibernate.ddl-auto属性为:create(JPA自动建表解决方案,使用update的话在连接mycat的时候会报找不到表的错误)。之后似乎必须更改为:none,否则使用其它属性都会报错(这里Mysql与PostgreSQL不同,似乎是一个未解决的bug,这也就意味着以后新增字段都要手动连上数据库进行添加了...)

  • 添加application.yml(注意了,这里都是用连mysql的方式去配置,Mycat会在后端做好对其它数据库的连接):

spring:
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
      naming:
        strategy: org.hibernate.cfg.ImprovedNamingStrategy
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5Dialect
  datasource:
    url: jdbc:mysql://localhost:8066/postgresmycats?characterEncoding=UTF-8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=true
    username: postgresmycat
    password: postgresmycat
  • 添加User Entity
@Entity
@Table(name = "tb_user")
@Data
public class User {

    @Id
    private Long id;

    private String name;

    private Integer gender;

}
  • 添加Student Entity
@Entity
@Table(name = "tb_student")
@Data
public class Student {

    @Id
    private Long id;

    private String name;

    @Column(unique = true)
    private Long userId;

}
  • 添加UserDao
public interface UserDao extends JpaRepository {

    Page findByNameLike(String name, Pageable pageable);

}
  • 添加StudentDao
public interface StudentDao extends JpaRepository {

    Page findByNameLike(String name, Pageable pageable);

}

项目测试

  1. 测试添加
@Test
public void testAdd() {
        for (long i = 0; i < 30; i++) {
            User user = new User();
            user.setId(i);
            user.setName("李四" + i);
            user.setGender(i % 2 == 0 ? 1 : 0);
            userDao.save(user);

            Student student = new Student();
            student.setId(System.currentTimeMillis() + i);
            student.setName("李四学生" + i);
            student.setUserId(i);
            studentDao.save(student);
        }
}

测试结果:数据按id取模的方式划分到了两个数据库中,同时从库同步了主库的数据

水平切分(id取模)
水平切分(id取模)
  1. 测试模糊查询+分页
@Test
public void testFind() {
        Pageable pageable = new PageRequest(0, 10, Sort.Direction.ASC, "id");
        List userList = userDao.findByNameLike("%李四1%", pageable).getContent();
        userList.forEach(System.out::println);

        Pageable pageable2 = new PageRequest(0, 10, Sort.Direction.ASC, "userId");
        List studentList = studentDao.findByNameLike("%李四学生2%", pageable2).getContent();
        studentList.forEach(System.out::println);
}

测试结果:按照模糊匹配及id升序的方式输出结果

测试模糊查询+分页
测试模糊查询+分页

测试结果:读操作都走了从库

读写分离,读都走了从库
读写分离,读都走了从库
  1. 删除及修改请自行测试

Mycat系列

Mycat(入门篇)
Mycat(配置篇)
Mycat(实践篇 - 基于Mysql的水平切分、主从复制、读写分离)
Mycat(实践篇 - 基于PostgreSQL的水平切分、主从复制、读写分离)

参考链接

Mycat官网
Mycat从零开始
Mycat权威指南
GitHub:Mycat-Server
Wiki:Mycat-Server
Issues:Mycat-Server
mysql中间件研究(Atlas,Cobar,TDDL)
mysql中间件研究(Atlas,Cobar,TDDL,Mycat,Heisenberg,Oceanus,Vitess,OneProxy)

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
存储 SQL 关系型数据库
数据库魔法师:使用ShardingSphere实现MySQL读写分离与分片指南跟着爆叔的节奏稳了!
数据库魔法师:使用ShardingSphere实现MySQL读写分离与分片指南跟着爆叔的节奏稳了!
150 0
|
7月前
|
SQL 关系型数据库 MySQL
Mycat【Mycat高级特性_搭建双主双从、Mycat分片技术_垂直拆分-分库 】(四)-全面详解(学习总结---从入门到深化)
Mycat【Mycat高级特性_搭建双主双从、Mycat分片技术_垂直拆分-分库 】(四)-全面详解(学习总结---从入门到深化)
107 0
|
6月前
|
SQL 关系型数据库 MySQL
MySQL高可用架构设计:从主从复制到分布式集群
MySQL高可用性涉及主从复制、半同步复制和Group/InnoDB Cluster。主从复制通过二进制日志同步数据,保证故障时可切换。半同步复制确保事务在至少一个从服务器确认后才提交。Group Replication是多主复制,支持自动故障切换。InnoDB Cluster是8.0的集成解决方案,简化集群管理。使用这些技术能提升数据库的稳定性和可靠性。
548 2
|
XML SQL 负载均衡
MyCat - 高级 - 读写分离 - 一主一从读写分离配置 | 学习笔记
快速学习MyCat - 高级 - 读写分离 - 一主一从读写分离配置
MyCat - 高级 - 读写分离 - 一主一从读写分离配置 | 学习笔记
聊聊MySQL架构演进:从主从复制到分库分表
业务飞速发展导致数据规模急速膨胀,单机的数据库已经无法满足互联网业务的发展。 传统的将数据集中存储单一数据结节的方案,在容量、性能、可用性和可维护性方面已经难以满足互联网海量数据的场景。
|
SQL 存储 算法
【MySQL调优、分库分表、读写分离、高可用】
【MySQL调优、分库分表、读写分离、高可用】
247 0
|
SQL 存储 关系型数据库
MySQL-主从架构探索
MySQL-主从架构探索
113 0
|
SQL 存储 缓存
数据库主从复制,读写分离,分库分表理解 (数据库架构演变)
数据库主从复制,读写分离,分库分表理解 (数据库架构演变)
数据库主从复制,读写分离,分库分表理解 (数据库架构演变)
|
关系型数据库 MySQL 分布式数据库
Mycat分布式数据库架构解决方案--Mycat实现数据库分表
Mycat分布式数据库架构解决方案--Mycat实现数据库分表
101 0
Mycat分布式数据库架构解决方案--Mycat实现数据库分表
|
关系型数据库 MySQL 分布式数据库
Mycat分布式数据库架构解决方案--Mycat实现读写分离
Mycat分布式数据库架构解决方案--Mycat实现读写分离
215 0
Mycat分布式数据库架构解决方案--Mycat实现读写分离