springboot整合mysql+mycat中间件实现一主两从读写分离和分库分表

引言

读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。

第一种是依靠中间件(比如:MyCat),也就是说应用程序连接到中间件,中间件帮我们做SQL分离;
第二种是应用程序自己去做分离上一篇:springboot+mybatis+mybatis +mysql读写分离(AOP方式。

本例通过简单demo演示使用mycat中间件实现读写分离。

Mycat数据库分库分表中间件 简介

阿里大牛开发的开源免费产品,面向企业应用开发的大数据库集群 ;核心技术即使分表分片,我们不用在代码中配置很多数据源,只需要在mycat中就可以,增加节点很灵活,降低了和代码的耦合度;同时,这也是对分布式的数据库的支持,支持事务。
可以把mycat看作一个代理,根据负载均衡策略实现这样的分布式数据。

优先写入
备份
应用程序
mycat中间件
master1
master2
slave1
slave2
slave3
slave4

更多详细的介绍请看官网:http://www.mycat.io/
官网文档电子书:http://www.mycat.io/document/mycat-definitive-guide.pdf

一 mycat安装

官网下载1.6版本的解压,据说这个比较稳定,目录如下:

目录 说明
bin mycat命令,启动、重启、停止等
catlet catlet为Mycat的一个扩展功能
conf Mycat 配置信息,重点关注
lib Mycat引用的jar包,Mycat是java开发的
logs 日志文件,包括Mycat启动的日志和运行的日志

我们所有的配置都在conf下,重点时这三个文件

文件 说明
server.xml Mycat的配置文件,设置账号、参数等
schema.xml Mycat对应的物理数据库和数据库表的配置
rule.xml Mycat分片(分库分表)规则

下载后配置后环境变量:
然后以管理员执行命令如下:
springboot整合mysql+mycat中间件实现一主两从读写分离和分库分表_第1张图片
这个时候在计算机–>管理–>服务里边已经有了服务。

二 mysql 数据库准备一主二从

配置一个主库用来写,两个从库负责读,具体

类型 名称 数据库名称
localhost:3306 master1
localhost:3306 master2
从1 localhost:3310 master1
从1 localhost:3310 master2
从2 localhost:3320 master1
从2 localhost:3320 master2

一共开了三个服务,每个服务下有两个数据库,当人也可以把这些数据库放到不同的服务下,master1和master2时两个用来分片的数据库,将student表的信息,放到这两个库里,模拟水平切分数据库,当把数据插入到主库,从库会复制这些数据。
关于主从复制的详细配置,请移步mysql主从复制

  • 数据表 student
CREATE  TABLE student(
	id INT(10)  PRIMARY KEY  COMMENT 'id编号',
	NAME VARCHAR(200) DEFAULT '无' COMMENT '姓名',
	age INT(3) COMMENT '年龄',
	address VARCHAR(200) COMMENT '地址'
)

以上就是数据库先准备的

三 mycat相关配置

1 server.xml

mybat已经包含了很多关于系统的配置,这里配置用户名和密码和逻辑数据库名,在springboot中连接的就是这个作为数据源。

  • schemas: 逻辑数据库名,这里会和schema.xml中的配置关联,多个用逗号分开
 
	 
		123456 
		mycatDatabase  
		false
	
2 schemas.xml

Mycat对应的物理数据库和数据库表的配置

  • schema 是第一个,与server.xml配置的名称相对应
  • table 里表明student 表,主键是id,有两个dataNode节点,这两个节点是用来水平分片的,规则就是rule定义的ruleById.
  • dataNode节点标明物理数据库和物理主机
  • dataHost 设置具体的数据库
  • balance属性
    • balance=”0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上
    • balance=”1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡
    • balance=”2”,所有读操作都随机的在 writeHost、 readhost 上分发。
    • balance=”3”, 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力
  • writeType 设置 写入方式的,负载均衡方式可以设置

	
		  
      
	  
      
            select user()  
              
				  
				   				
			
    	

 
  
3 rule.xml

table中的rule属性对应的就是rule.xml文件中tableRule的name,具体有哪些分表和分库的实现,建议还是看下文档。我这里选择的mod-long就是将数据平均拆分。因为我后端是两台物理库,所以rule.xml中mod-long对应的function count为2。


		
			id
			mod-long
		
	
	 
        
       2
    

四 springboot 代码

1 properties文件

只有这一个配置,其他的就和我们平时使用的没什么区别了

[email protected]@
[email protected]@
mybatis.mapperLocations=classpath:mybatis/*.xml
##设置全局的日志级别,如果没有设置,以log4j2.xml配置的root 的level 为准
logging.level.root=info
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=xudong
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:8066/mycatDatabase
2. 其他代码就省略了,用swagger测试

已经实现了读写分离和分库分表
完整代码地址: https://gitlab.com/xudong90/springboot_mycat

问题:在这里插入图片描述

启动的时候出现的,最后降低了MySQL的版本号,没事了
springboot整合mysql+mycat中间件实现一主两从读写分离和分库分表_第2张图片

你可能感兴趣的:(mycat,f分布式数据库,读写分离,分库分表,mybatis,springboot,mysql,mycat)