资讯专栏INFORMATION COLUMN

springboot+mycat 分表分库

lakeside / 1569人阅读

摘要:而在分布式系统中,分表分库也是常用的一种解决此类瓶颈的手段。支持数据的多片自动路由与聚合,支持等常用的聚合函数支持跨库分页。支持通过全局表,关系的分片策略,实现了高效的多表查询。支持多租户方案。

前言

对于业务量越来越大的时候,单表数据超过几千万,甚至上亿时,一张表里面查询真的会很费时。而在分布式系统中,分表分库也是常用的一种解决此类瓶颈的手段。今天就选用springboot+mycat简单聊下。mycat官网:http://www.mycat.io/

什么是mycat?

  1. 一个彻底开源的,面向企业应用开发的大数据库集群
  2. 支持事务、ACID、可以替代MySQL的加强版数据库
  3. 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
  4. 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
  5. 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
  6. 一个新颖的数据库中间件产品

为什么要用mycat?

   支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQL语法
   遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理
   基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
   支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
   基于Nio实现,有效管理线程,解决高并发问题。
   支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。
   支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
   支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
   支持多租户方案。
   支持分布式事务(弱xa)。
   支持XA分布式事务(1.6.5)。
   支持全局序列号,解决分布式下的主键生成问题。
   分片规则丰富,插件化开发,易于扩展。
   强大的web,命令行监控。
   ...
   

centos7安装下载mycat

centos7安装mycat
安装mycat比较简单,我这边也详细说明一下:

 #下载: 
 wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
 #解压
 tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
 #授权
 chmod -R 777 mycat
 #环境变量添加:
 vi /etc/profile
 #在里面添加:
 export MYCAT_HOME=/crawler/mycat/mycat   ##自己的安装路径
 export PATH=$PATH:$MYCAT_HOME/bin  
 #使环境变量生效
 source /etc/profile
 #注意:
 #Linux 下部署安装 MySQL,默认不忽略表名大小写,需要手动到/etc/my.cnf 下配置:
 lower_case_table_names=1
 

前期准备
ps:mycat需要配置java_home ,就算安装了java如果没有配置java_home.还是会抛没有找到java_home的错,在此,我们检查一下有没有配置,若没有配置,请按以下步骤操作:

   A 确定java安装路径
      
  1. 终端输入:
     which java
   输出为:
     /usr/bin/java
  2. 终端输入:
     ls -lr /usr/bin/java
   输出为: 
      /usr/bin/java -> 
   3. 终端输入
       ls -lrt /etc/alternatives/java
    输出:    
       /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64/jre/bin/java

至此,我们确定java的安装目录为: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64

 B 配置JAVA_HOME

1. 打开配置环境变量的文件
vi /etc/profile
2. 添加以下配置:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

:wq保存退出。
3. 让配置生效
source  /etc/profile
4. 测试配置结果
echo $JAVA_HOME 

3.配置关键配置

a:配置schema.xml

  



 
   
             
      
   
     
     
           select user()  
             
                       
                 
    


b:配置rule.xml





    
       
           id
           mod-long
       
   
   
       
       2
   

c:配置server.xml





    
    0  
    0  

        2
       
         
    
    
        
        0
        
        
        
        
        
        
        
        
        0
        
            
        1

        
        1m

        
        1k

        0

        
        384m


        
        true


    
    
    
    
    
     
        123456 
        mycatDatabase  
        false
    


此时,我们运行mycat : mycat/bin/startup_nowrap.sh
如果是阿里云或者其他云服务器,需要把mycat的端口打开,默认端口是8066
此时,我们可以看一下日志:
mycat/logs/..

若没什么问题,那么就可以在springboot上做集成了
ps:我们必须在上面所涉及到的地方建两个库哦: 如上面我建的是db01 db02

springboot集成mycat
 spring:
  datasource:
    url: jdbc:mysql://www.iamcrawler.cn:8066/mycatDatabase?serverTimezone=Asia/Shanghai
    username: crawler
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

service

/**
 * create by liuliang
 * on 2019-07-30  17:16
 */
@Service
public class MycatUserService extends ServiceImpl {
    
    public List getUsers(){
        List list = this.list(new QueryWrapper<>());
        return list;
    }

}

controller

/**
 * create by liuliang
 * on 2019-07-30  17:17
 */
@RestController
@RequestMapping("/mycat/user")
public class MyCatUserController {

    @Autowired
    private MycatUserService userService;


    @PostMapping
    public ResponseEntity insertUser(@RequestBody MycatUser mycatUser){
        return ResponseEntity.ok(userService.save(mycatUser));
    }

    @GetMapping
    public ResponseEntity getUsers(){
        return ResponseEntity.ok(userService.getUsers());
    }

}

调试:这个时候我们启动程序,先后插入两条数据:

localhost:9090/mycat/user  post
 {
    "id":"10",
    "name":"zhangsan"
}
 localhost:9090/mycat/user  post
 {
    "id":"11",
    "name":"lisi"
}




数据库看的时候,发现已经进入了两个不同的库。
而我们查询的时候:

   localhost:9090/mycat/user  get
    [
    {
        "id": 11,
        "name": "lisi"
    },
    {
        "id": 10,
        "name": "zhangsan"
    }
]

可以看到是,数据都查询出来了,mycat分库生效

ps:如果各位有项目使用的是liquibase,那么与mycat集成的时候会抛错,原因是因为liquibase需要简历changelog表,而使用的库是mycatDatabase ,这个是mycat的连接,而不是真实数据库的连接...
github : https://github.com/iamcrawler...

最后,码字不易,转载复制请指明原创https://segmentfault.com/a/11...,违者必究...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75671.html

相关文章

  • 基于代理的数据库分库分表框架 Mycat实践

    摘要:文章共字,阅读大约需要分钟概述在如今海量数据充斥的互联网环境下,分库分表的意义我想在此处就不用赘述了。 showImg(https://segmentfault.com/img/remote/1460000017453449); 文章共 1796字,阅读大约需要 4分钟 ! 概 述 在如今海量数据充斥的互联网环境下,分库分表的意义我想在此处就不用赘述了。而分库分表目前流行的方案最起码...

    el09xccxy 评论0 收藏0
  • 题库分库分表架构方案

    摘要:个人博客地址方案项目背景在现在题库架构下,针对新购买的多道数据进行整合,不影响现有功能。数据切分尽量通过数据冗余或表分组来降低跨库的可能。 个人博客地址 https://www.texixi.com/2019/0... 方案 项目背景 在现在题库架构下,针对新购买的1300W多道数据进行整合,不影响现有功能。由于数据量偏多,需要进行数据的切分 目标场景 兼容旧的功能 对1300多W...

    kohoh_ 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<