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

时间: 2025-01-24 15:28:51

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

Mysql数据库分库和分表方式(常用)_Mysql

本文主要给大家介绍Mysql数据库分库和分表方式(常用),涉及到mysql数据库相关知识,对mysql数据库分库分表相关知识感兴趣的朋友一起学习吧 1 分库 1.1 按照功能分库 按照功能进行分库.常见的分成6大库: 1 用户类库:用于保存了用户的相关信息.例如:db_user,db_system,db_company等. 2 业务类库:用于保存主要业务的信息.比如主要业务是笑话,用这个库保存笑话业务.例如:db_joke,db_temp_joke等. 3 内存类库:主要用Mysql的内存引擎.

什么是分表和分区 MySql数据库分区和分表方法

1.为什么要分表和分区 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕.分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率. 2.什么是分表和分区 2.1 分表 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构

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

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

PHP操作mysql数据库分表的方法_php实例

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.首先,我们需要想好到底分多少个 表,前提当然是满足应用.这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个表,其取值也很好做,就是对10 进行取模.另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了. 好了,先来创建表吧,代码如下: CREATE TABLE `ttlsa_com`.`article_0` ( `i

PHP操作mysql数据库分表的方法

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.首先,我们需要想好到底分多少个 表,前提当然是满足应用.这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个表,其取值也很好做,就是对10 进行取模.另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了. 好了,先来创建表吧,代码如下: CREATE TABLE `ttlsa_com`.`article_0` ( `i

大数据-关于数据库分表后的 业务逻辑应该是怎么样,求解答!

问题描述 关于数据库分表后的 业务逻辑应该是怎么样,求解答! 数据库有一张表 数据太多 导致查询非常慢,分表后 业务逻辑是怎样的: 假如把一张表分成三张表,那么在项目里面写查询的时候是要连续查三张表么? 解决方案 如果是你的表太宽也就是字段太多可以考虑分表,按业务逻辑拆分如果是数据量太大导致查询缓慢,建议不分表.因为只是查询的话必然会对全表做一次扫描,起不到提高查询效率的作用.可以考虑以下几种方式:1. 通过索引的方式,使用索引字段查询2. 在表上建立分区,查询时指定分区条件3. 如果是关联查询

mysql 分库分表的方法

分表后怎么做全文搜索 1.merge方式分表(不好) 2. 使用 sql union 3 使用Sphinx全文检索引擎 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. 根据个人经验,MySQL执行一个sql的过程如下: 1,接收到sql;2,把sql放到排队队列中 ;3,执行sql;4,返回执行结果.在这个执行过程中最花时间在什么地方呢?第一,是排队等待的时间,第二,

订单表的分库分表方案设计(大数据)

    原创文章,转载注明出处     一.两种方案分库分表    一般业界,对订单数据的分库分表,笔者了解,有两类思路:按照订单号来切分.按照用户id来切分.   方案一.按照订单号来做hash分散订单数据        把订单号看作是一个字符串,做hash,分散到多个服务器去.      具体到哪个库.哪个表存储数据呢?订单号里面的数字来记录着.     现在的微信红包.它的订单分库分表,是对订单号进行hash计算.不是什么取模.取整数.这样数据是均匀分散的.     然后订单号的末尾3个数