首页 数据库 mysql教程 MySQL分布式集群之MyCAT(二)schema代码详解

MySQL分布式集群之MyCAT(二)schema代码详解

Mar 11, 2017 pm 02:20 PM

在第一部分,有简单的介绍MyCAT的搭建和配置文件的基本情况,这一篇详细介绍schema的一些具体参数,以及实际作用
        首先贴上自己测试用的schema文件,双引号之前的反斜杠不会消除,姑且当成不存在吧...

<?xml version=\"1.0\"?>
<!DOCTYPE mycat:schema SYSTEM \"schema.dtd\">
<mycat:schema xmlns:mycat=\"http://org.opencloudb/\">
    <schema name=\"mycat\" checkSQLschema=\"false\" sqlMaxLimit=\"100\">
        <!-- auto sharding by id (long) -->
        <table name=\"students\" dataNode=\"dn1,dn2,dn3,dn4\" rule=\"rule1\" />
        <table name=\"log_test\" dataNode=\"dn1,dn2,dn3,dn4\" rule=\"rule2\" />
        <!-- global table is auto cloned to all defined data nodes ,so can join 
            with any table whose sharding node is in the same data node -->
        <!--<table name=\"company\" primaryKey=\"ID\" type=\"global\" dataNode=\"dn1,dn2,dn3\" />
        <table name=\"goods\" primaryKey=\"ID\" type=\"global\" dataNode=\"dn1,dn2\" />
            -->
        <table name=\"item_test\" primaryKey=\"ID\" type=\"global\" dataNode=\"dn1,dn2,dn3,dn4\" />
        <!-- random sharding using mod sharind rule -->
        <!-- <table name=\"hotnews\" primaryKey=\"ID\" dataNode=\"dn1,dn2,dn3\"
            rule=\"mod-long\" /> -->
            <!-- 
        <table name=\"worker\" primaryKey=\"ID\" dataNode=\"jdbc_dn1,jdbc_dn2,jdbc_dn3\" rule=\"mod-long\" />
 -->
        <!-- <table name=\"employee\" primaryKey=\"ID\" dataNode=\"dn1,dn2\"
            rule=\"sharding-by-intfile\" />
        <table name=\"customer\" primaryKey=\"ID\" dataNode=\"dn1,dn2\"
            rule=\"sharding-by-intfile\">
            <childTable name=\"orders\" primaryKey=\"ID\" joinKey=\"customer_id\"
                parentKey=\"id\">
                <childTable name=\"order_items\" joinKey=\"order_id\"
                    parentKey=\"id\" />
            <ildTable>
            <childTable name=\"customer_addr\" primaryKey=\"ID\" joinKey=\"customer_id\"
                parentKey=\"id\" /> -->
    </schema>
    <!-- <dataNode name=\"dn\" dataHost=\"localhost\" database=\"test\" /> -->
    <dataNode name=\"dn1\" dataHost=\"localhost\" database=\"test1\" />
    <dataNode name=\"dn2\" dataHost=\"localhost\" database=\"test2\" />
    <dataNode name=\"dn3\" dataHost=\"localhost\" database=\"test3\" />
    <dataNode name=\"dn4\" dataHost=\"localhost\" database=\"test4\" />
    <!-- 
    <dataNode name=\"jdbc_dn1\" dataHost=\"jdbchost\" database=\"db1\" />
    <dataNode name=\"jdbc_dn2\" dataHost=\"jdbchost\" database=\"db2\" />
    <dataNode name=\"jdbc_dn3\" dataHost=\"jdbchost\" database=\"db3\" />
 -->
    <dataHost name=\"localhost\" maxCon=\"100\" minCon=\"10\" balance=\"1\"
        writeType=\"1\" dbType=\"mysql\" dbDriver=\"native\">
        <heartbeat>select user()<beat>
        <!-- can have multi write hosts -->
        <writeHost host=\"localhost\" url=\"localhost:3306\" user=\"root\" password=\"wangwenan\">
            <!-- can have multi read hosts -->
            <readHost host=\"hostS1\" url=\"localhost:3307\" user=\"root\" password=\"wangwenan\"/>
        </writeHost>
        <writeHost host=\"localhost1\" url=\"localhost:3308\" user=\"root\" password=\"wangwenan\">
            <!-- can have multi read hosts -->
            <readHost host=\"hostS11\" url=\"localhost:3309\" user=\"root\" password=\"wangwenan\"/>
        </writeHost>
    </dataHost>
        <!-- <writeHost host=\"hostM2\" url=\"localhost:3316\" user=\"root\" password=\"123456\"/> -->
    <!-- 
        <dataHost name=\"jdbchost\" maxCon=\"1000\" minCon=\"1\" balance=\"0\" writeType=\"0\" dbType=\"mongodb\" dbDriver=\"jdbc\">
        <heartbeat>select user()<beat>
        <writeHost host=\"hostM\" url=\"mongodb://192.168.0.99/test\" user=\"admin\" password=\"123456\" ></writeHost>
    </dataHost>    
    -->
     <!-- 
    <dataHost name=\"jdbchost\" maxCon=\"1000\" minCon=\"10\" balance=\"0\"
        dbType=\"mysql\" dbDriver=\"jdbc\">
        <heartbeat>select user()<beat>
        <writeHost host=\"hostM1\" url=\"jdbc:mysql://localhost:3306\"
            user=\"root\" password=\"123456\">
        </writeHost>
    </dataHost>
     -->
</mycat:schema>
登录后复制


        第一行参数<schema name="mycat" checkSQLschema="false" sqlMaxLimit="100"/>
                在这一行参数里面,schema name定义了可以在MyCAT前端显示的逻辑数据库的名字,
                checkSQLschema这个参数为False的时候,表明MyCAT会自动忽略掉表名前的数据库名,比如说mydatabase1.test1,会被当做test1;
                sqlMaxLimit指定了SQL语句返回的行数限制;
                     


                       
                如截图,这个limit会让MyCAT在分发SQL语句的时候,自动加上一个limit,限制从分库获得的结果的行数,另外,截图右上角可以看到,MyCAT本身也是有缓存的;
                那么,如果我们执行的语句要返回较多的数据行,在不修改这个limit的情况下,MyCAT会怎么做?
                      
                可以从截图看到,MyCAT完全就没搭理前端的实际需求,老老实实返回100条数据,所以如果实际应用里面需要返回大量数据,可能就得手动改逻辑了
                MyCAT的1.4版本里面,用户的Limit参数会覆盖掉默认的MyCAT设置 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                <table name="students" dataNode="dn1,dn2,dn3,dn4" rule="rule1" />
                这一行代表在MyCAT前端会显示哪些表名,类似几行都代表一样的意思,这里强调的是表,而MyCAT并不会在配置文件里面定义表结构
                    如果在前端使用show create table ,MyCAT会显示正常的表结构信息,观察Debug日志,
                      
                可以看到,MyCAT把命令分发给了dn1代表的数据库,然后把dn1的查询结果返回给了前端
                可以判断,类似的数据库级别的一些查询指令,有可能是单独分发给某个节点,然后再把某个节点的信息返回给前端;
               
                dataNode的意义很简单,这个逻辑表的数据存储在后端的哪几个数据库里面                
                rule代表的是这个逻辑表students的具体切分策略,目前MyCAT只支持按照某一个特殊列,遵循一些特殊的规则来切分,如取模,枚举等,具体的留给之后细说 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                
                <table name="item_test" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3,dn4" />
                这一行代表的是全局表,这意味着,item_test这张表会在四个dataNode里面都保存有完整的数据副本,那么查询的时候还会分发到所有的数据库么?
                      
                结果如截图,MyCAT依然是规规矩矩的返回了100条数据(╮(╯_╰)╭),而针对全局表的查询,只会分发到某一个节点上
                配置的primaryKey没发现作用在哪里,姑且忽略吧,以后发现了再补上

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                childtable我在测试中并没有实际用起来不过在MyCAT的设计文档里面有提到,childtable是一种依赖于父表的结构,
                这意味着,childtable的joinkey会按照父表的parentKey的策略一起切分,当父表与子表进行连接,且连接条件是childtable.joinKey=parenttable.parentKey时,不会进行跨库的连接.
                PS:具体测试以后再补

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                dataNode的参数在之前的篇章介绍过,这里直接跳过~

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                dataHost配置的是实际的后端数据库集群,大部分参数简单易懂,这里就不一个个介绍了,只介绍比较重要的两个参数,writeType和balance.
                writeType和balance是用来控制后端集群的读写分离的关键参数,这里我用了双主双从的集群配置
                这里的测试过程比较麻烦,所以直接贴结论:
                        1.balance=0时,读操作都在localhost上(localhost失败时,后端直接失败)
                        2.balance=1时,读操作会随机分散在localhost1和两个readhost上面(localhost失败时,写操作会在localhost1,如果localhost1再失败,则无法进行写操作)
                        3.balance=2时,
写操作会在localhost上,读操作会随机分散在localhost1,localhost1和两个readhost上面(同上)
                        4.writeType=0时,写操作会在localhost上,如果localhost失败,会自动切换到localhost1,localhost恢复以后并不会切换回localhost进行写操作
                        5.writeType=1时,写操作会随机分布在
localhost和localhost1上,单点失败并不会影响集群的写操作,但是后端的从库会无法从挂掉的主库获取更新,会在读数据的时候出现数据不一致
                                举例:localhost失败了,写操作会在localhost1上面进行,localhost1的主从正常运行,但是localhost的从库无法从localhost获取更新,localhost的从库于其他库出现数据不一致

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

实际上,
MyCAT本身的读写分离是基于后端集群的同步来实现的,而MyCAT本身则提供语句的分发功能,当然,那个sqlLimit的限制也使得MyCAT会对前端应用层的逻辑造成一些影响
由schema到table的配置,则显示出MyCAT本身的逻辑结构里面,就包含了分库分表的这种特性(可以指定不同的表存在于不同的数据库中,而不必分到全部数据库)

             

以上是MySQL分布式集群之MyCAT(二)schema代码详解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP 的大数据结构处理技巧 PHP 的大数据结构处理技巧 May 08, 2024 am 10:24 AM

大数据结构处理技巧:分块:分解数据集并分块处理,减少内存消耗。生成器:逐个产生数据项,无需加载整个数据集,适用于无限数据集。流:逐行读取文件或查询结果,适用于大文件或远程数据。外部存储:对于超大数据集,将数据存储在数据库或NoSQL中。

如何优化 PHP 中的 MySQL 查询性能? 如何优化 PHP 中的 MySQL 查询性能? Jun 03, 2024 pm 08:11 PM

可以通过以下方式优化MySQL查询性能:建立索引,将查找时间从线性复杂度降至对数复杂度。使用PreparedStatements,防止SQL注入并提高查询性能。限制查询结果,减少服务器处理的数据量。优化连接查询,包括使用适当的连接类型、创建索引和考虑使用子查询。分析查询,识别瓶颈;使用缓存,减少数据库负载;优化PHP代码,尽量减少开销。

如何在 PHP 中使用 MySQL 备份和还原? 如何在 PHP 中使用 MySQL 备份和还原? Jun 03, 2024 pm 12:19 PM

在PHP中备份和还原MySQL数据库可通过以下步骤实现:备份数据库:使用mysqldump命令转储数据库为SQL文件。还原数据库:使用mysql命令从SQL文件还原数据库。

如何使用 PHP 插入数据到 MySQL 表中? 如何使用 PHP 插入数据到 MySQL 表中? Jun 02, 2024 pm 02:26 PM

如何将数据插入MySQL表中?连接到数据库:使用mysqli建立与数据库的连接。准备SQL查询:编写一个INSERT语句以指定要插入的列和值。执行查询:使用query()方法执行插入查询,如果成功,将输出一条确认消息。

如何修复 MySQL 8.4 上的 mysql_native_password 未加载错误 如何修复 MySQL 8.4 上的 mysql_native_password 未加载错误 Dec 09, 2024 am 11:42 AM

MySQL 8.4(截至 2024 年的最新 LTS 版本)中引入的主要变化之一是默认情况下不再启用“MySQL 本机密码”插件。此外,MySQL 9.0完全删除了这个插件。 此更改会影响 PHP 和其他应用程序

如何在 PHP 中使用 MySQL 存储过程? 如何在 PHP 中使用 MySQL 存储过程? Jun 02, 2024 pm 02:13 PM

要在PHP中使用MySQL存储过程:使用PDO或MySQLi扩展连接到MySQL数据库。准备调用存储过程的语句。执行存储过程。处理结果集(如果存储过程返回结果)。关闭数据库连接。

如何使用 PHP 创建 MySQL 表? 如何使用 PHP 创建 MySQL 表? Jun 04, 2024 pm 01:57 PM

使用PHP创建MySQL表需要以下步骤:连接到数据库。创建数据库(如果不存在)。选择数据库。创建表。执行查询。关闭连接。

oracle数据库和mysql的区别 oracle数据库和mysql的区别 May 10, 2024 am 01:54 AM

Oracle数据库和MySQL都是基于关系模型的数据库,但Oracle在兼容性、可扩展性、数据类型和安全性方面更胜一筹;而MySQL则侧重速度和灵活性,更适合小到中等规模的数据集。①Oracle提供广泛的数据类型,②提供高级安全功能,③适合企业级应用程序;①MySQL支持NoSQL数据类型,②安全性措施较少,③适合小型到中等规模应用程序。

See all articles