本文的原文连接是: 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. javascript入门教程笔记

    BOM BOM 是“ Browser Object Model ”的缩写,简称“ 浏览器对象模型 ”. BOM 定义了 JavaScript 操作浏览器的接口,提供了访问某些功能(如浏览器窗口大小.版 ...

  2. XML XSD XSL区别与联系

    XML: XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准 ...

  3. Codeforces 622 F. The Sum of the k-th Powers

    \(>Codeforces \space 622\ F. The\ Sum\ of\ the\ k-th\ Powers<\) 题目大意 : 给出 \(n, k\),求 \(\sum_{i ...

  4. AHOI2018训练日程(3.10~4.12)

    (总计:共90题) 3.10~3.16:17题 3.17~3.23:6题 3.24~3.30:17题 3.31~4.6:21题 4.7~4.12:29题 ZJOI&&FJOI(6题) ...

  5. Linux sort 排序 去重 统计

    先写一个命令: cut -d' ' -f1 ~/.bash_history|sort -d | uniq -c|sort -nr|head 这个命令可以统计你历史上输入的命令的次数的前十条 整个命令基 ...

  6. BZOJ 4517: [Sdoi2016]排列计数 错排公式

    4517: [Sdoi2016]排列计数 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4517 Description 求有多少种长度为 ...

  7. PAT甲级1095. Cars on Campus

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

  8. Ubantu14.04下编译OpenCV3.0.0以及读取图片例子

    以前一直使用opencv 2.x的版本,现在3.0的已经发布成正式版了,尝试在Linux下安装. 收集了一篇不错的经验教程: Ubuntu14.04下安装OpenCV3.0经验. 编译的过程大概需要3 ...

  9. mysql server has gone away的原因

    之前遇到开发询问“mysql server has gone away”的问题,想当然的就认为是由于太长时间没有操作,导致超过MySQL服务端上的wait_timeout的设置,最终连接被MySQL服 ...

  10. ios/object-c中的UIColor一些比较偏的颜色展示/示例

    UIColor blackColor]; [UIColor darkGrayColor]; [UIColor lightGrayColor]; [UIColor grayColor]; [UIColo ...