上次进过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工具,运用到实际开发。

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

  1. Mycat安装并实现mysql读写分离,分库分表

    Mycat安装并实现mysql读写分离,分库分表 一.安装Mycat 1.1 创建文件夹 1.2 下载 二.mycat具体配置 2.1 server.xml 2.2 schema.xml 2.3 se ...

  2. Docker安装Mycat并实现mysql读写分离,分库分表

    Docker安装Mycat并实现mysql读写分离,分库分表 一.拉取mycat镜像 二.准备挂载的配置文件 2.1 创建文件夹并添加配置文件 2.1.1 server.xml 2.1.2 serve ...

  3. SpringCloud微服务实战——搭建企业级开发框架(二十七):集成多数据源+Seata分布式事务+读写分离+分库分表

    读写分离:为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务器,主要进行读的操作. 目前有多种方式实现读写分离,一种 ...

  4. 读写分离&分库分表学习笔记

    读写分离 何为读写分离? 见名思意,根据读写分离的名字,我们就可以知道:读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上. 这样的话,就能够小幅提升写性能,大幅提升读性能. 我简单画了一 ...

  5. Django 数据库读写分离 分库分表

    多个数据库 配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BA ...

  6. MySQL主从复制&读写分离&分库分表

    MySQL主从复制 MySQL的主从复制只能保证主机对外提供服务,从机是不提供服务的,只是在后台为主机进行备份数据 首先我们说说主从复制的原理,这个是必须要理解的玩意儿: 理解: MySQL之间的数据 ...

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

    系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...

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

    系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...

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

    原文:https://www.cnblogs.com/joylee/p/7513038.html 系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理 ...

随机推荐

  1. phantomjs 设置代理

    phantomjs 可通过以下设置代理ip #coding=utf-8import osimport reimport timeimport requestsfrom scrapy.selector ...

  2. C++ lambda表达式 (一)

    为什么要lambda函数 匿名函数是许多编程语言都支持的概念,有函数体,没有函数名.1958年,lisp首先采用匿名函数,匿名函数最常用的是作为回调函数的值.正因为有这样的需求,c++引入了lambd ...

  3. qwt的安装和移植-

    目须要依据实时数据绘制出图表,因此我们找到了qwt库.这个库是一个绘制图表,曲线图,柱状图的统计图标. . .. 以下我们就具体解说一下这个库在Larm上的编译和移植 qwt介绍 QWT,全称是Qt ...

  4. BZOJ 刷题记录 PART 5

    拖了好久才写的. [BZOJ2821]接触分块大法.这道题略有点新颖.首先我们先分块.然后统计每块中每一个数出现的个数. 以下是联立各个方块,预处理出第I个方块到第J个方块出现正偶数次数的个数. fo ...

  5. js---11闭包

    //匿名立即调用函数 (function(){//把a,b,f全部隐藏在函数中,外部访问不到, var a = 5; var b = 6; function f(){ alert(a); } wind ...

  6. sqlserver 小计合计总计

    SELECT CASE WHEN GROUPING(F1) = 1 THEN '总计'WHEN GROUPING(F1) = 0 AND GROUPING(F2) = 1 THEN  F1+'合计'W ...

  7. sql创建外键

    建立外键关系:先建主表再见从表:主表:create table zhu(code int parimary key,name varchar(20)) ;从表:create table cong(co ...

  8. Laravel输出sql语句

    $queries = DB::getQueryLog();

  9. Android 使用开源库载入网络图片

    Android 使用开源库载入网络图片,使用开源库载入图片.单击listview弹出popupwindow弹出框详情查看: Android 单击listview弹出popupwindow弹出框 ,里面 ...

  10. BZOJ 1696 [Usaco2007 Feb]Building A New Barn新牛舍 数学

    题意:链接 方法:数学+模拟 解析: 首先这类问题不是第一次见了,所以直接知道拿x的中位数.y的中位数. 这题就是讨论情况很的烦. 题中有个限制,给出待求和的点不能选取. 所以假设奇数个点,求出x中位 ...