schema.xml参数含义解释说明 – 搞机Pro网 .home .main .sec-panel-head .j-newslist, .search-results .pagination, .home .load-more-wrap { display: none; } .single .entry-content img { display: block; margin-left: auto; margin-right: auto; } .single-post .entry-content iframe { width: 100%; height: 500px; } @media (max-width: 767px){ .single-post .entry-content iframe { width: 100%; height: 300px; } } LA.init({id: \”JhQPBU91LuYhvCSn\”,ck: \”JhQPBU91LuYhvCSn\”,autoTrack:true}) function isMobile() { var userAgent = navigator.userAgent.toLowerCase(); return /ipad|iphone|midp|rv:1.2.3.4|ucweb|android|windows ce|windows mobile/.test(userAgent); } .q-content .topic-tab,.q-content .q-answer .as-user,.q-content .q-answer .as-comment-name,.profile-QAPress-tab .QAPress-tab-item{color: #1471CA;} .q-content .q-topic-wrap a:hover,.q-content .q-answer .as-action a:hover,.q-content .topic-tab:hover,.q-content .topic-title:hover{color:#0D62B3;} .q-content .put-top,.q-content .topic-tab.current-tab,.q-content .q-answer .as-submit .btn-submit,.q-content .q-answer .as-comments-submit,.q-content .q-add-header .btn-post,.q-content .q-pagination .current,.q-btn-new,.profile-QAPress-tab .QAPress-tab-item.active,.q-mobile-ask a{background-color:#1471CA;} .q-content .q-answer .as-submit .btn-submit:hover,.q-content .q-answer .as-comments-submit:hover,.q-content .q-add-header .btn-post:hover,.q-content .topic-tab.current-tab:hover,.q-content .q-pagination a:hover,.q-btn-new:hover,.profile-QAPress-tab .QAPress-tab-item:hover,.q-mobile-ask a:hover{background-color:#0D62B3;} .q-content .q-answer .as-comments-input:focus,.profile-QAPress-tab .QAPress-tab-item{border-color: #1471CA;} .profile-QAPress-tab .QAPress-tab-item:hover{border-color: #0D62B3;} var _hmt = _hmt || []; _hmt.push([\’_trackPageview\’]); (function() { var hm = document.createElement(\”script\”); hm.src = \”//hm.baidu.com/hm.js?fe211990b79c55d240b27f5ba7fcb1e5\”; hm.setAttribute(\’async\’, \’true\’); document.getElementsByTagName(\’head\’)[0].appendChild(hm); })(); a, .text-primary, .btn.active, .btn:active, .btn:focus, .btn:hover, .btn.btn-primary .badge, .panel-primary>.panel-heading .badge, .member-form-tab li.active a, .member-account-menu .member-nav-icon, .member-lp-process li.active p, .wpcom-profile .user-group, .wpcom-profile .wpcom-profile-nav li.active a, .wpcom-profile .profile-tab-item.active, .user-card-name .user-group, .plyr–full-ui input[type=range], body>header.header .nav>li.active>a, body>header.header .dropdown-menu>.active>a, .entry .entry-info .nickname, .entry .entry-content .has-theme-color-color, .entry-bar-inner .user-group, .entry-action .btn-dashang, .entry-action .btn-zan, .entry-readmore-btn, .form-submit-text span, .widget_profile .user-group, .list.tabs .tab.active a, .load-more, .kx-list .kx-time{color: #102750;}.bg-primary, .btn.btn-primary, .btn.btn-primary.disabled.focus, .btn.btn-primary.disabled:focus, .btn.btn-primary.disabled:hover, .btn.btn-primary[disabled].focus, .btn.btn-primary[disabled]:focus, .btn.btn-primary[disabled]:hover, fieldset[disabled] .btn.btn-primary.focus, fieldset[disabled] .btn.btn-primary:focus, fieldset[disabled] .btn.btn-primary:hover, .nav-pills>li.active>a, .nav-pills>li.active>a:focus, .nav-pills>li.active>a:hover, .label-primary, .panel-primary>.panel-heading, .action.action-color-1 .action-item, .entry .entry-content .has-theme-color-background-color, .comment-reply-title:before, .comments-title:before, .entry-related-title:before, .widget-title:before, .search-form .submit, .sec-panel-head h1 span:before, .sec-panel-head h2 span:before, .sec-panel-head h3 span:before, .wpcom-slider .swiper-pagination .swiper-pagination-bullet-active, .tagHandler ul.tagHandlerContainer li.tagItem{background-color: #102750;}.form-control:focus, .btn.active, .btn:active, .btn.btn-primary, .btn.btn-primary.active, .btn.btn-primary:active, .btn.btn-primary.disabled.focus, .btn.btn-primary.disabled:focus, .btn.btn-primary.disabled:hover, .btn.btn-primary[disabled].focus, .btn.btn-primary[disabled]:focus, .btn.btn-primary[disabled]:hover, fieldset[disabled] .btn.btn-primary.focus, fieldset[disabled] .btn.btn-primary:focus, fieldset[disabled] .btn.btn-primary:hover, .nav .open>a, .nav .open>a:focus, .nav .open>a:hover, .panel-primary, .panel-primary>.panel-heading, .wpcom-profile .profile-tab-item.active, .search-form input.keyword:focus, .load-more{border-color: #102750;}.btn.active:before, .btn:active:before, .btn:focus:before, .btn:hover:before, .TCaptcha-button .TCaptcha-icon:after, .wpcom-profile .user-group, .user-card-name .user-group, .smartphoto-loader, .entry-bar-inner .user-group, .entry-action .btn-dashang, .entry-action .btn-zan, .entry-readmore-btn, .widget-kx-list .kx-item:before, .widget_profile .user-group, .kx-list .kx-time:before{border-color: #102750;}.btn.active:after, .btn:active:after, .btn:focus:after, .btn:hover:after, .page-numbers>li.active, .pagination>li.active, .swiper-pagination-bullet-active, .swiper-pagination-progress .swiper-pagination-progressbar, .hot-slider .swiper-button-next, .hot-slider .swiper-button-prev, .action .action-item-inner h2, .action .action-item-inner h3, .action .action-item-inner h4, .TCaptcha-button .TCaptcha-icon i, .TCaptcha-button .TCaptcha-icon:before, .member-account-menu .active:before, .member-lp-process li.active i, .member-lp-process li.processed .process-line, .wpcom-profile .user-group:after, .wpcom-profile .profile-tab-item.active:after, .user-card-name .user-group:after, .modules-video .modal-player, .social-login-form .sl-input-submit, .plyr–audio .plyr__control.plyr__tab-focus, .plyr–audio .plyr__control:hover, .plyr–audio .plyr__control[aria-expanded=true], .plyr–video .plyr__control.plyr__tab-focus, .plyr–video .plyr__control:hover, .plyr–video .plyr__control[aria-expanded=true], .plyr__control–overlaid, .plyr__control–overlaid:focus, .plyr__control–overlaid:hover, .plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]:before, .entry-bar-inner .user-group:after, .post-loop-default .item-title a .sticky-post, .post-loop-card .item-title .sticky-post, .post-loop-image .item-title .sticky-post, .sidebar .widget_nav_menu ul li.current-menu-item a, .sidebar .widget_nav_menu ul li.current-post-parent a, .widget_profile .user-group:after, .list.tabs .tab.active a:after, .kx-list .kx-date:before{background-color: #102750;}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color: #102750;}.panel-primary>.panel-footer+.panel-collapse>.panel-body, .member-form-tab li.active{border-bottom-color: #102750;}.wpcom-profile .wpcom-profile-nav li.active a{border-bottom-color: #102750;}.entry .entry-content .h3, .entry .entry-content h3, .entry .member-account-content .woocommerce h2{border-left-color: #102750;}a:hover, .breadcrumb>li a:hover, .page-numbers .pagination-go .pgo-btn:hover, .pagination .pagination-go .pgo-btn:hover, .close:focus, .close:hover, .action .action-share-item:hover, .member-form .form-group.active .wi, .member-form .form-group.active .show-password .wi:hover, .member-form .form-group.error .show-password .wi:hover, .member-form .show-password .wi:hover, .member-form-tab a:hover, .member-account-name a:hover, .member-account-menu li:hover, .wpcom-profile .wpcom-profile-nav a:hover, .wpcom-profile .follow-item .follow-item-text .follow-item-name a:hover, .wpcom-profile-main .profile-posts-list .item-title a:hover, .wpcom-profile-main .profile-comments-list .comment-item-link a:hover, .hentry .member-account-wrap .notify-list .notify-item.status-1 .notify-item-title a:hover, .hentry .member-account-wrap .notify-list .notify-item-title a:hover, .user-card-name:hover, body>header.header .nav>li>a:hover, body>header.header .wpcom-adv-menu>.menu-item-style>.menu-item-wrap>li>a:hover, .navbar-action .login:focus, .navbar-action .login:hover, .navbar-action .profile a:hover, .navbar-search-close:hover, .navbar-search-btn:hover, .navbar-search-icon:focus, .navbar-search-icon:hover, .entry .entry-info a:focus, .entry .entry-info a:hover, .entry .entry-content .has-theme-hover-color, .entry .entry-content .wp-block-wpcom-accordion .panel-heading .panel-title a:hover, .entry .entry-content .wp-block-wpcom-accordion .panel-heading .panel-title a:hover .wi, .entry-bar .info-item a:hover, .comments-list .comment-children .comment-text-reply a:hover, .comments-list .reply a:hover, .comment-body .nickname a:hover, #cancel-comment-reply-link:hover, .post-loop-list .item a:hover, .post-loop-default .item-title a:hover, .post-loop-default .item-meta a:hover, .post-loop-card .item-title a:hover, .post-loop-image .item-title a:hover, .post-loop-image .item-meta-author .avatar:hover, .widget ol a:hover, .widget ul a:hover, .widget_kuaixun .widget-title-more:hover, .widget_profile .profile-name:hover, .sec-panel-head .more:hover, .el-boxed .sec-panel-head h1 span a:hover, .el-boxed .sec-panel-head h2 span a:hover, .el-boxed .sec-panel-head h3 span a:hover, .list.tabs .tab a:hover, .list-links a:focus, .list-links a:hover, .kx-list .kx-content h2 a:hover, .kx-meta .j-mobile-share:hover, .modules-category-posts .sec-panel-more a:hover{color: #021d4d;}.page-numbers>li:hover, .pagination>li:hover, .hot-slider .swiper-button-prev:hover, .hot-slider .swiper-container-rtl .swiper-button-next:hover, .hot-slider .swiper-button-next:hover, .hot-slider .swiper-container-rtl .swiper-button-prev:hover, .member-account-menu .active:hover:before, .wpcom-profile .wpcom-profile-setcover:hover, .wpcom-profile .profile-tab-item:hover, .social-login-form .sl-input-submit:hover, body>header.header .dropdown-menu>.active>a:focus, body>header.header .dropdown-menu>.active>a:hover, body>header.header .dropdown-menu>li>a:hover, body>header.header .wpcom-adv-menu>.menu-item-style>.menu-item-wrap .dropdown-menu li a:hover, .entry-tag a:focus, .entry-tag a:hover, .wpcom-shortcode-tags li:hover, .page-no-sidebar.member-login .btn-home:hover, .page-no-sidebar.member-register .btn-home:hover, .post-loop-default .item-category:hover, .post-loop-card .item-img .item-category:hover, .post-loop-image .item-img .item-category:hover, .widget .tagcloud a:hover, .sidebar .widget_nav_menu ul li.current-menu-item .sub-menu a:hover, .sidebar .widget_nav_menu ul li.current-post-parent .sub-menu a:hover, .sidebar .widget_nav_menu ul li a:hover, .footer-sns .sns-icon:after, .list.tabs .tab.active a:hover:after, .load-more:focus, .load-more:hover, .modules-carousel-posts .sec-panel-more .swiper-button-next:hover, .modules-carousel-posts .sec-panel-more .swiper-button-prev:hover{background-color: #021d4d;}.page-numbers .pagination-go .pgo-input:focus, .pagination .pagination-go .pgo-input:focus, .member-form .form-group.active .form-input, .wpcom-profile .wpcom-profile-setcover:hover, .wpcom-profile .profile-tab-item:hover, .entry-tag a:focus, .entry-tag a:hover, .entry-action .btn-dashang.liked, .entry-action .btn-dashang:hover, .entry-action .btn-zan.liked, .entry-action .btn-zan:hover, .entry-readmore-btn:hover, .widget .tagcloud a:hover, .widget-kx-list .kx-item:hover:before, .widget-kx-list .kx-item.active:before, .load-more:focus, .load-more:hover{border-color: #021d4d;}.action .action-item:hover, .entry .entry-content .has-theme-hover-background-color, .entry-action .btn-dashang.liked, .entry-action .btn-dashang:hover, .entry-action .btn-zan.liked, .entry-action .btn-zan:hover, .entry-readmore-btn:hover, .search-form .submit:hover, .wpcom-slider .swiper-pagination span:hover, .tagHandler ul.tagHandlerContainer li.tagItem:hover{background-color: #021d4d;}.member-form-tab li.active:hover{border-bottom-color: #021d4d;}.member-account-input input:focus, .member-account-input select:focus, .member-account-input textarea:focus, .modules-carousel-posts .sec-panel-more .swiper-button-next:hover, .modules-carousel-posts .sec-panel-more .swiper-button-prev:hover{border-color: #021d4d;}.wpcom-profile .wpcom-profile-nav a:hover{border-bottom-color: #021d4d;}@media (max-width:991px){.navbar-collapse{background-color: #102750;}}@media (max-width:767px){.entry-bar .info-item.share .mobile{background-color: #102750;}} body>header.header{background-color: #fff;;} body>header.header .logo img{max-height: 40px;} @media (max-width: 767px){ body>header.header .logo img{max-height: 36px;} } .entry .entry-video{ height: 482px;} @media (max-width: 1219px){ .entry .entry-video{ height: 386.49883449883px;} } @media (max-width: 991px){ .entry .entry-video{ height: 449.41724941725px;} } @media (max-width: 767px){ .entry .entry-video{ height: 344.28571428571px;} } @media (max-width: 500px){ .entry .entry-video{ height: 241px;} } 首页 手机 数码 电脑 科技 软件 市场营销 综合 登录 注册 投稿 搞机Pro网首页科技 schema.xml参数含义解释说明 谁的青春不腐朽 • 2022-05-01 12:37:27 • 科技 概述 schema.xml 作为 MyCat 中重要的配置文件之一,管理着 MyCat 的逻辑库、表、分片规则、 DataNode 以及 DataSource。今天主要介绍一下schema.xml,这也是mycat必须掌握的点。 1、schema相关标签 schema标签用于定义mycat实例中的逻辑库,mycat可以有多个逻辑库,每个逻辑库可以有自己的相关配置,如果不配置schema标签,所有表配置会属于同一个默认的逻辑库。 示例如下: <schema name=\”USERDB\” checkSQLschema=\”false\” sqlMaxLimit=\”100\” datanode=\”dn3,dn4\”> <table name=\”tb_user\” dataNode=\”dn1,dn2\” rule=\”auto-sharing-long\”></table> </schema> <schema name=\”ORDERDB\” checkSQLschema=\”false\” sqlMaxLimit=\”100\”> <table name=\”tb_order\” dataNode=\”dn3,dn4\” rule=\”auto-sharing-long\”></table> </schema> 上面示例是配置了两个逻辑库,就如同在mysql中定义了两个数据库。查询数据是切换到对应的逻辑库进行。 1.1、schema标签: name属性: 逻辑数据库的名称。 checkSQLschema属性:  该字段就是用户执行sql语句时,是否检查表明的schema,当该值设置为 true 时,如果我们执行语句(select * from USERDB.tb_user)则 MyCat 会把语句修改为(select * from tb_user)。即把表示 schema 的name去掉,避免发送到后端数据库执行时报错。建议将该字段设置为false。 sqlMaxLimit属性: 当该值设置为某个数值时。每条执行的 SQL 语句,如果没有加上 limit 语句,MyCat 也会自动的加上所对应的值。例如设置值为 100,执行select * from USERDB.tb_user;等效执行select * from USERDB.tb_user limit 100; 如果没有设置该值的话,MyCat 默认会把查询到的信息全部都展示出来。在正常使用中,还是建议加上一个值,用于减少过多的数据返回。当如果SQL 语句中也显式的指定 limit 的大小,不受该属性的约束。 1.2 table标签 name属性: 定义逻辑表的表名,就如mysql中的table名称,同个schema中定义的必须唯一。 dataNode属性: 定义当前逻辑表所属dataNode,dataNode指定了逻辑数据库对应的物理数据库节点,该属性的值需要和 dataNode 标签中 name 属性的值相互对应。如果需要定义的 dn 过多可以使用如下的方法减少配置: <table name=\”tb_user\” dataNode=\”Dn$0-99,Dn2$100-199\” rule=\”auto-shardinglong\” > <!–数据节点配置–> <dataNode name=\”Dn\” dataHost=\”localhost1\” database=\”db$0-99\” > <dataNode name=\”Dn2\” dataHost=\”localhost1\” database=\” db$0-199\” > 上面的例子中,需要在mysql上建立名称为 dbs0 到 dbs99 的 database。 rule 属性: 该属性用于指定逻辑表要使用的规则名字,规则名字在 rule.xml 中定义,必须与 tableRule 标签中 name 属性属性值一一对应。 ruleRequired 属性: 该属性用于指定表是否绑定分片规则,如果配置为 true,但没有配置具体rule的话程序将会报错。 primaryKey 属性: 该逻辑表对应真实表的主键,例如:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的 DN 上,如果使用该属性配置真实表的主键。那么 MyCat 会缓存主键与具体 DN 的信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,就会直接发送语句给具体的 DN,但是尽管配置该属性,如果缓存并没有命中的话,还是会发送语句给所有的 DN来获得数据。 type 属性: 该属性定义了逻辑表的类型,目前逻辑表只有“全局表”和”普通表”两种类型。对应的配置: 全局表:global 普通表:不指定该值为 globla 的所有表。 autoIncrement 属性: mycat 目前提供了自增长主键功能,但是如果对应的 mysql 节点上数据表,没有定义 auto_increment,那么在 mycat 层调用 last_insert_id()也是不会返回结果的。由于 insert 操作的时候没有带入分片键,mycat 会先取下这个表对应的全局序列,然后赋值给分片键。这样才能正常的插入到数据库中,最后使用 last_insert_id()才会返回插入的分片键值。该属性默认是禁用的。 subTables属性: 使用方式添加 subTables=\”t_order$1-2,t_order3\”,目前分表 1.6 版本以后开始支持,并且 dataNode 在分表条件下只能配置一个,分表条件下不支持各种条件的join 语句。 needAddLimit 属性: 指定表是否需要自动的在每个语句后面加上 limit 限制。由于使用了分库分表,数据量有时会特别巨大。mycat 就自动的为我们加上LIMIT 100。如果语句中有 limit,就不会加上。该属性默认为 true,你也可以设置成 \”false\”来禁用掉。 1.3 childTable 标签 childTable 标签用于定义 E-R 分片的子表。通过标签上的属性与父表进行关联 示例: <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\” primaryKey=\”ID\” joinKey=\”order_id\” parentKey=\”id\” /> <childTable name=\”customer_addr\” primaryKey=\”ID\” joinKey=\”customer_id\” parentKey=\”id\” /> </table> name 属性: 定义子表的表名; joinKey 属性: 插入子表的时候会使用这个列的值查找父表存储的数据节点。 parentKey 属性: 该属性指定的值一般为与父表建立关联关系的列名。程序首先获取 joinkey 的值,再通过parentKey属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上,从而确定子表存储的位置。 primaryKey 属性: 同 table 标签所描述的。 needAddLimit 属性: 同 table 标签所描述的。 1.4 dataNode 标签: dataNode标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个dataNode标签就是一个独立的数据分片。 <dataNode name=\”dn1\” dataHost=\”localhost1\” database=\”db1\” /> 示例使用名字为localhost1数据库实例上的db1物理数据库,这就组成一个数据分片,使用名字dn1 识这个分片。 name 属性: 定义数据节点的名字,这个名字需要是唯一的,我们需要在 table 标签上应用这个名字,来建立逻辑表与分片对应的关系。 dataHost 属性: 该属性用于定义该分片属于哪个数据库实例的,属性值是引用 dataHost 标签上定义的 name 属性。 database 属性: 该属性用于定义该分片属性哪个具体数据库实例上的具体库,因为这里使用两个维度来定义分片:实例+具体的库。因为每个库上建立的表和表结构是一样的。所以这样做就可以轻松的对表进行水平拆分。 1.5 dataHost 标签 作为 schema.xml 中最后的一个标签,该标签在 mycat 逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。 <dataHost name=\”localhost1\” maxCon=\”1000\” minCon=\”10\” balance=\”0\” writeType=\”0\” dbType=\”mysql\” dbDriver=\”native\”> <heartbeat>select user()</heartbeat> <writeHost host=\”hostM1\” url=\”localhost:3306\” user=\”root\” password=\”123456\” /> <readHost host=\”hostS2\” url=\”localhost:3306\” user=\”root\” password=\”123456\”/> </writeHost> <writeHost host=\”hostS1\” url=\”localhost:3316\” user=\”root\” password=\”123456\” /> </dataHost> name 属性: 唯一标识 dataHost 标签,供dataNode标签使用。 maxCon 属性: 指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的 writeHost、 readHost 标签都会使用这个属性的值来实例化出连接池的最大连接数。 minCon 属性: 指定每个读写实例连接池的最小连接,初始化连接池的大小。 balance 属性: 负载均衡类型,具体有以下4种: 1. balance=\”0\”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。 2. balance=\”1\”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。 3. balance=\”2\”,所有读操作都随机的在 writeHost、 readhost 上分发。 4. balance=\”3\”,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有。 writeType 属性: 负载均衡写操作类型,目前的取值有 2 种: 1. writeType=\”0\”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文中:dnindex.properties。 2. writeType=\”1\”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。 dbType 属性: 指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。例如:mongodb、 oracle、 spark 等 dbDriver 属性: 指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。 从 1.6 版本开始支持 postgresql 的 native 原始协议如果使用 JDBC 的话需要将符合 JDBC 4 标准的驱动 JAR 包放到 MYCATlib 目录下,并检查驱动 JAR 包中包括如下目录结构的文件:META-INFservicesjava.sql.Driver。在这个文件内写上具体的 Driver 类名,例如:com.mysql.jdbc.Driver switchType 属性: -1 表示不自动切换 1 默认值,自动切换 2 基于 MySQL 主从同步的状态决定是否切换 ,心跳语句为 show slave status 3 基于 MySQL galary cluster 的切换机制

概述

schema.xml 作为 MyCat 中重要的配置文件之一,管理着 MyCat 的逻辑库、表、分片规则、 DataNode 以及 DataSource。今天主要介绍一下schema.xml,这也是mycat必须掌握的点。


1、schema相关标签

schema标签用于定义mycat实例中的逻辑库,mycat可以有多个逻辑库,每个逻辑库可以有自己的相关配置,如果不配置schema标签,所有表配置会属于同一个默认的逻辑库。

示例如下:

<schema name=\"USERDB\" checkSQLschema=\"false\" sqlMaxLimit=\"100\" datanode=\"dn3,dn4\">
 <table name=\"tb_user\" dataNode=\"dn1,dn2\" rule=\"auto-sharing-long\"></table>
</schema>
<schema name=\"ORDERDB\" checkSQLschema=\"false\" sqlMaxLimit=\"100\">
 <table name=\"tb_order\" dataNode=\"dn3,dn4\" rule=\"auto-sharing-long\"></table>
</schema>

上面示例是配置了两个逻辑库,就如同在mysql中定义了两个数据库。查询数据是切换到对应的逻辑库进行。

1.1、schema标签:

schema.xml参数含义解释说明schema.xml参数含义解释说明

name属性:

逻辑数据库的名称。

checkSQLschema属性: 

该字段就是用户执行sql语句时,是否检查表明的schema,当该值设置为 true 时,如果我们执行语句(select * from USERDB.tb_user)则 MyCat 会把语句修改为(select * from tb_user)。即把表示 schema 的name去掉,避免发送到后端数据库执行时报错。建议将该字段设置为false。

sqlMaxLimit属性:

当该值设置为某个数值时。每条执行的 SQL 语句,如果没有加上 limit 语句,MyCat 也会自动的加上所对应的值。例如设置值为 100,执行select * from USERDB.tb_user;等效执行select * from USERDB.tb_user limit 100;

如果没有设置该值的话,MyCat 默认会把查询到的信息全部都展示出来。在正常使用中,还是建议加上一个值,用于减少过多的数据返回。当如果SQL 语句中也显式的指定 limit 的大小,不受该属性的约束。

1.2 table标签

schema.xml参数含义解释说明schema.xml参数含义解释说明

name属性:

定义逻辑表的表名,就如mysql中的table名称,同个schema中定义的必须唯一。

dataNode属性:

定义当前逻辑表所属dataNode,dataNode指定了逻辑数据库对应的物理数据库节点,该属性的值需要和 dataNode 标签中 name 属性的值相互对应。如果需要定义的 dn 过多可以使用如下的方法减少配置:

<table name=\"tb_user\" dataNode=\"Dn$0-99,Dn2$100-199\" rule=\"auto-shardinglong\" >
<!--数据节点配置-->
<dataNode name=\"Dn\" dataHost=\"localhost1\" database=\"db$0-99\" >
<dataNode name=\"Dn2\" dataHost=\"localhost1\" database=\" db$0-199\" >

上面的例子中,需要在mysql上建立名称为 dbs0 到 dbs99 的 database。

rule 属性:

该属性用于指定逻辑表要使用的规则名字,规则名字在 rule.xml 中定义,必须与 tableRule 标签中 name 属性属性值一一对应。

ruleRequired 属性:

该属性用于指定表是否绑定分片规则,如果配置为 true,但没有配置具体rule的话程序将会报错。

primaryKey 属性:

该逻辑表对应真实表的主键,例如:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的 DN 上,如果使用该属性配置真实表的主键。那么 MyCat 会缓存主键与具体 DN 的信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,就会直接发送语句给具体的 DN,但是尽管配置该属性,如果缓存并没有命中的话,还是会发送语句给所有的 DN来获得数据。

type 属性:

该属性定义了逻辑表的类型,目前逻辑表只有“全局表”和”普通表”两种类型。对应的配置:

  • 全局表:global
  • 普通表:不指定该值为 globla 的所有表。

autoIncrement 属性:

mycat 目前提供了自增长主键功能,但是如果对应的 mysql 节点上数据表,没有定义 auto_increment,那么在 mycat 层调用 last_insert_id()也是不会返回结果的。由于 insert 操作的时候没有带入分片键,mycat 会先取下这个表对应的全局序列,然后赋值给分片键。这样才能正常的插入到数据库中,最后使用 last_insert_id()才会返回插入的分片键值。该属性默认是禁用的。

subTables属性:

使用方式添加 subTables=\”t_order$1-2,t_order3\”,目前分表 1.6 版本以后开始支持,并且 dataNode 在分表条件下只能配置一个,分表条件下不支持各种条件的join 语句。

needAddLimit 属性:

指定表是否需要自动的在每个语句后面加上 limit 限制。由于使用了分库分表,数据量有时会特别巨大。mycat 就自动的为我们加上LIMIT 100。如果语句中有 limit,就不会加上。该属性默认为 true,你也可以设置成 \”false\”来禁用掉。

1.3 childTable 标签

childTable 标签用于定义 E-R 分片的子表。通过标签上的属性与父表进行关联

schema.xml参数含义解释说明schema.xml参数含义解释说明

示例:

<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\" primaryKey=\"ID\" joinKey=\"order_id\" parentKey=\"id\" />
 <childTable name=\"customer_addr\" primaryKey=\"ID\" joinKey=\"customer_id\" parentKey=\"id\" />
</table>

name 属性:

定义子表的表名;

joinKey 属性:

插入子表的时候会使用这个列的值查找父表存储的数据节点。

parentKey 属性:

该属性指定的值一般为与父表建立关联关系的列名。程序首先获取 joinkey 的值,再通过parentKey属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上,从而确定子表存储的位置。

primaryKey 属性:

同 table 标签所描述的。

needAddLimit 属性:

同 table 标签所描述的。

1.4 dataNode 标签:

schema.xml参数含义解释说明schema.xml参数含义解释说明

dataNode标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个dataNode标签就是一个独立的数据分片。

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

示例使用名字为localhost1数据库实例上的db1物理数据库,这就组成一个数据分片,使用名字dn1 识这个分片。

name 属性:

定义数据节点的名字,这个名字需要是唯一的,我们需要在 table 标签上应用这个名字,来建立逻辑表与分片对应的关系。

dataHost 属性:

该属性用于定义该分片属于哪个数据库实例的,属性值是引用 dataHost 标签上定义的 name 属性。

database 属性:

该属性用于定义该分片属性哪个具体数据库实例上的具体库,因为这里使用两个维度来定义分片:实例+具体的库。因为每个库上建立的表和表结构是一样的。所以这样做就可以轻松的对表进行水平拆分。

1.5 dataHost 标签

schema.xml参数含义解释说明schema.xml参数含义解释说明

作为 schema.xml 中最后的一个标签,该标签在 mycat 逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。

<dataHost name=\"localhost1\" maxCon=\"1000\" minCon=\"10\" balance=\"0\" writeType=\"0\" dbType=\"mysql\" dbDriver=\"native\">
 <heartbeat>select user()</heartbeat>
 <writeHost host=\"hostM1\" url=\"localhost:3306\" user=\"root\" password=\"123456\" /> <readHost host=\"hostS2\" url=\"localhost:3306\" user=\"root\" password=\"123456\"/>
 </writeHost>
 <writeHost host=\"hostS1\" url=\"localhost:3316\" user=\"root\" password=\"123456\" />
</dataHost> 

name 属性:

唯一标识 dataHost 标签,供dataNode标签使用。

maxCon 属性:

指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的 writeHost、 readHost 标签都会使用这个属性的值来实例化出连接池的最大连接数。

minCon 属性:

指定每个读写实例连接池的最小连接,初始化连接池的大小。

balance 属性:

负载均衡类型,具体有以下4种:

 1. balance=\"0\", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
 2. balance=\"1\",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
 3. balance=\"2\",所有读操作都随机的在 writeHost、 readhost 上分发。
 4. balance=\"3\",所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有。

writeType 属性:

负载均衡写操作类型,目前的取值有 2 种:

 1. writeType=\"0\", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文中:dnindex.properties。
 2. writeType=\"1\",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。

dbType 属性:

指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。例如:mongodb、 oracle、 spark 等

dbDriver 属性:

指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。

从 1.6 版本开始支持 postgresql 的 native 原始协议如果使用 JDBC 的话需要将符合 JDBC 4 标准的驱动 JAR 包放到 MYCATlib 目录下,并检查驱动 JAR 包中包括如下目录结构的文件:META-INFservicesjava.sql.Driver。在这个文件内写上具体的 Driver 类名,例如:com.mysql.jdbc.Driver

switchType 属性:

 -1 表示不自动切换
 1 默认值,自动切换
 2 基于 MySQL 主从同步的状态决定是否切换 ,心跳语句为 show slave status
 3 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%’.

tempReadHostAvailable 属性:

如果配置了这个属性 writeHost 下面的 readHost 仍旧可用,默认 0 可配置(0、 1)

1.6 heartbeat 标签

该标签内指明用于和后端数据库进行心跳检查的语句。例如,MYSQL 可以使用 select user(),Oracle 可以使用 select 1 from dual 等。

1.7 writeHost 标签、 readHost 标签

schema.xml参数含义解释说明schema.xml参数含义解释说明

这两个标签都指定后端数据库的相关配置给 mycat,用于实例化后端连接池。唯一不同的是,writeHost 指定写实例、 readHost 指定读实例,通过这些读写实例来满足系统的需求。

在一个 dataHost 内可以定义多个 writeHost 和 readHost。但是,如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 都将不可用。另一方面,由于这个 writeHost 宕机系统会自动的检测到,并切换到备用的 writeHost 上去。

host 属性:

用于标识不同实例,一般 writeHost 我们使用*M1,readHost 我们用*S1。

url 属性:

后端实例连接地址,如果是使用 native 的 dbDriver,则一般为 address:port 这种形式。用 JDBC 或其他的dbDriver,则需要特殊指定。当使用 JDBC 时则可以这么写:jdbc:mysql://localhost:3306/。

user 属性:

后端存储实例需要的用户名字。

password 属性:

后端存储实例需要的密码。

weight 属性:

权重配置,在 readhost 中作为读节点的权重(1.4 以后)

usingDecrypt 属性:

是否对密码加密默认。0表示不开启。1表示开启,同时使用加密程序对密码加密。