利用MyCat的数据切分搭建切片数据库

一、Mycat的目的


数据切分,数据切分,数据切分重要的事情讲三遍!

简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果,而我们的应用在操作时可以忽略数据在哪个服务器上,我们的应用只需要和mycat交互即可。

数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。

二、解决方法、途径


先来看看其官方权威指南上的一个图片,用图最能阐述一个软件的中心思想,也最直接。
这里写图片描述
一张表的数据切分存储在不同的物理数据库中,那么第一步要确定的是如何切分,如何知道那个物理数据库存了那些数据?当然不能乱切分,必须有一定的规则,这个规则必须有规律可寻的。

假如我们先人为把所有省份为wuhan(武汉是湖北省的省会,不是省)的订单都存放在DB1@Mysql1物理数据库上,把所有省份为sh的订单都存放在DB2@Mysql2物理数据库上。现在有一个SQL说我要wuhan省的所有订单,你现在是否已经知道要去DB1@Mysql1去拿数据呢?

Mycat实现也是如此,在这个图片中间就是Mycat中间件,在这你可以简单把它理解成为一个伪装的中间数据库(实质不存储任何数据),它负责接收前段所有应用链接到这个伪装数据库的SQL,根据表的配置获取分片规则(rule)把存储在真是数据库内的数据读出,并且返回给应用,当然还有对应的新增(I)、修改(U)、删除(D)操作到真正的分片数据库。

那么图中的SQL:select * from Orders where prov=’wuhan’,prov列字段就是分片规则,在这个例子可以简单理解为枚举类型:所prov列字段为‘wuhan’和‘bi’的它们的数据都去DB1@Mysql1物理机上操作,所prov列字段为‘sh’的数据都去DB2@Mysql2物理机上去操作.

三、几个重要概念和对应文件


从上面的我们知道了三个主要的名词分别是:表、分片规则、数据库物理机。接下看看Mycat如何处理这几个概念的关系。

1.分片规则(rule)
一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。
分片规则的基础配置都在 rule.xml文件内,这些分片规则都必须应用到一个上。
2. 节点主机(dataHost)
数据库实例,数据库运行的地方。
3.分片节点(dataNode)
在节点主机和表之间一个概念,其官方解释:数据节点,也就是我们通常说所的数据分片。
4. 逻辑表(table)、
所有需要拆分的表。这里记录了表、分片节点和分片规则的关系。
至此,所有数据切分的逻辑关系都已经很明确了,见图
这里写图片描述
这样就可以就知道了一个表有那些分片节点分片的规则是什么,根据分片规则返回唯一的分片节点索引,再根据分片节点找到唯一的节点主机(物理机)

四、实践部署


(1)创建数据库
这里写图片描述
在这里我们在mysql数据库下建立两个数据库,分别是db1和db2,在每个数据库下都有orders数据库表。

CREATE TABLE `orders` (
  `prov` varchar(20) NOT NULL,
  PRIMARY KEY (`prov`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

(2)配置文件rule.xml

<tableRule name="split_by_prov">
        <rule>
            <columns>prov</columns>
            <algorithm>plit_by_prov_func</algorithm>
        </rule>
    </tableRule>

    <function name="plit_by_prov_func" class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">plit_by_prov.txt</property>
        <property name="type">1</property>
        <property name="defaultNode">0</property>
    </function>

这里根据表的prov列进行上图省份的枚举,其配置都在plit_by_prov.txt中,

wuhan=0
sh=1
bi=0
sx=1

(3)配置文件schema.xml

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <table name="orders" dataNode="dn1,dn2" rule="split_by_prov" />
    </schema>

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


    <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="localhost:3306" user="user"
                   password="user">
        </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="localhost:3306" user="user"
                   password="user">
        </writeHost>
    </dataHost>

(4) 配置文件server.xml

  其它默认
   <user name="user">
        <property name="password">user</property>
        <property name="schemas">TESTDB</property>
    </user>

(5) 启动Mycat

./mycat start  

(6)使用Mycat
使用mysql客户端建立与Mycat的链接,见图片
这里写图片描述

链接好后,执行以下语句

INSERT INTO  orders  (`prov`) VALUES ('wuhan');
INSERT INTO  orders  (`prov`) VALUES ('bi');
INSERT INTO  orders  (`prov`) VALUES ('sh');
INSERT INTO  orders  (`prov`) VALUES ('sx');
INSERT INTO  orders  (`prov`) VALUES ('bbb');

(7)验证数据存储
这里写图片描述
这里写图片描述
如图所示,所有数据都按照plit_by_prov.txt文件中的配置进行了存储,把wuhan和bi的都储在了db1中,把sh和sx的存储到了db2中,其中bbb在文件中没有配置,其按照分片函数的默认设置(defaultNode)分配到了db1中。

五、总结

本文在这里只是简单介绍了数据在分片的情况下的简单原理,其中间件还有很复杂情况下的各种处理,具体可以参考其权威指南(文中有些与新版本有出入)。
写的较仓促,若有不正确之处,欢迎指正

其官方网站:Mycat
Mycat权威指南 :Mycat权威指南

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 当你使用MyCat连接数据库时,可能会遇到无法连接的问题。根据引用\[1\]中的描述,你可能遇到了端口不通的情况。MyCat默认使用8066端口连接数据库,如果该端口无法通信,那么连接就会失败。你已经尝试关闭防火墙,但仍然无法解决问题。此外,引用\[2\]中提到可能会出现"Host '192.168.100.196' is blocked because of many connection errors"的错误信息。 为了解决这个问题,你可以尝试以下方法: 1. 确保MyCat所在的主机已经在server.xml文件中的防火墙白名单中,不被阻止连接。你可以在server.xml文件中找到<firewall>标签,并在其中添加<whitehost>标签,将MyCat所在的主机添加到白名单中。例如,可以添加<host host="127.*" user="root"/>来允许本机连接。\[3\] 2. 检查网络连接是否正常。你可以尝试在Windows上使用ping命令来测试MyCat所在主机的连接情况。如果ping不通,可能是网络配置问题导致无法连接。 3. 确保数据库服务器正常运行并且可以通过其他方式连接。你可以尝试使用其他工具(如MySQL客户端)来连接数据库,以确认数据库服务器是否正常工作。 希望以上方法能够帮助你解决MyCat无法连接数据库的问题。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助你解决问题。 #### 引用[.reference_title] - *1* *3* [MyCat登录失败解决方法](https://blog.csdn.net/weixin_43240386/article/details/124444562)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [mycat连接不上mysql数据库](https://blog.csdn.net/weixin_34324081/article/details/92536384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值