Mycat 读写分离+分库分表

上次进过GTID复制的学习记录,已经搭建好了主从复制的服务器,现在利用现有的主从复制环境,加上正在研究的Mycat,实现了主流分布式数据库的测试

Mycat就不用多介绍了,可以实现很多分布式数据库的功能,极大的减轻数据库服务器的压力,包括读写分离以及分库分表,本测试对这两种功能都进行了测试,进行相应记录

本文以Mycat官方给出的例子来进行解释总结

首先来看分库分表,分库分表一般来说都是一起说的,但是实际上分库跟分表是有区别的,简单来说有垂直和水平两种方式,垂直就是将表按字段进行拆分,水平就是将表按照数据分布来做行拆分。具体的肯定还是有区别,本文不再进行阐述,主要介绍按照字段的分布进行数据行的拆分

本身理解来说Mycat实现的应该是分库,也就是将一个表的行分开存储到不同的数据库中,这里不同的数据库可以有一下两种

1)不同的数据库服务器上的 两个数据库(此时db的名字可以相同,也可以不同)

2)相同的数据库服务器上的两个数据库(此时db的名字肯定是不同的)

当然对于实际使用分库来说肯定是使用不同的数据库服务器的,而且大多数都是在不同的服务器上使用相同的名字,这样能够比较正式的做法

分表的关键部分在mycat的配置文件schema.xml中,该文件中定义了数据库服务器,表的拆分规则等等重要信息

<table name="employee" primaryKey="ID" dataNode="dn1,dn2"  rule="sharding-by-intfile" />

以该配置为例,在mycat的逻辑数据库中定义employee表,主键是ID字段,分表规则是sharding-by-intfile,该规则可以在rule.xml中找到对应的信息,而拆分的数据节点是dn1和dn2,数据节点是mycat的概念,再来看看dn1 和dn2 的配置

<dataNode name="dn1" dataHost="localhost1" database="db1" />

<dataNode name="dn2" dataHost="localhost2" database="db1" />

当然上面的配置是在将employee表的数据分配到两个数据库服务器上分别是localhost1和localhost2

同样也可以如下配置

<dataNode name="dn1" dataHost="localhost1" database="db1" />

<dataNode name="dn2" dataHost="localhost1" database="db2" />

这样的配置就在localhost1上建立两个数据库分别是db1和db2,将数据存在同一个数据库实例上的两个数据库上,同样属于分库分表

本文以正式运维环境进行配置,此处的dataHost是不同的,所以是不同的数据库服务器,而指向这两个数据库服务器的db名字是相同的,均为db1

再看dataHost的配置,这里就涉及到具体数据库服务器的配置了

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="ip1:3003" user="root"
password="123">
</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>
<writeHost host="hostM1" url="ip2:3009" user="root"
password="123">
</writeHost>

</dataHost>

这里的配置还没有加入读写分离,所以下面会介绍读写分离的配置,上面的配置就具体执行了两台的数据库服务器来做分库

这样一个表的分库就配置好了,Mycat会根据对应的rule规则和具体的sql语句进行路由处理,包括数据分库存储和数据分库获取等等

下面来看看读写分离,说到读写分离就必须存在主从复制的环境,需要先配置好主从复制,同样是在schema.xml中对主服务器和从服务器进行相应的配置即可

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="ip1:3003" user="root"
password="123">
<readHost host="hostS1" url="ip2:3009" user="root"
  password="123"/>
</writeHost>
</dataHost>

此时在writeHost在配置对应的readHost,注意readHost是附属在writeHost下的,再去设置balance的值,至于balance的取值0,1,2网上有很多资料,分别用来指定哪几个host能参与到数据库的读操作中,上面的配置是单独的一个写服务器的读写分离实例,这样会表示写操作会通过ip1:3003的服务器,而读操作会通过ip2:3009的服务器,这就是最基本的读写分离配置,注意上面的配置只有一个dataHost,就是说明没有分库分表的特点

下面来看一下分库分表+读写分离,实际上也就是利用Mycat提供的功能,将两种特性都写入schema.xml中,达到同时具有分表+读写分离的需求
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="ip1:3003" user="root"
password="123">
<readHost host="hostS1" url="ip2:3009" user="root"
  password="123"/>
</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>
<writeHost host="hostM1" url="ip3:3003" user="root"
password="123">
</writeHost>

</dataHost>

显然总结一下:

1  有多个dataHost,就说明有分库分表的设置

2  在一个dataHost中有readHost在writeHost下,或者有多个writeHost,而且balance不等于0(0代表没有读写分离),就说明有读写分离的设置,

3  在一个dataHost中有多个writeHost,这些writeHost之间必须是主主复制,这样才能保证及时两次写操作分别用不同的writeHost,也能保证两个Host数据一致的情况

再对分库分表+读写分离的配置进行一点测试记录,因为这种配置是最常见的,在实际中ip1和ip2是主从关系,假设localhost1对应db1,localhost2对应db2

这样ip1和ip2中存储了db1的分片数据,ip3中存储了db2的分片数据

在写操作的时候,mycat会将对应数据写入ip1,通过主从通过到ip2, 另一部分数据写入ip3

在读操作的时候,mycat会从ip2和ip3中获取对应数据合并后返回客户端(假设是获取表所有数据),

假设在此时在ip2上新增数据,因为mycat要求写入的数据必须符合对应表的rule规则,比如rule设置了id字段只能取值10000和10010(mycat的例子),所以通过mycat是无法写入20000的值的,但是如果此时直接在ip2上写入20000,再select是可以读出来这条不合理的数据的,这也证明了mycat的读写分离功能

在实际运用中,应该是设置好有部分的数据库服务器是用来作为分库分表服务器的,有部分数据库服务器则是用来作为读服务器的

也就是说在不同dataHost中的writeHost之间是没有关系的,只负责保存分配到本地的数据记录,而不同dataHost之间的readHost之间也是没有关系的,只负责同步对应writeHost的数据(既然writeHost都没关系,readHost肯定是没关系的)

在本文的测试中,由于服务器数量肯定达不到要求,在测试中实际上是这样的在本地有3003和3009两个Mysql服务实例,代表两个数据库服务器(在IO上存在竞争)

db1 -  writeHost (3003) - readHost(3009)

db2 -  writeHost(3009)

在这种配置下,3003服务器上只需要有db1的数据库即可,3009服务器上需要有db2的数据库(用来作为writeHost),同样因为需要作为3003服务器的从服务器,所有需要有db1的数据库

假设写入的数据为(1,‘Rod‘, 10000), (2, ‘Whu‘, 10010) 根据employee表在sharding_id字段上分片规则,Rod数据会存在db1中,Whu数据会存在db2中

这样在写入的时候如下过程:

(1,‘Rod‘, 10000) -Mycat -  3003  db1 -- 主从同步  --  3009 db1

(2, ‘Whu‘, 10010)  -Mycat -  3009  db2

在读取的时候如下过程:

3009 db1 -  (1,‘Rod‘, 10000) -  Mycat   ,因为配置了读写分离,所以会db1 -  writeHost (3003) - readHost(3009)配置的readHost去获取数据

3009 db2 -  (2,‘Whu‘, 10010) -  Mycat

当然也可以在3009的db1数据库中加入新的数据,这样通过mycat去获取的时候也会包括这条新数据

本文主要是在测试Mycat的读写分离和分库分片后进行的知识点记录,后续需要更多的使用Mycat工具,运用到实际开发。

原文地址:https://www.cnblogs.com/wangzhuxing/p/8520216.html

时间: 2024-08-04 20:03:10

Mycat 读写分离+分库分表的相关文章

MyCat实现读写分离+分库分表+全局表

前言 mycat功能强大,配置简单,作为数据库中间件,是一个非常优秀的开源产品,关于MyCat的部署安装,可以参考博文:MyCat部署安装. 本博文将展示mycat的如下功能: 读写分离: 分库分表: 全局表: 环境如下: 系统 IP 主机名 服务 Centos 7.5 192.168.20.2 mysql01 MySQL 5.7.24 Centos 7.5 192.168.20.3 mysql02 MySQL 5.7.24 Centos 7.5 192.168.20.3 mysql03 MyS

mycat基础实验之主从配置读写分离和分表

mycat实验之主从配置读写分离和分表 架构图: 1.实验环境: vmware虚机3个   (虚机太少了,电脑有点吃力,3个虚机只能达到基本的测试) 系统centos7     (实验是关闭防火墙和selinux做的) mysql版本5.7 mycat版本1.6 虚机名字和ip: mysql1 192.168.211.138 mysql2 192.168.211.139 mysql3 192.168.211.142 mycat安装在mysql1(192.168.211.138) 这台主机须能够解

(转)学会数据库读写分离、分表分库——用Mycat,这一篇就够了!

原文:https://www.cnblogs.com/joylee/p/7513038.html 系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了.希望通过这篇文章的介绍,能学会Mycat的使用. 安装 Mycat官网:http://www.mycat.io/可以了解下Mycat的背景和应用情况

学会数据库读写分离、分表分库——用Mycat

系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了.希望通过这篇文章的介绍,能学会Mycat的使用. 安装 Mycat官网:http://www.mycat.io/可以了解下Mycat的背景和应用情况,这样使用起来比较有信心. Mycat下载地址:http://dl.mycat.io/官网有个文档

转:开源数据库中间件MyCat实现数据库读写分离、分表分库指南

系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了.希望通过这篇文章的介绍,能学会Mycat的使用. 安装 Mycat官网:http://www.mycat.io/可以了解下Mycat的背景和应用情况,这样使用起来比较有信心. Mycat下载地址:http://dl.mycat.io/官网有个文档

数据库读写分离、分表分库——用Mycat

系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了.希望通过这篇文章的介绍,能学会Mycat的使用. 安装 Mycat官网:http://www.mycat.io/可以了解下Mycat的背景和应用情况,这样使用起来比较有信心. Mycat下载地址:http://dl.mycat.io/官网有个文档

重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库与分表等.这篇文章主要讲述数据库分库与分表 (1)业务拆分 在?大型网站应用之海量数据和高并发解决方案总结一二?一篇文章中也具体讲述了为什么要对业务进行拆分. 业务起步初始,为了加快应用上线和快速迭代,很多应用都采用集中式的架构.随着业务系统的扩大,系统变得越来越复杂,越来越难以维护,开发效率变得越

MYSQL数据库性能调优之七:其他(读写分离、分表等)

一.分表 水平划分 垂直划分 二.读写分离 三.选择合理的数据类型 特别是主键 四.文件.图片等大文件使用文件系统存储 五.数据库参数配置 注意:max_connections最大连接数一般设置在1000左右 最大到2000就到极限了query_cache_size查询缓存大小 六.合理的硬件资源和操作系统

分库分表之Mycat实现

分库分表之Mycat实现 使用分库分表的前提: 当你们的数据库表数据特别大时,比如说上亿的记录,数据库本身的优化基本上无法解决性能问题了,根本原因是数据库本身的io读写到了一个瓶颈,这个时候,需要海量数据的存储和查询问题.此时我们需要利用分库分表的思想去进行数据库的架构优化.随着微服务这种架构的兴起,我们应用从一个完整的大的应用,切分为很多可以独立提供服务的小应用.每个应用都有独立的数据库.  什么是Mycat? 一个彻底开源的,面向企业应用开发的“大数据库集群” ·支持事务.ACID.可以替代