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配置不需要客户端修改。

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都要修改,修改成按月进行查询。把日期参数传入。数据库的扩展性增强了,可以支持数据持续增长的业务了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 21:59:17

Mycat(5):聊天消息表数据库按月分表实践,平滑扩展的相关文章

Mycat(6):聊天消息表,按月分表 java客户端跨月查询数据

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/47039103 未经博主允许不得转载. 1,业务需求 上次分析聊天业务按照月进行拆.http://blog.csdn.net/freewebsys/article/details/47003577 具体拆分方案已经有了: 但是在操作的时候还是有点小问题,但基本上是按照这个设计实现的. 首先是mycat的,mycat正式版本是1.3.0.3-release,但是这个不包括Parti

数据库-数据库设计-分库分表

为什么要分库分表 分库分表的设计 带来的问题 扩容 分布式事务 多个路由字段怎么设置 关于分库分表最全的一篇文章 这里介绍设计分库分表框架时应该考虑的设计要点,并给出相应的解决方案. 一.整体的切分方式 简单来说,数据的切分就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果,即分库分表. 数据的切分根据其切分规则的类型,可以分为如下两种切分模式. 垂直(纵向)切分:把单一的表拆分成多个表,并分散到不同的数据库(主机)上. 水平(横

数据库(分库分表)中间件对比

转自:http://www.cnblogs.com/cangqiongbingchen/p/7094822.html 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表呢,还是一张表.分区可以把表分到不同的硬盘上,但不能分配到不同服务器上. 优点:数据不存在多个副本,不必进行数据复制,性能更高. 缺点:分区策略必须经过充分考虑,避免多个分区之间的数

mysql数据库为什么要分表和分区?

一般下载的源码都带了MySQL数据库的,做个真正意义上的网站没数据库肯定不行. 数据库主要存放用户信息(注册用户名密码,分组,等级等),配置信息(管理权限配置,模板配置等),内容链接(html ,图片,声音,视频等等的路径).那mysql数据库为什么要分表和分区? 为什么要分表和分区? 我们的数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询书读变慢,而且 由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈. mysql 中有一种机制是表锁定和行锁定,是为了保证数据的完整性

数据库优化之分表

数据库优化之分表说明分割方式垂直分割水平分割水平分割方案数据库分片方案创建中间表说明单表数据量大,这时分成多个表,并行查询单表字段内容大,将大字段分离到另一个表,减少第一个表io建议超500万以上再做分表,而却精良将表放在不同物理机上,这时会出现不同数据库事物的问题,所以复杂度也就高了,所以分表需要全面考虑分表后的优势是否大于劣势分割方式垂直分割垂直分割适用于记录不是非常多的,但是字段却很多,这样占用空间比较大,检索时需要执行大量的I/O,严重降低了性能,这个时候需要把大的自读那拆分到另一个表中

mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表

之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表,我是按月分的,每个月一张表,这时候的问题是 数据库有多张同样的分表如何根据条件查询? 在进行分页的时候如何计算总记录数?如何查询出所有分表? 每个月的新表是如何创建?系统如何自动创建? 不确定哪个分表的情况如何查询某一条详细记录? 分表查询分表查询可以用union或者union all进行查询uni

数据库水平切分的原理探讨、设计思路--数据库分库,分表,集群,负载均衡器

本文转载:http://www.cnblogs.com/olartan/archive/2009/12/02/1615131.html 第1章  引言 数据量巨大时,首先把多表分算到不同的DB中,然后把数据根据关键列,分布到不同的数据库中.库分布以后,系统的查询,io等操作都可以有多个机器组成的群组共同完成了.本文主要就是针对,海量数据库,进行分库.分表.负载均衡原理,进行探讨,并提出解决方案. 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每

MySQL之按月拆分主表并按月分表写入数据提高数据查询速度

使用场景: 主表数据量特别大,为了提高查询的速度,可以考虑按月进行分表,要求就是当月的数据到当月表查询,上月的数据到上月表查询,当天的数据到主表来查询.这样在一定程度上也是提高了数据的查询速度 过程演示: 1.创建总表: CREATE TABLE `zong_biao` ( `id` int(8) NOT NULL AUTO_INCREMENT, `username` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `password` varchar

mysql分表方法-----MRG_MyISAM引擎分表法

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解. 首先,我们需要想好到底分多少个表,前提当然是满足应用.这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个表,其取值也很好做,就是对10进行取模.另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了. 好了,先来创建表吧,