cobar mysql 水平切分_Mycat(实践篇 - 基于Mysql的水平切分、主从复制、读写分离)...

写在前面

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

准备环境

Mysql(Version : 5.7)主从环境搭建

对应数据库建立(以下例子中要建的数据库是:master1mycat 和 master2mycat)

配置server.xml

mysqlmycat

mysqlmycats

配置schema.xml

select user()

select user()

配置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的时候会报找不到表的错误)。为保证数据不被丢失,在建表之后可以更改为:update

添加application.yml:

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/mysqlmycats?characterEncoding=UTF-8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=true

username: mysqlmycat

password: mysqlmycat

添加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);

}

项目测试

测试添加

@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 ? 0 : 1);

userDao.save(user);

Student student = new Student();

student.setId(System.currentTimeMillis() + i);

student.setName("张三学生" + i);

student.setUserId(i);

studentDao.save(student);

}

}

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

8c4ec2b6f9d8c63d952ec93f6381e162.png

水平切分(id取模)

测试模糊查询+分页

@Test

public void testFind() {

Pageable pageable = new PageRequest(0, 10, Sort.Direction.DESC, "id");

List userList = userDao.findByNameLike("%张三2%", pageable).getContent();

userList.forEach(System.out::println);

Pageable pageable2 = new PageRequest(0, 10, Sort.Direction.DESC, "userId");

List studentList = studentDao.findByNameLike("%张三学生1%", pageable2).getContent();

studentList.forEach(System.out::println);

}

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

cf0649337d93d53a9370884d1be65789.png

测试模糊查询+分页

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

e6b5b1a2ae85e5697ff6eb10ea4971a6.png

读写分离,读都走了从库

删除及修改请自行测试

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值