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

1,业务需求

比方一个社交软件,比方像腾讯的qq。

能够进行群聊天(gid),也能够单人聊天。

这里面使用到了数据库中间件mycat,和mysql数据表分区。

关于mycat分区參考:

【 数据库垂直拆分,水平拆分利器,cobar升级版mycat】

http://blog.csdn.net/freewebsys/article/details/44046365

2,详细方案设置分区

利用mysql分区,假设mysql数据表简单的为:

CREATE TABLE `group_msg` (
`id` bigint(20) NOT NULL,
`gid` bigint(20) DEFAULT NULL COMMENT '',
`content` varchar(4000),
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`,`gid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
PARTITION BY KEY(`gid`)
PARTITIONS 100;

数据表中依照gid进行分区。id不是自增,而是使用全局变量生成的。

在mycat中带全局变量生成的函数。

这里有个技巧,依照每一个群组做一个全局的id,每一个群组的消息都是从1開始。

这样每一个群组的id就是聊天信息的总数。方便分页查询历史记录使用。历史记录表后面继续分析。

參考:http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations.html

分区表能够设置的大些,由于数据放在本地切分成多个文件成本比較低。

3。配置mycat分表

由于mycat配置分表是依照分库进行的。全部须要创建多个数据库。

比起表分区是麻烦点。

參考之前博客:

【Mycat 水平分表,垂直分表实践(2)】博客数据表拆分和全局id

http://blog.csdn.net/freewebsys/article/details/44399901

当中规则xml的配置例如以下:

<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/">
<!--article 分区配置,依照id进行模10。假设拆分成20个库模20。-->
<tableRule name="mod-long">
<rule>
<columns>user_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long"
class="org.opencloudb.route.function.PartitionByMod">
<property name="count">10</property>
</function> </mycat:rule>

分区schema配置文件:

<?xml version="1.0"?

>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100">
<table name="MYCAT_SEQUENCE" primaryKey="name" type="global" dataNode="nodeUser" />
</schema> <schema name="group_msg" checkSQLschema="false" sqlMaxLimit="100">
<table name="group_msg" primaryKey="gid" dataNode="nodeGroupMsg01,nodeGroupMsg02,nodeGroupMsg03,nodeGroupMsg04,nodeGroupMsg05,nodeGroupMsg06,nodeGroupMsg07,nodeGroupMsg08,nodeGroupMsg09,nodeGroupMsg10" rule="mod-long" />
</schema> <!--拆分成5 组机器。每一个机器上面两个数据库。假设压力大,直接拆分成10个机器,再多拆成20个库。 -->
<dataNode name="nodeGroupMsg01" dataHost="dataHost01" database="group_msg_01" />
<dataNode name="nodeGroupMsg02" dataHost="dataHost01" database="group_msg_02" /> <dataNode name="nodeGroupMsg03" dataHost="dataHost02" database="group_msg_03" />
<dataNode name="nodeGroupMsg04" dataHost="dataHost02" database="group_msg_04" /> <dataNode name="nodeGroupMsg05" dataHost="dataHost03" database="group_msg_05" />
<dataNode name="nodeGroupMsg06" dataHost="dataHost03" database="group_msg_06" /> <dataNode name="nodeGroupMsg07" dataHost="dataHost04" database="group_msg_07" />
<dataNode name="nodeGroupMsg08" dataHost="dataHost04" database="group_msg_08" /> <dataNode name="nodeGroupMsg09" dataHost="dataHost05" database="group_msg_09" />
<dataNode name="nodeGroupMsg10" dataHost="dataHost05" database="group_msg_10" /> <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select 1</heartbeat>
<writeHost host="hostM1" url="192.168.100.1:3306" user="root" password="root"/>
</dataHost> <dataHost name="dataHost02" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select 1</heartbeat>
<writeHost host="hostM1" url="192.168.100.2:3306" user="root" password="root"/>
</dataHost> <dataHost name="dataHost03" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select 1</heartbeat>
<writeHost host="hostM1" url="192.168.100.3:3306" user="root" password="root"/>
</dataHost> <dataHost name="dataHost04" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select 1</heartbeat>
<writeHost host="hostM1" url="192.168.100.4:3306" user="root" password="root"/>
</dataHost> <dataHost name="dataHost05" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select 1</heartbeat>
<writeHost host="hostM1" url="192.168.100.5:3306" user="root" password="root"/>
</dataHost> </mycat:schema>

考虑依照数据库拆分成本比較高。直接拆分成10个数据库,分别放到5个机器上面。假设压力大能够直接放到10个机器上面。

实际上表分区加上mycat,一个拆了100*10个文件。

依照每一个文件能承载1000w条记录算,能够承受100亿数据。

这个当然是理论了。假设日活100w,每人发10条,基本上够2-3年使用的了。

4,总结

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

这个仅仅是消息表的一个简单的设计方案。通过使用成熟的组件搭建的分表方案。

同一时候利用了mysql分区和mycat分表两个结合下。

毕竟一个mysql物理机器不能分太多文件,两个结合起来效率就高了。达到一个运维成本低,毕竟线上mysql数据库要配置master-slave。拆的多维护的多。

Mycat(4):消息表mysql数据库分表实践的更多相关文章

  1. MySQL数据库分表的3种方法

    原文地址:MySQL数据库分表的3种方法作者:dreamboycx 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目 ...

  2. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变

    [Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...

  3. MySQL数据库分表分区(一)(转)

    面对当今大数据存储,设想当mysql中一个表的总记录超过1000W,会出现性能的大幅度下降吗? 答案是肯定的,一个表的总记录超过1000W,在操作系统层面检索也是效率非常低的   解决方案: 目前针对 ...

  4. mysql 数据库 分表后 怎么进行分页查询?Mysql分库分表方案?

    Mysql分库分表方案 1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. m ...

  5. 阅读之MySQL数据库分表

    移动互联网时代,海量的用户数据每天都在产生,基于用户使用数据等这样的分析,都需要依靠数据统计和分析,当数据量小时,数据库方面的优化显得不太重要,一旦数据量越来越大,系统响应会变慢,TPS直线下降,直至 ...

  6. mysql 数据库分表小实例

    项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询书读变慢,而且由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈. 当出现这种情况时,我们可以考虑分表,即将单 ...

  7. 亿条数据在PHP中实现Mysql数据库分表100张

    当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过程如下: 首先创建100张表: $i=0; while($i<=9 ...

  8. 1亿条数据在PHP中实现Mysql数据库分表100张

    当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过程如下: 首先创建100张表: $i=0; while($i<=9 ...

  9. php+mysql 数据库分表分段备份程序--宋正河

    <?php //宋正河 转载请注明出处 set_time_limit(0); header('content-type:text/html;charset=utf-8'); mysql_conn ...

随机推荐

  1. 【SQL】175. Combine Two Tables

    Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...

  2. 小数据池,bytes

    '''python2 python3 '''#python2#print() print 'abc'#range() xrange() 生成器# raw_input() #python3#print( ...

  3. 【BZOJ 4662】 4662: Snow (线段树+并查集)

    4662: Snow Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 136  Solved: 47 Description 2333年的某一天,临冬突 ...

  4. [CC-ANUCBC]Cards, bags and coins

    [CC-ANUCBC]Cards, bags and coins 题目大意: 给你\(n(n\le10^5)\)个数,\(q(q\le30)\)次询问,问从中选取若干个数使得这些数之和为\(m(m\l ...

  5. 【树链剖分/倍增模板】【洛谷】3398:仓鼠找sugar

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  6. bzoj 1014 LCP 二分 Hash 匹配

    求同一字符串的两个后缀的最长公共前缀. 将字符串按位置放到Splay中维护(每个节点还维护一下该子树的hash),然后二分前缀的长度,用splay计算出指定范围的hash,按hash是否相等来判断是否 ...

  7. PAT甲级1095. Cars on Campus

    PAT甲级1095. Cars on Campus 题意: 浙江大学有6个校区和很多门.从每个门口,我们可以收集穿过大门的汽车的进/出时间和车牌号码.现在有了所有的信息,你应该在任何特定的时间点告诉在 ...

  8. MySQL主库切换那些事

    最近连续经历了机架掉电和交换机挂掉,着实切了不少主库,虽然过程心惊胆跳,但是也算是上过战场,经过了实战演习,相信TEAM中的小伙伴们对于切主库已经可以驾轻就熟了. MySQL的主库切换也属于DBA的一 ...

  9. Object-C—集合

    Obejct-C中包含了三种集合,分别是:数组.字典和集(set).       数组和C语言中的数组相似,但是OC中的数组只能存储对象,不能存储基本数据类型,如int.float.enum.stru ...

  10. WIFI模块 RTL8188EUS Realtek

    http://item.taobao.com/item.htm?spm=a230r.1.14.24.KnooKa&id=26119704895 W12 产品是一款采用国际先进台湾瑞昱Realt ...