数据库分表分库

分片策略

垂直分片

将同一个功能模块的表切分到不同的数据库中,查询的时候比较方便,分片也比较简单。适用场景:表比较多,但是每张表的数据量不多。

水平分片

将每张表的内容水平分开,根据相应地策略分到不同的数据库中(比如按照id取余),这样在查询的需要借助数据库中间件来联合查询。但是当你获得到根ID后,可以按照id的规则计算出这个根数据所存储的数据库,再到相应地数据库查询详细信息。这样分片比较复杂,而且查询也比较麻烦。适用场景:表比较少,但是每张表的数据量比较大。

垂直分片+水平分片

这种联合分片规则是最常用的,因为复杂的系统往往即有非常多的表,也有某些表的数据量超大。这样就需要我们先对数据库按照功能模块进行垂直分片,再对需要水平分片的表进行水平分片。

主键

分片后的数据要求主键唯一性,就不能依赖数据库的主键自增长了,需要我们维护一套主键系统。

  • 可以适用uuid来保证唯一性,优点是:生成非常方便。缺点:uuid非常长,对于数据量比较大得表,非常占资源,也占索引。
  • 可以在每台服务器上面创建一张Sequence表记录每张分片表的最后插入ID。然后根据数据库的集群个数,给每个数据库设置一个编号,在insert的时候,随机从所有集群数据库中获取这张表中对应的ID然后加上数据库的编号,即为要插入的id,同时更新Sequence表中分片表的id为下次insert做准备(要保证事务原子性)。
  • 也可以利用缓存:Redis、Memcached来将每张表的主键缓存起来,每次insert的时候+1.

MYCAT示例

去mycat官方下载1.6RELEASE版本,并解压。

server配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
        <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
        <property name="handleDistributedTransactions">0</property>
        <property name="serverPort">8066</property>
    </system>
    <user name="root">
        <property name="password"></property>
        <property name="schemas">test</property>
    </user>
</mycat:server>


schema配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="test" checkSQLschema="true" sqlMaxLimit="100">
        <table name="User" primaryKey="id" dataNode="dn1,dn2,dn3" rule="mod-long" />
    </schema>
    <dataNode name="dn1" dataHost="localhost1" database="test"/>
    <dataNode name="dn2" dataHost="localhost1" database="or_test"/>
    <dataNode name="dn3" dataHost="localhost1" database="bdkcf"/>
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select 1</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM1" url="localhost:3306" user="root"
                   password="">
            <!-- can have multi read hosts -->
            <readHost host="hostS2" url="localhost:3306" user="root" password="" />
        </writeHost>
    </dataHost>
</mycat:schema>

这里采用取摸分片。

启动

进入mycat bin目录下启动mycat:./mycat console 前台运行。

分片规则

  • mod-long 对id进行取摸运算。优点:数据分布均匀。缺点:进行缩容扩容的时候需要对所有数据进行迁移。
  • sharding-by-murmur 一致性hash运算。优点:mycat原生支持数据迁移。且不需要对所有数据进行迁移,只需要迁移某一个库的数据。缺点:数据分布相对不太均匀。

数据库连接

spring:
    datasource:
        name: test
        url: jdbc:mysql://127.0.0.1:8066/test
        username: root
        password:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        

主键生成

配合redis使用,每次启动服务的时候,去数据库查询要分片的表最后一条ID,存入redis中。table:xx:id -> id。每次新增的时候从redis中获取该表的id,然后+1返回并重置redis的value。这是一种比较简单的方法,当然也可以采用主键生成框架来做这件事。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容