MyCATInAction中文版MyCAT1.3版本(QQ群:106088787)MyCAT介绍什么是MyCAT?简单的说,MyCAT就是:一个彻底开源的,面向企业应用开发的“大数据库集群”支持事务、ACID、可以替代Mysql的加强版数据库一个可以视为“Mysql”集群的企业级数据库,用来替代昂贵的Oracle集群一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQLServer结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品一个新颖的数据库中间件产品MyCAT的目标是:低成本的将现有的单机数据库和应用平滑迁移到“云”端,解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。MyCAT1.3的关键特性:支持SQL92标准支持Mysql集群,可以作为Proxy使用支持JDBC连接ORACLE、DB2、SQLServer,将其模拟为MySQLServer使用支持NoSQL数据库支持galeraformysql集群,percona-cluster或者mariadbcluster,提供高可用性数据分片集群自动故障切换,高可用性支持读写分离,支持Mysql双主多从,以及一主多从的模式支持全局表,数据自动分片到多个节点,用于高效表关联查询支持独有的基于E-R关系的分片策略,实现了高效的表关联查询支持一致性Hash分片,有效解决分片扩容难题多平台支持,部署和实施简单支持Catelet开发,类似数据库存储过程,用于跨分片复杂SQL的人工智能编码实现,143行Demo完成跨分片的两个表的JION查询。支持NIO与AIO两种网络通信机制,Windows下建议AIO,Linux下目前建议NIO支持Mysql存储过程调用以插件方式支持SQL拦截和改写支持自增长主键、支持Oracle的Sequence机制MyCAT的优势:基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能,以及众多成熟的使用案例使得MyCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。广泛吸取业界优秀的开源项目和创新思路,将其融入到MyCAT的基因中,使得MyCAT在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。MyCAT背后有一只强大的技术团队,其参与者都是5年以上资深软件工程师、架构师、DBA等,优秀的技术团队保证了MyCAT的产品质量。MyCAT并不依托于任何一个商业公司,因此不像某些开源项目,将一些重要的特性封闭在其商业产品中,使得开源项目成了一个摆设。MyCAT的长期路线规划:在支持Mysql的基础上,后端增加更多的开源数据库和商业数据库的支持,包括原生支持PosteSQL、FireBird等开源数据库,以及通过JDBC等方式间接支持其他非开源的数据库如Oracle、DB2、SQLServer等实现更为智能的自我调节特性,如自动统计分析SQL,自动创建和调整索引,根据数据表的读写频率,自动优化缓存和备份策略等实现更全面的监控管理功能与HDFS集成,提供SQL命令,将数据库装入HDFS中并能够快速分析集成优秀的开源报表工具,使之具备一定的数据分析的能力MyCAT架构如图所示:MyCAT使用Mysql的通讯协议模拟成了一个Mysql服务器,并建立了完整的Schema(数据库)、Table(数据表)、User(用户)的逻辑模型,并将这套逻辑模型映射到后端的存储节点DataNode(MySQLInstance)上的真实物理库中,这样一来,所有能使用Mysql的客户端以及编程语言都能将MyCAT当成是MysqlServer来使用,不必开发新的客户端协议。当MyCAT收到一个客户端发送的SQL请求时,会先对SQL进行语法分析和检查,分析的结果用于SQL路由,SQL路由策略支持传统的基于表格的分片字段方式进行分片,Client(MySQLCLI/JDBC/ODBC/…)MySQLSocketProtocolHandlerSQLParserSQLRouterFrontServerStorageSQLExecutorDataNodeHeartBeatCheckerMySQLinstanceAMySQLinstanceBMySQLinstanceCMore….也支持独有的基于数据库E-R关系的分片策略,对于路由到多个数据节点(DataNode)的SQL,则会对收到的数据集进行“归并”然后输出到客户端。SQL执行的过程,简单的说,就是把SQL通过网络协议发送给后端的真正的数据库上进行执行,对于MysqlServer来说,是通过Mysql网络协议发送报文,并解析返回的结果,若SQL不涉及到多个分片节点,则直接返回结果,写入客户端的SOCKET流中,这个过程是非阻塞模式(NIO)。DataNode是MyCAT的逻辑数据节点,映射到后端的某一个物理数据库的一个Database,为了做到系统高可用,每个DataNode可以配置多个引用地址(DataSource),当主DataSource被检测为不可用时,系统会自动切换到下一个可用的DataSource上,这里的DataSource即可认为是Mysql的主从服务器的地址。MyCAT逻辑库与任何一个传统的关系型数据库一样,MyCAT也提供了“数据库”的定义,并有用户授权的功能,下面是MyCAT逻辑库相关的一些概念:schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table。table:表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode,这是通过表格的分片规则定义来实现的,table可以定义其所属的“子表(childTable)”,子表的分片依赖于与“父表”的具体分片地址,简单的说,就是属于父表里某一条记录A的子表的所有记录都与A存储在同一个分片上。分片规则:是一个字段与函数的捆绑定义,根据这个字段的取值来返回所在存储的分片(DataNode)的序号,每个表格可以定义一个分片规则,分片规则可以灵活扩展,默认提供了基于数字的分片规则,字符串的分片规则等。DataNode:MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体数据库上,一般来说,为了高可用性,每个DataNode都设置两个DataSource,一主一丛,当主节点宕机,系统自动切换到从节点。DataSource:定义某个物理库的访问地址,用于捆绑到Datanode上。MyCAT目前通过配置文件的方式来定义逻辑库和相关配置:MYCAT_HOME/conf/schema.xml中定义逻辑库,表、分片节点等内容MYCAT_HOME/conf/rule.xml中定义分片规则MYCAT_HOME/conf/server.xml中定义用户以及系统相关变量,如端口等。下图给出了MyCATd一个可能的逻辑库到物理库(Mysql的完整映射关系),可以看出其强大的分片能力以及灵活的Mysql集群整合能力。分片策略MyCAT支持水平分片与垂直分片:水平分片:一个表格的数据分割到多个节点上,按照行分隔。垂直分片:一个数据库中多个表格A,B,C,A存储到节点1上,B存储到节点2上,C存储到节点3上。MyCAT通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分片字段并绑定一个函数,来实现动态分片算法。以常用的基于整数映射schemaTableATableBDatanode1Datanode2Datanode3Datanode4DatabaseaDatabasebDatabasecDatabasee192.168.0.1192.168.0.2192.168.0.3的分片函数org.MyCAT.route.function.PartitionByFileMap为例,此函数通过一个配置文件来确定映射关系,以下面的sharding-by-intfile这个分片规则为例:tableRulename=sharding-by-intfilerulecolumnssharding_id/columnsalgorithmhash-int/algorithm/rule/tableRuletableRulename=auto-sharding-longrulecolumnsid/columnsalgorithmrang-long/algorithm/rule/tableRulefunctionname=hash-intclass=org.MyCAT.route.function.PartitionByFileMappropertyname=mapFilepartition-hash-int.txt/property/functionfunctionname=rang-longclass=org.MyCAT.route.function.AutoPartitionByLongpropertyname=mapFileautopartition-long.txt/property/functionpartition-hash-int.txt的文件如下:10000=010010=1表明当字段sharding_id取值为10000的时候,返回分片节点ID为0,以此类推。Schema.xml中定义customer表的分片规则为此规则:tablename=customerdataNode=dn1,dn2rule=sharding-by-intfile/于是customer按照字段sharding_id进行水平分片,分片存储在两个数据节点dn1,dn2上。如何知道某个SQL在哪个分片上执行?用explainsql语句:explainselect*fromcustomerwheresharding_id=10000根据业务场景和数据特点,可以选用以下的分片规则:auto-sharding-long主键自动增长的数字,按照范围进行自动分片,比如0-200万的数据在分片节点0,200-400万的数据在分片节点2,依次类推,根据数据库服务器的性能,可以每个分片存储100-500条记录之间,此种方式,每个分片表一个独立的自增长ID机制,确保记录的连续性。conf/autopartition-long.txt中定义了分段范围与分片ID的关系。sharding-by-intfile,表中有字段sharding_id,其类型为整数,对应具体的业务含义,比如10000对应电信,10010对应联通,此外,按照省份编码进行定义,也是可行的方式,为了效率,编码被映射为数字而不是字符串,conf/partition-hash-int.txt,定义了某个整数值到某个分片id的映射关系。mod-long,对某些表,我们基本上很少会涉及到范围查询的,只根据某个字段(最常见是主键)进行查找定位,则可以用求余的方式,随机分配到其中一个节点上。所有的分片规则都在rule.xml中定义,不同的表根据需求,定义不同的分片规则。对于某些不分片的表格,或者分片规则一样的表格,table的定义可以用简化的方式来写,如:tablename=customer,productrule=auto-sharding-long/。对于此种方式,name中定义的这些表格具有相同的属性,并且都不能有childTable元素。基于E-R关系分片策略传统的数据库分片方式都是基于单个表格,对于表关联这种操作,则很难处理,考虑下面的分片模型,customer与orders分片在不同节点上,orders的parent_id字段存放父表customer的主键:为了能够执行customer与orders的联合查询,意味着分片表的数据必须要跨节点进