您好,欢迎访问三七文档
MyCat技术分享——原理、实现和应用2014.10.31肖雄1.Mycat解决什么?2.Mycat架构3.Mycat应用Mycat解决什么?OracleMySQLMSSQLDB2•性能容量高可用...如果我有一个32核心的服务器,我就可以实现1个亿的数据分片,我有32核心的服务器么?没有,所以我至今无法实现1个亿的数据分片。——MyCAT‘sPlan应用应用应用应用MyCat为什么选择MyCat?1.支持读写分离,支持Mysql双主多从,以及一主多从的模式2.支持全局表,数据自动分片到多个节点,用于高效表关联查询3.支持独有的基于E-R关系的分片策略,实现了高效的表关联查询4.自动故障切换,高可用性5.提供高可用性数据分片集群6.支持JDBC连接ORACLE、DB2、SQLServer,将其模拟为MySQLServer使用7.支持Mysql集群,可以作为Proxy使用8.基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能MyCat架构MySQLCLI/JDBC/ODBC/…数据库驱动Mycat结构数据库实例数据库A数据库B数据库CMore…MySQLSocketProtocolHandlerSQLParserSQLRouterSQLExecutorDataNodesHeartBeatChecker中间件引入MyCat策略系统实现实施应用MyCat应用•性能问题•数据库连接过多•E-R分片难处理•可用性问题–Standby切换故障•成本和伸缩性问题–依赖高成本的硬件设备Mycat引入水平拆分MySQLMySQLMySQLMyCat应用Member表Member表Member表•性能问题•数据库连接过多•E-R分片难处理•可用性问题–Standby切换故障•成本和伸缩性问题–依赖高成本的硬件设备应用MySQLMySQLMySQL应用应用应用应用应用应用应用Member表Member表Member表Mycat引入连接复用AppIDMEMBE_IDINFO1pavarotti17…11pavarotti17…MySQLIDMEMBE_IDINFO4test1234…5test1234…IDMEMBE_IDINFO3abcd…9abcd…20abcd…MySQLMySQLMycatProxyAppAppAppAppAppAppApp•性能问题•数据库连接过多•E-R分片难处理•可用性问题–Standby切换故障•成本和伸缩性问题–依赖高成本的硬件设备MyCat引入MySQL应用Member表Order表Product表1…n1..nMySQLMember表Order表Product表1…n1..n……MyCat•性能问题•数据库连接过多•E-R分片难处理•可用性问题–Standby切换故障•成本和伸缩性问题–依赖高成本的硬件设备MyCat引入IDMEMBE_IDINFO1pavarotti17…11pavarotti17…MySQLMycatAppXMyCat引入failoverIDMEMBE_IDINFO1pavarotti17…11pavarotti17…MySQLMaster1MyCatAppIDMEMBE_IDINFO1pavarotti17…11pavarotti17…MySQLMaster2XMySQLReplicationMyCat引入failoverIDMEMBE_IDINFO1pavarotti17…11pavarotti17…MycatAppIDMEMBE_IDINFO1pavarotti17…11pavarotti17…MySQLReplicationMySQLMaster1MySQLMaster2大纲中间件引入MyCat策略系统实现实施应用mysqlMySQLMySQLMySQLMySQLMySQLMySQLMySQLMySQLMySQLMySQLMySQLMySQL拆分数据表水平拆分IDMEMBE_IDINFO1pavarotti17…3abcd…4test1234…5test1234…9abcd…11pavarotti17…20abcd…水平拆分IDMEMBE_IDINFO1pavarotti17…3abcd…4test1234…5test1234…9abcd…11pavarotti17…20abcd…拆分字段水平拆分IDMEMBE_IDINFO1pavarotti17…3abcd…4test1234…5test1234…9abcd…11pavarotti17…20abcd…IDMEMBE_IDINFO1pavarotti17…4test1234…5test1234…11pavarotti17…IDMEMBE_IDINFO3abcd…9abcd…20abcd…库1库2拆分字段水平拆分IDMEMBE_IDINFO1pavarotti17…3abcd…4test1234…5test1234…9abcd…11pavarotti17…20abcd…IDMEMBE_IDINFO1pavarotti17…4test1234…5test1234…11pavarotti17…IDMEMBE_IDINFO3abcd…9abcd…20abcd…库1库2拆分字段路由算法路由算法pavarotti17路由算法pavarotti17部分截取hash()=3170972965401路由算法hash(pavarott)=3170972965401%1024=53701023路由算法hash(pavarott)=3170972965401%1024=53702552565115127677681023256256256256分库1分库2分库3分库4路由算法hash(pavarott)=3170972965401%1024=53702552565115127677681023256256256256分库1分库2分库3分库4路由算法——扩容hash(pavarott)=3170972965401%1024=53701271282552563833845115126396407677688958961023128128128128128128128128分库1分库2分库3分库4路由算法——扩容hash(pavarott)=3170972965401%1024=53701271282552563833845115126396407677688958961023128128128128128128128128分库1分库2分库3分库4分库5分库6分库7分库8原分库1分库2分库3分库4原原原路由算法——非均匀分布hash(pavarott)=3170972965401%1024=53705115127677688958961023512256128128分库1分库2分库3分库4拆分表的数据访问——SQL转发IDMEMBE_IDINFO1pavarotti17…4test1234…5test1234…11pavarotti17…IDMEMBE_IDINFO3abcd…9abcd…20abcd…MycatAppselect*fromtb1wheremember_id=‘test1234’拆分表的数据访问——SQL转发IDMEMBE_IDINFO1pavarotti17…4test1234…5test1234…11pavarotti17…IDMEMBE_IDINFO3abcd…9abcd…20abcd…MycatAppselect*fromtb1wheremember_id=‘test1234’IDMEMBE_IDINFO1pavarotti17…4test1234…5test1234…11pavarotti17…IDMEMBE_IDINFO3abcd…9abcd…20abcd…MycatAppSELECT*FROMtb1WHEREmember_idIN(‘test1234’,’pavarotti17’,’abcd’)拆分表的数据访问——SQL转发IDMEMBE_IDINFO1pavarotti17…4test1234…5test1234…11pavarotti17…IDMEMBE_IDINFO3abcd…9abcd…20abcd…MycatAppselect*fromtb1wheremember_idin(‘test1234’,’pavarotti17’)select*fromtb1wheremember_idin(‘abcd’)拆分表的数据访问——SQL转发IDMEMBE_IDINFO1pavarotti17…4test1234…5test1234…11pavarotti17…IDMEMBE_IDINFO3abcd…9abcd…20abcd…ResultMerger前台通信ResultSet:row1row2ResultSet:row3row4row5ResultSet:row3row1row4row5row2拆分表的数据访问——结果返回MyCat的策略•基于表的水平拆分和分布–根据字段值的一致性Hash分布–根据字段值的范围分布–根据字段值的固定分布•数据查询方式–根据where中的拆分字段分发•SQL语句其他元素的处理–将Cobar收到的SQL语句做变换分发到各个分库执行–对执行结果合并、处理保证返回前端的内容满足语义JOIN有限的处理•跨库JOIN问题SELECT*FROMtb1INNERJOINtb2ONt1.MEMBER_ID=t2.NAMEIDMEMBE_ID2zzzz4xyzxyzIDNAME4efghijk5aaaa6abcdIDMEMBE_ID1efghijk3xxxxxx5abcdIDNAME2zzzz3xyzxyztb1tb1tb2tb2IDMEMBER_IDIDNAME1efghijk4efghijk5abcd6abcd2zzzz2zzzz4xyzxyz3xyzxyz迭代查询SELECT*FROMtb1INNERJOINtb2ONt1.MEMBER_ID=t2.NAMEIDMEMBE_ID2zzzz4xyzxyzIDNAME4efghijk5aaaa6abcdIDMEMBE_ID1efghijk3xxxxxx5abcdIDNAME2zzzz3xyzxyztb1tb1tb2tb2FORrow1INselect*FROMtb1{ADD(SELECT*FROMtb2WHEREtb2.name=row1.member_id)TORESULT}跨库索引IDMEMBE_ID2zzzz4xyzxyzIDNAME4efghijk5aaaa6abcdIDMEMBE_ID1efghijk3xxxxxx5abcdIDNAME2zzzz3xyzxyztb1tb1tb2tb2ID1ID2JOIN_COL22zzzz43xyzxyzidxID1ID2JOIN_COL14efghijk56abcdidx扫描idx,再根据每一行的id1,id2查到最终结果跨库索引IDMEMBE_ID2zzzz4xyzxyzIDNAME4efghijk5aaaa6abcdIDMEMBE_ID1efghijk3xxxxxx5abcdIDNAME2zzzz3xyzxyztb1tb1tb2tb2SELECT*FROMtb1INNERJOINtb2ONt1.MEMBER_ID=t2.NAMEWHEREt1.id=5SELECT*FROMidxWHEREid1=5再根据id1,id2查到最终结果跨库索引IDMEMBE_ID2zzzz4xyzxyzIDNAME4efghijk5aaaa6abcdIDMEMBE_ID1efghijk3xxxxxx5abcdIDNAME2zzzz3xyzxyztb1tb1tb2tb2ID1ID2JOIN_COL22zzzz43xyzxyzidxID1ID2JOIN_COL14efghijk56abcdidx一定以JOIN_COL为索引的拆分字段吗?跨库索引SELECT*FROMtb1INNERJOI
本文标题:mycat技术分享
链接地址:https://www.777doc.com/doc-5328957 .html