Mycat操作Mysql数据库分片

什么是数据库分片

简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。
数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。
(1)一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分
在这里插入图片描述
(2)另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。
在这里插入图片描述

如何实现数据库分片

当数据库分片后,数据由一个数据库分散到多个数据库中。此时系统要查询时需要切换不同的数据库进行查询,那么系统如何知道要查询的数据在哪个数据库中?当添加一条记录时要向哪个数据库中插入呢?这些问题处理起来都是非常的麻烦。
这种情况下可以使用一个数据库中间件mycat来解决相关的问题。接下来了解一下什么是mycat。

什么是Mycat?

Mycat提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在。
在这里插入图片描述

Mycat的分片策略

在这里插入图片描述

  1. 逻辑库(schema) :通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。所以我们在开发中,就只需要操作逻辑库就好。
  2. 逻辑表(table):既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
    分片表:是指那些原有的很大数据的表,需要切分到多个数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。 总而言之就是需要进行分片的表。
    非分片表:一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。
  3. 分片节点(dataNode):数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode)。一个节点就对应一个数据库。
  4. 节点主机(dataHost) :数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。
  5. 分片规则(rule) :前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。
Mycat的下载及安装

jdk:要求jdk必须是1.7及以上版本
Mysql:推荐mysql是5.5以上版本
Mycat:
Mycat的官方网站:http://www.mycat.org.cn/
下载地址:https://github.com/MyCATApache/Mycat-download
安装步骤(这里是linux下的安装):
第一步:下载Mycat-server-xxxx-linux.tar.gz
第二步:将压缩包解压缩。建议将mycat放到/usr/local/mycat目录下。
第三步:进入mycat目录,启动mycat:./mycat start
停止: ./mycat stop
mycat 支持的命令{ console | start | stop | restart | status | dump }
Mycat的默认端口号为:8066(mysql是3306)

Mycat分片的测试
  1. 准备两个安装了mysql的linux系统:
    Host1:192.168.25.132(创建两个数据库:db1,db3)
    Host2:192.168.25.134(创建一个数据库:db2)
    其中,在Host1上安装Mycat,所以需要在Host1上面安装jdk
    在这里插入图片描述
  2. 配置Mycat中的schema.xml配置文件
    Schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析:
    1、schema 标签用于定义MyCat实例中的逻辑库
    2、Table 标签定义了MyCat中的逻辑表
    3、dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。
    4、dataHost标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句
    5、修改schema.xml(在mycat/conf目录下):
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

	<schema name="e3mall" checkSQLschema="false" sqlMaxLimit="100">
		<!-- auto sharding by id (long) -->
		<table name="tb_item" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
	</schema>
	
	
	<dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost2" database="db2" />
	<dataNode name="dn3" dataHost="localhost1" database="db3" />
	
	
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="hostM1" url="192.168.25.132:3306" user="root"
			password="123456">
			<!-- can have multi read hosts -->
		</writeHost>
		
	</dataHost>
	
	<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="hostM1" url="192.168.25.134:3306" user="root"
			password="123456">
			<!-- can have multi read hosts -->
		</writeHost>
	</dataHost>
</mycat:schema>

1)、通过schema标签来定义一个逻辑库:e3mall
2)、通过teble标签定义一个逻辑表:tb_item,分片到是三个节点上dn1,dn2,dn3,分片规则是mycat默认的一个值auto-sharding-long,也可以自己定义分片规则,在与schema.xml同级的rule.xml中配置,auto-sharding-long这个规则表示通过id的值的范围进行分片,一个节点中最多只能存放5000000条数据
3)、通过dataNode标签来定义三个节点,分别指定节点所在的服务器的ip以及对应的数据库名称
4)、通过dataHost标签来指明节点中的mysql数据库的地址,用户名和密码,里面的writeHost标签一般只配置一个就好

6、修改server.xml(与schema.xml同级)

<user name="user">
		<property name="password">user</property>
		<property name="schemas">e3mall</property>
	</user>

里面的user标签只留下一个即可,是配置连接逻辑库的用户名和密码

测试

可以通过mysql的连接工具,直接连接逻辑库

在这里插入图片描述
在mycat这个连接上,使用sql语句创建一个表tb_item,则db1,db2,db3中都有了这一个表,所以我们开发就只需要对mycat这个连接,把他当做一个数据库操作即可

在mycat这个连接上,使用insert语句往tb_item表中插入一些数据,当插入的记录的id的值小于5000000时,数据都是插入了db1中的tb_item表,
当id的值是5000001~10000000,数据都是插入了db2中的tb_item表,
当id的值是10000001~15000000,数据都是插入了db3中的tb_item表
当id的值大于15000000时,就不能插入了,此时需要增加节点。
这就是auto-sharding-long这个分片规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值