MyCat不支持的Sql语句
mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离

mysql+mycat搭建稳定⾼可⽤集群,负载均衡,主备复制,读写分离数据库性能优化普遍采⽤集群⽅式,oracle集群软硬件投⼊昂贵,今天花了⼀天时间搭建基于mysql的集群环境。
主要思路简单说,实现mysql主备复制-->利⽤mycat实现负载均衡。
⽐较了常⽤的读写分离⽅式,推荐mycat,社区活跃,性能稳定。
测试环境MYSQL版本:Server version: 5.5.53,到官⽹可以下载WINDWOS安装包。
注意:确保mysql版本为5.5以后,以前版本主备同步配置⽅式不同。
linux实现思路类似,修改f即可。
A主mysql。
192.168.110.1:3306, ⽤户root,密码root。
操作系统:win7 x64,内存:4g安装路径:C:\Program Files\MySQL\MySQL Server 5.5\binB备mysql。
192.168.110.2:3306, ⽤户root,密码root。
操作系统:win2003 x64,内存:1g安装路径:C:\Program Files\MySQL\MySQL Server 5.5\binA主、B备的mysql中创建sync_test数据库实现mysql主备复制主要思路:A主mysql开启⽇志,B备mysql读取操作⽇志,同步执⾏。
⼀般为主备同步,主主同步不推荐使⽤。
配置A主mysql1)修改my.ini。
需要在log-bin="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log"的相关位置创建log⽬录,以及mysql-bin.log⽂件。
[mysqld]server-id=1 #主机标⽰,整数port=3306log-bin="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log" #确保此⽂件可写read-only=0 #主机,读写都可以binlog-do-db=sync_test #需要备份数据库,多个写多⾏binlog-ignore-db=mysql #不需要备份的数据库,多个写多⾏2)允许MYSQL远程访问#登录mysql console进⼊%home%/bin,执⾏mysql -uroot -proot#授权。
MyCat不支持的Sql语句

MyCat不支持的SQL语句已知的MyCat不支持的SQL语句类型如下(不完全统计,后续会更新):SELECT:跨分片(实体库)的交叉查询跨节点的联合查询(如用户库的表和平台库的表做联合查询)INSERT:插入的字段不包含分片字段(如插入tbl_user_base_info表,没有提供user_id列)插入的分片字段找不到对应分片复制插入Insert into…select…多行插入insert into tab_a(c1,c2) values(v1,v2),(v11,v21)…UPDATE:更新的列包含分片列多表更新update a, b set a.nation=’China’, b.pwd=’123456’ where a.id=b.id复杂更新update a, b set a.nation=’China’ where a.id=b.id; 但支持子查询方式update a set a.nation=’China’ where id in (select id from b); DELETE:复杂删除delete a from a join b on a.id=b.id; 支持子查询方式delete from a where a.id in (select id from b), 但表不能起别名其它:Call procedure() MyCat未支持存储过程定义, 因而不允许调用存储过程,但可通过注解来调用各个分片上的存储过程Select func(); 不支持这种方式直接调用自定义函数,但支持select id, func() from employee 只需employee所在的所有分片上存在这个函数。
MySql自带函数可随意使用。
注意事项:Order by字段必须出现在select中(MyCat先将结果取出,然后排序)Group by务必使用标准语法select count(1),type from tab_a group by type;MyCat的一些自带函数sum,min,max等可以正确使用,但多分片执行的avg有bug,执行的结果是错误的谨慎使用子查询,外层查询没有分片查询条件,则会在所有分片上执行(子查询内外层的表一样较为特殊)。
MySQL之MyCat

MySQL之MyCat Mycat 可以简单概括为⼀个彻底开源的,⾯向企业应⽤开发的⼤数据库集群⽀持事务、ACID、可以替代MySQL的加强版数据库⼀个可以视为MySQL集群的企业级数据库,⽤来替代昂贵的Oracle集群⼀个融合内存缓存技术、NoSQL技术、HDFS⼤数据的新型SQL Server结合传统数据库和新型分布式数据仓库的新⼀代企业级数据库产品⼀个新颖的数据库中间件产品Mycat⼯作原理Mycat的原理中最重要的⼀个动词是"拦截",它拦截了⽤户发送过来的SQL语句,⾸先对SQL语句做了⼀些特定的分析:如分⽚分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给⽤户Mycat应⽤场景Mycat适⽤的场景很丰富,以下是⼏个典型的应⽤场景单纯的读写分离,此时配置最为简单,⽀持读写分离,主从切换分表分库,对于超过1000万的表进⾏分⽚,最⼤⽀持1000亿的单表分⽚多租户应⽤,每个应⽤⼀个库,但应⽤程序只连接Mycat,从⽽不改造程序本⾝,实现多租户化报表系统,借助于Mycat的分表能⼒,处理⼤规模报表的统计替代Hbase,分析⼤数据作为海量数据实时查询的⼀种简单有效⽅案,⽐如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择Mycat长期路线图强化分布式数据库中间件的⽅⾯的功能,使之具备丰富的插件、强⼤的数据库智能优化功能、全⾯的系统监控能⼒、以及⽅便的数据运维⼯具,实现在线数据扩容、迁移等⾼级功能进⼀步挺进⼤数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速的巨表关联、排序、分组聚合等 OLAP⽅向的能⼒,并集成⼀些热门常⽤的实时分析算法,让⼯程师以及DBA们更容易⽤Mycat实现⼀些⾼级数据分析处理功能不断强化Mycat开源社区的技术⽔平,吸引更多的IT技术专家,使得Mycat社区成为中国的Apache,并将Mycat推到Apache基⾦会,成为国内顶尖开源项⽬,最终能够让⼀部分志愿者成为专职的Mycat开发者,荣耀跟实⼒⼀起提升Mycat不适合的应⽤场景设计使⽤Mycat时有⾮分⽚字段查询,请慎重使⽤Mycat,可以考虑放弃!设计使⽤Mycat时有分页排序,请慎重使⽤Mycat,可以考虑放弃!设计使⽤Mycat时如果要进⾏表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请慎重使⽤Mycat,可以考虑放弃!设计使⽤Mycat时如果有分布式事务,得先看是否得保证事务得强⼀致性,否则请慎重使⽤Mycat,可以考虑放弃!MyCat的⾼可⽤性:需要注意: 在⽣产环境中, Mycat节点最好使⽤双节点, 即双机热备环境, 防⽌Mycat这⼀层出现单点故障.可以使⽤的⾼可⽤集群⽅式有:Keepalived+Mycat+MysqlKeepalived+LVS+Mycat+MysqlKeepalived+Haproxy+Mycat+Mysqlmycat安装⽬录结构:bin mycat命令,启动、重启、停⽌等catlet catlet为Mycat的⼀个扩展功能conf Mycat 配置信息,重点关注lib Mycat引⽤的jar包,Mycat是java开发的logs ⽇志⽂件,包括Mycat启动的⽇志和运⾏的⽇志version.txt mycat版本说明logs⽬录:wrapper.log mycat启动⽇志mycat.log mycat详细⼯作⽇志Mycat的配置⽂件都在conf⽬录⾥⾯,这⾥介绍⼏个常⽤的⽂件:server.xml Mycat软件本⾝相关的配置⽂件,设置账号、参数等schema.xml Mycat对应的物理数据库和数据库表的配置,读写分离、⾼可⽤、分布式策略定制、节点控制rule.xml Mycat分⽚(分库分表)规则配置⽂件,记录分⽚规则列表、使⽤⽅法等Mycat 主要配置⽂件说明server.xml存放Mycat软件本⾝相关的配置⽂件,⽐如:连接Mycat的⽤户,密码,数据库名称等server.xml⽂件中配置的参数解释说明:参数说明user ⽤户配置节点name 客户端登录MyCAT的⽤户名,也就是客户端⽤来连接Mycat的⽤户名。
TPCC测试mycat测试报告

1前言使用tpc-c的标准对mycat进行测试,以发现mycat对事务支持的bug和mycat事务使用中的注意事项,同时,通过让mycat通过tpcc这种标准企业级测试,让使用mycat的人群更有信心来使用mycat 。
2测试方法概述2.1测试环境2.2硬件环境2.3软件环境2.4测试工具2.4.1TPCC介绍TPC(Tracsaction Processing Performance Council) 事务处理性能协会是一个评价大型数据库系统软硬件性能的非盈利的组织,TPC-C是TPC协会制定的,用来测试典型的复杂OLTP系统的性能。
Tpcc测试结果主要关注两个指标:流量指标和性价比。
流量指标:(Throughput,简称tpmC)系统每分钟能够执行多少个用户订单请求,即在执行支付(Payment)、订单状态查询(Order-status)、发货(Delivery)、库存状态查询(Stock-Level)这四种交易的同事,每分钟可以处理多少个新订单(New-Order)交易。
每分钟能处理的新订单事务数越大,说明数据库管理系统的性能越好,例如:每分钟能处理的新订单事务数:13.6 个。
性价比(Price/Performance,简称Price/tpmC):系统价格(指在美国的报价)与流量指标的比值2.4.1.1T pcc商业模型测试用到的模型是一个大型的批发销售公司,每个仓库负责10个区域的供货,每个区域为3000个客户提供服务。
每个仓库维护公司销售的100,000种商品的库存记录,随着企业并发用户的增加,数据量也逐渐增加。
商业模型示意图如下:2.4.1.2T pcc表关系及数据量关系2.4.1.3模拟事务新订单从固定的仓库中随机选取5-15件商品,创建新订单。
支付操作采用随机的金额支付一笔订单,并作相应历史记录。
订单状态查询显示订单内每件商品的状态。
发货随机选取一个发货包,更新被处理订单的用户帐户余额 库存状态查询检查订单中所有货物的库存。
mycat生产实施方案

mycat生产实施方案Mycat生产实施方案一、引言Mycat是一个开源的分布式数据库中间件,它提供了对MySQL数据库的高可用、负载均衡、分库分表等功能。
在大规模的数据存储和访问场景下,Mycat能够有效地提升数据库的性能和稳定性。
因此,本文将介绍Mycat生产实施方案,帮助您更好地使用Mycat来提升数据库的处理能力和可靠性。
二、Mycat生产实施方案1. 硬件环境准备在实施Mycat之前,首先需要准备好适用的硬件环境。
需要确保服务器的性能和稳定性能够满足Mycat的需求,包括CPU、内存、硬盘等方面的配置。
同时,还需要考虑网络带宽和安全防护等方面的因素,以确保Mycat能够在稳定可靠的环境下运行。
2. 软件环境准备除了硬件环境,还需要准备好适用的软件环境。
首先需要安装和配置MySQL数据库,然后再安装Mycat中间件,并进行相应的配置和优化。
在软件环境准备阶段,需要特别注意各个组件之间的兼容性和稳定性,以确保整个系统能够正常运行。
3. 数据库架构设计在实施Mycat之前,需要对数据库架构进行设计和优化。
这包括数据库的分库分表设计、索引优化、SQL语句优化等方面。
通过合理的数据库架构设计,能够有效地提升数据库的性能和可靠性,从而更好地支持Mycat中间件的运行。
4. Mycat配置和优化Mycat的配置和优化是实施过程中的关键环节。
需要根据实际的业务需求和硬件环境,对Mycat进行相应的配置和优化,包括负载均衡策略、读写分离配置、连接池配置等方面。
通过合理的配置和优化,能够更好地发挥Mycat中间件的性能和功能优势。
5. 测试和监控在实施Mycat之后,需要进行相应的测试和监控工作。
通过压力测试、性能测试等手段,验证Mycat中间件的稳定性和性能表现。
同时,需要建立完善的监控系统,实时监控Mycat中间件的运行状态和性能指标,及时发现和解决潜在的问题。
6. 故障处理和优化最后,需要建立完善的故障处理和优化机制。
分表分库解决方案(mycat,tidb,shardingjdbc)

分表分库解决⽅案(mycat,tidb,shardingjdbc)公司最近有分表分库的需求,所以整理⼀下分表分库的解决⽅案以及相关问题。
1.sharding-jdbc(sharding-sphere)优点:1.可适⽤于任何基于java的ORM框架,如:JPA、Hibernate、Mybatis、Spring JDBC Template,或直接使⽤JDBC2.可基于任何第三⽅的数据库连接池,如:DBCP、C3P0、Durid等3.分⽚策略灵活,可⽀持等号、between、in等多维度分⽚,也可⽀持多分⽚键。
4.SQL解析功能完善,⽀持聚合、分组、排序、limit、or等查询,并⽀持Binding Table以及笛卡尔积表查询。
5.性能⾼,单库查询QPS为原⽣JDBC的99.8%,双库查询QPS⽐单库增加94%。
缺点:1.理论上可⽀持任意实现JDBC规范的数据库。
⽬前仅⽀持mysql2.维护会⽐较⿇烦,需要逐个项⽬的修改配置。
不能进⾏跨库连接,代码需要进⾏改造。
3.在扩展数据库服务器时需要考虑⼀致性哈希问题,或者采⽤分⽚键局部取模⽅式,也难免要进⾏部分的数据迁移。
2.mycat优点:1.⽀持Mysql集群,可以作为Proxy使⽤2.⽀持JDBC连接ORACLE、DB2、SQL Server,将其模拟为MySQL Server使⽤3.⾃动故障切换,⾼可⽤性4.⽀持读写分离,⽀持Mysql双主多从,以及⼀主多从的模式,⽀持全局表,数据⾃动分⽚到多个节点,⽤于⾼效表关联查询5.⽀持独有的基于E-R 关系的分⽚策略,实现了⾼效的表关联查询6.多平台⽀持,部署和实施简单缺点:1.mycat不⽀持⼆维路由,仅⽀持单库多表或多库单表由于⾃定义连接池,这样就会存在mycat⾃⾝维护⼀个连接池,MySQL也有⼀个连接池,任何⼀个连接池上限都会成为性能的瓶。
3.tidb优点:1 .⾼度兼容 MySQL ⼤多数情况下,⽆需修改代码即可从 MySQL 轻松迁移⾄ TiDB,分库分表后的 MySQL 集群亦可通过 TiDB ⼯具进⾏实时迁移。
mycat面试题

1.什么叫混合切分答:项目组中如果有水平切分,那项目组里的开发方式就叫混合切分。
或者项目组里就是单纯的垂直切分。
2.在项目组中,切分后的库从哪里而来?答:在开发中是基于原有库创建出来,并且原有库和切分后的库是数据表的设计是保持一致的。
dm_order1,dm_order2,dm_order3这些库是需要和dm_order的设计保持一致的!!!!附注:所以,切分后的库例如dm_order1,dm_order2,dm_order3这些都是有数据库维护团队创建出来的。
3.搭建mycat的核心配置文件有哪些?答:schem.xml 配置参数:逻辑库,逻辑表,数据节点。
节点主机rule.xml:分片规则server.xml:连接mycat的用户信息(账号和密码)这里是使用中间件做数据切分,感兴趣的小伙伴还可以了解一下mysql的分库分表高可用方案IT架构师luke:Mysql分库分表面试题(mysql高可用方案解析)7 赞同·1 评论文章4.mycat分库可以分成100个库吗?答:我们目前项目组分的是3个库,我们说一般数据量大的话我们使用的是mycat中间件进行分片处理,如果更大的话,我们可以使用oracle数据库,如果更大的话可以使用hadoop 或是云存储数据,不需要mycat作为工具手段。
衡量的标准是项目有没有对应的硬件设备。
如果没有,基本就是使用mysql 因为搭建一套云环境或者大数据的环境基本都是超大型的公司。
比如大数据中的所有的技术,例如hbase 或者是一大堆的服务器一大堆的网络路由设备或是私有云。
或者是一大堆的数据库运维实施人员都是成本5.进行库表拆分时,拆分规则怎么取舍?1.不存在热点数据时,则使用连续分片2.存在热点数据时,使用离散分片或者是综合分片3.离散分片暂时迁移比较麻烦(但是mycat给出了数据迁移的脚本,虽然现在还是不是很完美),综合分片占用总机器数量多6.Mycat中全局ID方案有哪些?程序自定义全局ID的方案有哪些?1.mycat的全局id方案(1)本地文件方式sequnceHandlerType = 0配置sequence_conf.properties使用next value for MYCATSEQ_XXX(2)数据库方式sequnceHandlerType = 1配置sequence_db_conf.properties使用next value for MYCATSEQ_XXX或者指定autoIncrement(3)本地时间戳方式ID= 64 位二进制(42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)sequnceHandlerType = 2配置sequence_time_conf.properties指定autoIncrement2. 程序方式(1)Snowflake(2)UUID(3)Redis7.mycat是怎样实现分库分表的?mycat里面通过定义路由规则来(路由规则里面会定义分片字段,以及分片算法)。
MySql之Mycat和Sharding-jdbc的区别

MySql之Mycat和Sharding-jdbc的区别⼀、Mycat和Sharding-jdbc的区别1)mycat是⼀个中间件的第三⽅应⽤,sharding-jdbc是⼀个jar包2)使⽤mycat时不需要改代码,⽽使⽤sharding-jdbc时需要修改代码Mycat(proxy中间件层):Sharding-jdbc(TDDL为代表的应⽤层):⼆、Mycat分⽚join在前⾯的⽂章中,已经说过分库分表需要应对的技术难题有如下⼏个:1.)分布式全局唯⼀id2.)分⽚规则和策略3.)跨分⽚技术问题4.)跨分⽚事物问题下⾯我们来看⼀下Mycat是如何解决跨分⽚技术问题——分⽚join的1. 使⽤全局表⽅式解决跨分⽚join问题1.1 先在server.xml⾥⾯全局表⼀致性检测<property name="useGlobleTableCheck">1</property> <!-- 1为开启全局表⼀致性检测、0为关闭 -->1.2 在schema.xml⾥⾯配置全局表<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />全局表说明:1)全局表的插⼊、更新操作会实时在所有节点上执⾏,保持各个分⽚数据的⼀致性2)全局表的查询操作只从⼀个节点上获取3)全局表可以跟任何⼀个表进⾏join操作2. 使⽤Share Join⽅式解决跨分⽚join问题Share Join是⼀个简单的跨分⽚join,基于HBT(Human Brain Tech)的⽅式实现。
原理:解析SQL语句,拆分成单表的SQL语句执⾏,然后把各个节点的数据汇集。
⽰例:/*!mycat:catlet=io.mycat.catlets.ShareJoin*/select * from employee a, employee_detail b where a.id = b.id;说明:⽬前只⽀持两张分⽚表的Join,如果要⽀持多张表需要⾃⼰改造程序代码或者改造Mycat的源代码对应Mycat源码:io.mycat.catlets.ShareJoinio.mycat.catlets.Catletpublic class ShareJoin implements Catlet3. 使⽤ER Join⽅式解决跨分⽚join问题ER表也叫⽗⼦表,⼦表存储在哪个分⽚上依赖于⽗表的存储位置,并且和⽗表存储同⼀个分⽚上,即⼦表的记录与所关联的⽗表记录存放在同⼀个数据分⽚上,从⽽解决跨库join的问题在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" joinKey="order_id" parentKey="id" /></childTable><childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" /></table>说明:childTable:标签⽤来声明⼦表:joinKey:声明⼦表的那个字段和⽗表关联parentKey:声明⽗表的关联主键primaryKey:⽗表⾃⾝的主键三、Mycat分页中的坑Mycat分页的⼤坑⼀定要注意:在对应的分⽚上去查询分页数据的时候是从第⼀条记录开始扫描,然后再取出对应的分页数据,如SELECT * FROM customer ORDER BY id LIMIT 1000100, 100;这个sql语句被Mycat转化后1 -> dn1{SELECT * FROM customer ORDER BY id LIMIT 0, 1000100}2 -> dn2{SELECT * FROM customer ORDER BY id LIMIT 0, 1000100}所以要在Mycat的server.xm⾥⾯开启使⽤⾮堆内存。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MyCat不支持的SQL语句
已知的MyCat不支持的SQL语句类型如下(不完全统计,后续会更新):
SELECT:
跨分片(实体库)的交叉查询
跨节点的联合查询(如用户库的表和平台库的表做联合查询)
INSERT:
插入的字段不包含分片字段(如插入tbl_user_base_info表,没有提供user_id列)
插入的分片字段找不到对应分片
复制插入Insert into…select…
多行插入insert into tab_a(c1,c2) values(v1,v2),(v11,v21)…
UPDATE:
更新的列包含分片列
多表更新update a, b set a.nation=’China’, b.pwd=’123456’ where a.id=b.id
复杂更新update a, b set a.nation=’China’ where a.id=b.id; 但支持子查询方式update a set a.nation=’China’ where id in (select id from b); DELETE:
复杂删除delete a from a join b on a.id=b.id; 支持子查询方式delete from a where a.id in (select id from b), 但表不能起别名
其它:
Call procedure() MyCat未支持存储过程定义, 因而不允许调用存储过程,但可通过注解来调用各个分片上的存储过程
Select func(); 不支持这种方式直接调用自定义函数,但支持select id, func() from employee 只需employee所在的所有分片上存在这个函数。
MySql自带函数可随意使用。
注意事项:
Order by字段必须出现在select中(MyCat先将结果取出,然后排序)
Group by务必使用标准语法select count(1),type from tab_a group by type;
MyCat的一些自带函数sum,min,max等可以正确使用,但多分片执行的avg有bug,执行的结果是错误的
谨慎使用子查询,外层查询没有分片查询条件,则会在所有分片上执行(子查询内外层的表一样较为特殊)。