本文的原文连接是: 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. GDB 调试工具高级用法

    解决core核心文件转出问题 ulimit -c #查看core文件的生成开关,若为0则关闭 ulimit -c unlimited #打开开关,只在当前shell生效 sudo sh -c 'ech ...

  2. android studio 汉化 美化 个性化 修改 安卓工作室 2.3.3 最新版

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 先看一下效果. 建议全屏看图,或者新标签看图.

  3. 51nod1819 黑白树V2

    简单的题面 给定一棵以1为根的有根树,点可能是黑色或白色,操作如下. 1. 选定一个点x,将x的子树中所有到x的距离为奇数的点的颜色反转.2. 选定一个点x,将点x的颜色反转.3. 选定一个点x,询问 ...

  4. php uncode 转汉字编码

    $test = "%u4E0A%u6D77%u9EC4%u6D66";//$test = '\u5e86\u91cd\u5e86'; //庆重庆$temp = explode('% ...

  5. HDU 5650 so easy 数学

    so easy 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5650 Description Given an array with n integ ...

  6. xcode的ios工程目录结构复习

    目录结构: a.supporting files: main.m和资源文件 xxx-info.plist:包含应用程序相关属性列表,如版本,程序名等 .pch文件:预编译头文件,相当于MFC里的std ...

  7. [Win32]创建模态窗口

    http://www.cnblogs.com/zplutor/archive/2011/02/20/1958973.html 在Win32编程中,如果要显示一个模态窗口,一般是先创建对话框模板,然后使 ...

  8. Druid如何自动根据URL自动识别DriverClass的

    Druid是根据url前缀来识别DriverClass的,这样使得配置更方便简洁. 前缀 DriverCLass 描述信息 jdbc:odps com.aliyun.odps.jdbc.OdpsDri ...

  9. pytest文档10-命令行传参

    前言 命令行参数是根据命令行选项将不同的值传递给测试函数,比如平常在cmd执行"pytest --html=report.html",这里面的"--html=report ...

  10. 【php】利用php的构造函数与析构函数编写Mysql数据库查询类 (转)

    上次在<[php]利用原生态的JavaScript Ajax为php进行MVC分层设计,兼容IE6>(点击打开链接) 一文中,对于php查询Mysql数据库的model.php写法还不够完 ...