网站首页 > java教程 正文
一、什么是Mycat
它是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的的
Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生(Native)协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。
常见的应用场景:
- 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换;
- 分表分库,对于超过 1000 万的表进行分片,最大支持 1000 亿的单表分片;
二、SpringBoot+Mycat+MySQL实现分表分库案例
关于分库分表,Mycat已经帮我们在内部实现了路由的功能,我们只需要在Mycat中配置以下切分规则即可,对于开发者来说,我们就可以把Mycat看做是一个数据库,接下来我们开始搭建环境:
步骤一:
Mycat是使用java写的数据库中间件,所以要运行Mycat前要准备要jdk的环境,要求是jdk1.7以上的环境。所以需要在系统中配置JAVA_HOME的环境变量.
步骤二:
从官网下载Mycat,
http://dl.mycat.io/1.6-RELEASE/ 我们是基于CentOS7来搭建Mycat环境的,所以下载版本:
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
步骤三:
将下载好的安装包上传到服务器上并解压.解压之后目录结构如下:上传到/usr/local/目录下
解压命令:
解压结果:
步骤四:
配置切分规则:
将如下配置复制粘贴覆盖mycat/conf/schema.xml的内容。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="user" primaryKey="id" dataNode="dn01,dn02" rule="rule1" />
</schema>
<!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->
<dataNode name="dn01" dataHost="dh01" database="db01" />
<dataNode name="dn02" dataHost="dh01" database="db02" />
<!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->
<dataHost name="dh01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="server1" url="10.58.5.25:3306" user="root" password="1234"/>
</dataHost>
</mycat:schema>
<schema>:表示的是在mycat中的逻辑库配置,逻辑库名称为:TESTDB
<table>:表示在mycat中的逻辑表配置,逻辑表名称为:user,映射到两个数据库节点dataNode中,切分规则为:rule1(在rule.xml配置)
<dataNode>:表示数据库节点,这个节点不一定是单节点,可以配置成读写分离.
<dataHost>:真实的数据库的地址配置
<heartbeat>:用户心跳检测
<writeHost>:写库的配置
将如下配置复制粘贴覆盖mycat/conf/rule.xml的内容。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
</mycat:rule>
这里定义的是切分规则,是按照id列进行切分,切分规则是采取取模的方式,
<property name="count">2</property>:这里配置了我们有拆分了多个库(表),需要和前面配置
<table name="user" primaryKey="id" dataNode="dn01,dn02" rule="rule1" />
中的dataNode个数一致,否则会出错.
步骤五:
在数据库中创建两个数据库db01,db02
每个库中执行如下建表语句:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
步骤六:
启动mycat,执行./mycat start
步骤七:
搭建SpringBoot环境,执行插入语句.
application.properties配置如下:
spring:
datasource:
#配置数据源
driver-class-name: com.mysql.jdbc.Driver
#这里配置的是Mycat中server.xml配置的账号密码,不是数据库的密码
username: root
password: 123456
#mycat的逻辑库 端口也是mycat的
url: jdbc:mysql://10.112.3.9:8066/TESTDB
UserController.java代码如下:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserServiceI userServiceI;
@RequestMapping("save")
public String save(User user){
userServiceI.insert(user);
return "保存成功";
}
@RequestMapping("findAll")
public List<User> findAll(){
return userServiceI.selectAll();
}
}
步骤八:
测试:
在地址栏输入:
http://localhost:8082/user/list
是可以看到刚刚插入的两条记录.
好到这一步我们就已经完成了分表分库了.
- 上一篇: UP主分销系统平台化升级与演进
- 下一篇: Java面试题专集--HashMap
猜你喜欢
- 2025-04-24 Java面试题专集--HashMap
- 2025-04-24 UP主分销系统平台化升级与演进
- 2025-04-24 HashMap实现原理一步一步分析(1-put方法源码整体过程)
- 2025-04-24 HashMap和HashTable的区别
- 2025-04-24 全网讲解最透彻:HashMap&ConcurrentHashMap总结 等你来看
- 2025-04-24 面试:说一下HashMap的底层实现原理,我懵了
- 2025-04-24 腾讯二面:1G内存如何对40亿QQ号去重?#腾讯二面
- 2025-04-24 面试官 : 你能说清楚 Redis 哈希槽和一致性哈希的要点吗?
- 2025-04-24 HashMap 底层源码分析
- 2025-04-24 Java常用类库与技巧
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)