笔者带你剖析Kratos1.3的分片模型
《笔者带你剖析Kratos1.3的分片模型》
由于笔者等下还的出去看电影,因此今天就长话短说,系列博文熟悉的目录与前言今天我就暂时不写了,并且今天要讲的东西很纯粹,就是对Kratos的分片模型进行详细的讲解,当然版本是基于1.3的而不是之前的1.2。当然如果你并不清楚Kratos,那么你可以首先阅读笔者之前的博文《笔者带你剖析轻量级Sharding中间件——Kratos1.x》。
Kratos支持2种类型的分库分片算法,一种是库内分片,而另外一种则是一库一片。当然这2种分片模型你选择任何一种都可以,但是对于笔者当前的业务现状来说,都觉得这2种算法,在后期扩库时非常不方便,主要是数据迁移是个老大难的问题,并且直接影响生产停应用的时间。
那么与公司DBA详细沟通后,笔者在Kratos的分片模型基础之上进行了一些调整。当然从宏观来看,仍然保持库内分片/一库一片这2种分片模型,只是为这2种分片模型都提供有是否需要支持片名连续的选项。所谓的片名连续,从某种意义上来说,并不是指的数据上的连续,而是数据库表的名称是否连续。也就是说,Kratos支持2类4种分片模式。
简单来说,Kratos的库内分片模式,可以采用片名连续也可以采用非片名连续。如果是片名连续,那么假设dbSize是32,tbSize是1024,那么每一个库的片数为1024/32=32,而片名是按照0000-1023进行分布的,这就意味着片名是全局唯一的,不允许出现重复,这同时也是TDDL所支持的一种分片算法。而如果在库内分片模式中采用非片名连续,那么假设dbSize是32,tbSize是1024,那么每一个库的片数为1024/32=32,而片名在每一个库中都是按照0-31进行分布,也就是说,非全局唯一,这样的好处,相对于片名连续更容易扩容,数据迁移也相对来说更加容易点,依稀记得DBA跟笔者信誓旦旦的保证过,目前Mysql进行扩容,数据迁移时,支持数据库名称不统一,但数据库表得统一,那么非片名连续确实能够更方便DBA做后续的扩容操作。Kratos库内分片所支持的片名连续与非片名连续,如图A-1,和A-2所示:
图A-1 库内分片模式的片名连续
图A-2 库内分片模式的非片名连续
Kratos的一库一片模式,同样也可以采用片名连续也可以采用非片名连续。如果是片名连续,那么假设dbSize是1024,tbSize是1024,那么每一个库的片数为1024/1024=1,而片名是按照0000-1023进行分布的,这就意味着片名是全局唯一的,不允许出现重复。相对于库内分片,一库一片的算法更简单和直观,因为一库一片只跟库相关,与片无关,算出了库,就等于间接算出片。而如果在一库一片模式中采用非片名连续,那么假设dbSize是1024,tbSize是1024,那么每一个库的片数为1024/1024=1,在此大家需要注意,一库一片的非片名连续,所有片名无需后缀(比如tb_0000),也就是说,有1024个库,即有1024个片,但片名是全局一致的,没有任何后缀,全局所有的片名都叫做tab。目前笔者测试环境中所采用的分片方案就是基于一库一片算法的非连续分片方式。总之一句话,任何一个复杂的大型网站,其使用的技术都应该是简单的。 Kratos一库一片所支持的片名连续与非片名连续,如图A-3,和A-4所示:
图A-3 一库一片模式的片名连续
图A-4 一库一片模式的非片名连续
最后补充下,是否是否需要连续分片的Kratos的Sharding配置文件,如下所示:
<bean id="kJdbcTemplate" class="com.gxl.kratos.jdbc.core.KratosJdbcTemplate"> <constructor-arg name="isShard" value="true" /> <property name="dataSource" ref="kDataSourceGroup" /> <property name="wr_weight" value="r0w0" /> <!-- 分片模式,false为库内分片模式,true为一库一表分片模式 --> <property name="shardMode" value="true" /> <!-- 片名是否连续,true为片名连续,false为非片名连续 --> <property name="consistent" value="false" /> <property name="dbRuleArray" value="#userinfo_id|email_hash# % 4" /> </bean>
注意:
目前Kratos还处于1.3阶段,未来还有很长的路要走,现在笔者测试环境上已经在大规模的使用,后续生产环境上将会开始投放使用,因此如果各位在使用过程中有任何疑问,都可以通过企鹅群:150445731进行交流,或者获取Kratos的构件。