zoukankan      html  css  js  c++  java
  • Mycat(5):聊天消息表数据库按月分表实践,平滑扩展

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/47003577 未经博主同意不得转载。

    1,业务需求

    比方一个社交软件,比方像腾讯的qq。能够进行群聊天(gid),也能够单人聊天。


    数据量按月添加须要按月进行数据库拆分。
    比方依照2015年进行12个月拆分,同一时候能够配合gid进行水平拆分,也能够利用mysql分区。


    mycat官方也推荐这样使用。这样能够添加单机单数据库的数据量。由于文件分开了。

    关于mycat分区參考:
    【 数据库垂直拆分,水平拆分利器。cobar升级版mycat】
    http://blog.csdn.net/freewebsys/article/details/44046365

    2,按月分表方案

    首先将消息表拆分成12个月表。同一时候每个月表能够拆分成100个分区表。mysql分区运行起来灵活。按月分表能够随时间一直分下去,一次创建好一年的分表。基本上不须要数据迁移。

    相比数据库的分区最大的优点就是能够跨多个数据库进行分区。能够做到吞吐量是单机的N倍。扩展性好。数据库能够是一个实体机器,也能够一个实体机器多个数据库,配置灵活。全然在mycat配置不须要client改动。

    mysql数据库创建语句:

    CREATE TABLE `msg` (
      `id` bigint(20) NOT NULL,
      `gid` bigint(20) DEFAULT NULL COMMENT '群id。mysql分区字段',
      `content` varchar(4000),
      `create_time` datetime DEFAULT NULL COMMENT '创建时间',
      `create_date` int(8) DEFAULT NULL COMMENT '按月分表字段。不能为空。',
      PRIMARY KEY (`id`,`gid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    PARTITION BY KEY(`gid`) 
    PARTITIONS 100;

    參考之前博客:
    【Mycat 水平分表,垂直分表实践(2)】博客数据表拆分和全局id
    http://blog.csdn.net/freewebsys/article/details/44399901

    当中规则xml的配置例如以下:依照自然月进行分区。分区字段是create_date

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:rule SYSTEM "rule.dtd">
    <mycat:rule xmlns:mycat="http://org.opencloudb/">
        <!--msg 分区配置,依照自然月进行分区,分区字段是create_date-->
    
        <tableRule name="sharding-by-month"> <rule>
            <columns>create_date</columns>
            <algorithm>sharding-by-month</algorithm> </rule>
        </tableRule>
        <function name="sharding-by-month" class="org.opencloudb.route.function.PartitionByMonth">
            <property name="dateFormat">yyyyMMdd</property> 
            <property name="sBeginDate">20150101</property>
        </function>
    </mycat:rule>
    

    schema.xml配置:

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://org.opencloudb/">
    
            <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100">
                    <table name="MYCAT_SEQUENCE" primaryKey="name" type="global" dataNode="dataHost01" />
            </schema>
    
            <schema name="msg" checkSQLschema="false" sqlMaxLimit="100">
                <table name="msg" primaryKey="create_date" dataNode="nodeMsg201501,nodeMsg201502,nodeMsg201503,nodeMsg201504" rule="sharding-by-month" />
            </schema>
    
            <!--依照月份进行拆分,一次做好一年的数据库。同一时候数据库中。能够依据实际情况在做mysql分区。-->
            <dataNode name="nodeMsg201501" dataHost="dataHost01" database="msg_201501" />
            <dataNode name="nodeMsg201502" dataHost="dataHost01" database="msg_201502" />
    
            <dataNode name="nodeMsg201503" dataHost="dataHost01" database="msg_201503" />
            <dataNode name="nodeMsg201504" dataHost="dataHost01" database="msg_201504" />
    
            <!-- 能够一直按月分区下去。 -->
    
            <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0"
                    writeType="0" dbType="mysql" dbDriver="native">
                    <heartbeat>select 1</heartbeat>
                    <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root"/>
            </dataHost>
    
    </mycat:schema>

    说明:这里按自然月分区须要使用1.4的版本号。里面包含规则类。或者把这个类复制到1.3的jar里面也行。

    4,总结

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/47003577 未经博主同意不得转载。

    使用mycat能够大大提高数据库的存储能力,对于每月自然增长的数据,按月存储是最好的办法。同一时候每个组使用自己的id自增策略,都从1開始计算,这样在查询历史数据的适合也按月进行迭代查询,当然全部牵扯到查询的sql都要改动,改动成按月进行查询。把日期參数传入。

    数据库的扩展性增强了,能够支持数据持续增长的业务了。

  • 相关阅读:
    DecimalFormat
    flex 分页
    flex 分页
    算法学习——st表
    [USACO07DEC]美食的食草动物Gourmet Grazers
    [ZJOI2005]沼泽鳄鱼 矩阵乘法
    [SCOI2010]序列操作 线段树
    [LNOI2014]LCA
    [AHOI2013]作业 & Gty的二逼妹子序列 莫队
    Linux相关——关于文件调用
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7232143.html
Copyright © 2011-2022 走看看