石家庄网站建设外包,手机模板的网站哪个好,网站后台 英语,宠物网站模板下载mycat 是mysql分库分表的中间件#xff0c;由java编写#xff0c;本次进行mysql、mycat 的docker搭建#xff0c;理解mycat的原理与特性。
一、mysql docker 搭建
这里启动两个实例#xff1a;
docker run -itd --name mysql1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD123 m…mycat 是mysql分库分表的中间件由java编写本次进行mysql、mycat 的docker搭建理解mycat的原理与特性。
一、mysql docker 搭建
这里启动两个实例
docker run -itd --name mysql1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD123 mysql:5.7.40docker run -itd --name mysql2 -p 3308:3306 -e MYSQL_ROOT_PASSWORD123 mysql:5.7.40
二、写mycat 配置
schema.xml:配置逻辑库、逻辑表、分片规则、数据结点配置。
ITCAST是逻辑库player、team是逻辑表。
db1需要在mysql1 、mysql2 种创建。
rule1为分片规则。
172.17.0.2、172.17.0.3为mysql1 、mysql2的docker ip。
?xml version1.0?
!DOCTYPE mycat:schema SYSTEM schema.dtd
mycat:schema xmlns:mycathttp://io.mycat/ !-- 逻辑库配置 -- schema nameITCAST checkSQLschemafalse sqlMaxLimit100 !-- 逻辑表配置 -- table nameplayer,team dataNodedn1,dn2 rulerule1/ /schema !-- 数据节点配置 -- dataNode namedn1 dataHosthost1 databasedb1 / dataNode namedn2 dataHosthost2 databasedb1 / !-- 节点主机配置 -- dataHost namehost1 maxCon1000 minCon10 balance0 writeType0 dbTypemysql dbDrivernative switchType1 slaveThreshold100 heartbeatselect user()/heartbeat writeHost hosthostM1 url172.17.0.2:3306 userroot password123/writeHost/dataHost dataHost namehost2 maxCon1000 minCon10 balance0 writeType0 dbTypemysql dbDrivernative switchType1 slaveThreshold100 heartbeatselect user()/heartbeat writeHost hosthostM1 url172.17.0.3:3306 userroot password123/writeHost /dataHost /mycat:schema
rule.xml配置一系列分片规则我们使用rule1。按主键均匀分表。
?xml version1.0 encodingUTF-8?
!-- - - Licensed under the Apache License, Version 2.0 (the License);- you may not use this file except in compliance with the License. - Youmay obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0- - Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an AS IS BASIS, - WITHOUTWARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See theLicense for the specific language governing permissions and - limitationsunder the License. --
!DOCTYPE mycat:rule SYSTEM rule.dtd
mycat:rule xmlns:mycathttp://io.mycat/tableRule namerule1rulecolumnsid/columnsalgorithmcrc32slot/algorithm/rule/tableRuletableRule nameauto-sharding-longrulecolumnsid/columnsalgorithmrang-long/algorithm/rule/tableRulefunction namecrc32slot classio.mycat.route.function.PartitionByCRC32PreSlotproperty namecount2/property!-- 要分片的数据库节点数量必须指定否则没法分片 --/functionfunction namerang-long classio.mycat.route.function.AutoPartitionByLongproperty namemapFileautopartition-long.txt/property/function
/mycat:ruleserver.xml配置mycat 的用户与密码。
?xml version1.0 encodingUTF-8?
!-- - - Licensed under the Apache License, Version 2.0 (the License); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an AS IS BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. --
!DOCTYPE mycat:server SYSTEM server.dtd
mycat:server xmlns:mycathttp://io.mycat/systemproperty namecharsetutf8/propertyproperty namenonePasswordLogin0/property !-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0设置为1则需要指定默认账户--property nameignoreUnknownCommand0/property!-- 0遇上没有实现的报文(Unknown command:),就会报错、1为忽略该报文返回ok报文。在某些mysql客户端存在客户端已经登录的时候还会继续发送登录报文,mycat会报错,该设置可以绕过这个错误--property nameuseHandshakeV101/propertyproperty nameremoveGraveAccent1/propertyproperty nameuseSqlStat0/property !-- 1为开启实时统计、0为关闭 --property nameuseGlobleTableCheck0/property !-- 1为开启全加班一致性检测、0为关闭 --property namesqlExecuteTimeout300/property !-- SQL 执行超时 单位:秒--property namesequnceHandlerType1/property!--property namesequnceHandlerPattern(?:(\s*next\svalue\sfor\s*MYCATSEQ_(\w))(,|\)|\s)*)/propertyINSERT INTO travelrecord (id,user_id) VALUES (next value for MYCATSEQ_GLOBAL,xxx);--!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况--property namesequnceHandlerPattern(?:(\s*next\svalue\sfor\s*MYCATSEQ_(\w))(,|\)|\s)*)/propertyproperty namesubqueryRelationshipCheckfalse/property !-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false --property namesequenceHanlderClassio.mycat.route.sequence.handler.HttpIncrSequenceHandler/property!-- property nameuseCompression1/property-- !--1为开启mysql压缩协议--!-- property namefakeMySQLVersion5.6.20/property-- !--设置模拟的MySQL版本号--!-- property nameprocessorBufferChunk40960/property --!-- property nameprocessors1/property property nameprocessorExecutor32/property --!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool --property nameprocessorBufferPoolType0/property!--默认是65535 64K 用于sql解析时最大文本长度 --!--property namemaxStringLiteralLength65535/property--!--property namesequnceHandlerType0/property--!--property namebackSocketNoDelay1/property--!--property namefrontSocketNoDelay1/property--!--property nameprocessorExecutor16/property--!--property nameserverPort8066/property property namemanagerPort9066/property property nameidleTimeout300000/property property namebindIp0.0.0.0/propertyproperty namedataNodeIdleCheckPeriod300000/property 5 * 60 * 1000L; //连接空闲检查property namefrontWriteQueueSize4096/property property nameprocessors32/property --!--分布式事务开关0为不过滤分布式事务1为过滤分布式事务如果分布式事务内只涉及全局表则不过滤2为不过滤分布式事务,但是记录分布式事务日志--property namehandleDistributedTransactions0/property!--off heap for merge/order/group/limit 1开启 0关闭--property nameuseOffHeapForMerge0/property!--单位为m--property namememoryPageSize64k/property!--单位为k--property namespillsFileBufferSize1k/propertyproperty nameuseStreamOutput0/property!--单位为m--property namesystemReserveMemorySize384m/property!--是否采用zookeeper协调切换 --property nameuseZKSwitchfalse/property!-- XA Recovery Log日志路径 --!--property nameXARecoveryLogBaseDir.//property--!-- XA Recovery Log日志名称 --!--property nameXARecoveryLogBaseNametmlog/property--!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接--property namestrictTxIsolationfalse/propertyproperty nameuseZKSwitchtrue/property!--如果为0的话,涉及多个DataNode的catlet任务不会跨线程执行--property nameparallExecute0/property/system!-- 全局SQL防火墙设置 --!--白名单可以使用通配符%或着*--!--例如host host127.0.0.* userroot/--!--例如host host127.0.* userroot/--!--例如host host127.* userroot/--!--例如host host1*7.* userroot/--!--这些配置情况下对于127.0.0.1都能以root账户登录--!--firewallwhitehosthost host1*7.0.0.* userroot//whitehostblacklist checkfalse/blacklist/firewall--user nameroot property namepassword123456/property property nameschemasITCAST/property /user user nametest property namepassword123456/property property nameschemasITCAST/property /user/mycat:server三、docker 启动mycat
在当前目录下创建mycat/conf 目录并将schema.xml rule.xml server.xml 放入其中。
docker run -itd --name mycat -p 8066:8066 -p 9066:9066 -v pwd/my_cat/conf/schema.xml:/usr/local/mycat/conf/schema.xml -v pwd/my_cat/conf/rule.xml:/usr/local/mycat/conf/rule.xml -v pwd/my_cat/conf/server.xml:/usr/local/mycat/conf/server.xml longhronshens/mycat-docker
四、建库
连接mycat,输入123456 此时ITCAST逻辑库已存在逻辑表也存在。但mysql1、mysql2 中没有这两张表。 建表 此时再看mysql1、mysql2表就出现了。 插入数据
insert into player(id,name,team_id) values(1,name_aa,1);
insert into player(id,name,team_id) values(2,name_bb,1);
insert into player(id,name,team_id) values(3,name_cc,3);insert into team(id,name) values(1,team_aa);
insert into team(id,name) values(2,team_bb);
insert into team(id,name) values(3,team_cc);
其中
id为1、3的数据分配到mysql1 中。
id为2的数据分配到mysql2 中。
mysql1: mysql2 五、打开mysql SQL执行日志。
临时打开
mysql SET GLOBAL general_log ON;
日志文件路径
mysql show variables like %general_log_file%; 六、mycat不适用场景的验证
1.非分片键的查询将扩散至所有结点。
使用a、b 对照试验a按分片键查找b不按分片键查找。
a.
在mycat 执行
mysql select * from player where id1;
查看mysql1、mysql2 日志
mysql1: mysql2:
26秒~36秒间无其他操作。 b.
在mycat 执行
mysql select * from player where name like %_aa;
查看mysql1、mysql2 日志
mysql1: mysql2: 2.分页排序将性能下降。
limit m,n 的分页查询将对每个结点发起limit mn / limit 0,mn的查询然后等所有结点数据返回后根据mn 构造最小堆最后取最小堆中的最大的n个。
在mycat 执行
mysql select * from player order by id limit 1,1;
必须加order,否则返回的数据将是不准确的。 mysql1: mysql2: 3.表连接将无法进行。
在mycat 中执行
mysql select player.name name,team.name team_name from player left join team on player.team_id team.id where player.id2;
查询id2 的运动员的姓名和队名这在单表中一定能轻松查出来。但在mycat下就有问题: 原因这条语句mycat只发往了mysql2: mysql1 无任何执行 因为mysql2 中没有队伍3的数据所以id2的队员没有查出对应的队伍。 六、mycat适用场景
1.单纯的读写分离此时配置最为简单支持读写分离主从切换。
2.分表分库对于超过 1000 万的表进行分片最大支持 1000 亿的单表分片。
3.多租户应用每个应用一个库但应用程序只连接 Mycat从而不改造程序本身实现多租户化
4.报表系统借助于 Mycat 的分表能力处理大规模报表的统计
5.作为海量数据实时查询的一种简单有效方案比如 100 亿条频繁查询的记录需要在 3 秒内查询出来结果除了基于主键的查询还可能存在范围查询或其他属性查询此时 Mycat 可能是最简单有效的选择。
七、其他
随着业务的发展核心数据越来越多TPS越来越高数据库的主从、分库分表将不能满足需求需要引入可水平拓展的分布式事务数据库如TiDB、GuassDB等。 references: mycat简介与使用场景