本文的原文连接是: 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. JSP文件管理后门工具jsp-file-browser

    JSP文件管理后门工具jsp-file-browser   在网页后门中,快速浏览服务器文件非常重要.为此,Kali Linux新增了一款JSP后门工具jsp-file-browser.该工具提供所有 ...

  2. 活动a 使用 启动为结果 方法 启动 活动 b, b什么都不做 并返回给a,a中的 在活动结果时候 回调 是否被执行?

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 活动a 使用 启动为结果 方法 启动 活动 b, b什么都不做 并返回给a,a中的 在活 ...

  3. python开发_count()

    python中的count()函数,从字面上可以知道,他具有统计功能 下面来看看具体的demo: 功能:读取一个文件'c:\\test.txt',统计出该文件中出现字符'a'的次数 #python o ...

  4. 2015 UESTC 搜索专题J题 全都是秋实大哥 kmp

    全都是秋实大哥 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Desc ...

  5. PAT甲级1098. Insertion or Heap Sort

    PAT甲级1098. Insertion or Heap Sort 题意: 根据维基百科: 插入排序迭代,消耗一个输入元素每次重复,并增加排序的输出列表.在每次迭代中,插入排序从输入数据中删除一个元素 ...

  6. <摘录>CentOS6.5下添加epel源

    0.安装yum优先级插件 yum install yum-priorities 1.epel简介: https://fedoraproject.org/wiki/EPEL/zh-cn rpm -Uvh ...

  7. Surface Mount Package Details

    http://www.centralsemi.com/product/packages/index2.php http://www.infineon.com/cms/cn/product/packag ...

  8. 【转】2012年6月25 – 某欧美上市企业PHP工程师最新面试题

    笔试: 尼玛,连页眉页脚都是英文!不过都还能读懂.题目很简单.印象深刻的有几题. 具体题目忘了,主要知识点考点是,建立的视图,实现有自增字段. 答:之前还真没考虑过这个问题.当时条件发射,给了一个用户 ...

  9. 关于npm run build 卡住不动的坑。。。

    起因:最近开发个项目使用的vue,有些功能需要生产版本放服务器上测试,这就出问题了..卡住了,不动了,还不报错 这是在vscode的终端里面,试了git hash,试了cmd , 试了powershe ...

  10. CDMA,GPRS,3G有什么区别

    1 CDMA: 我们常说的CDMA 是IS-95A CDMA的简称 ,属于第二代通信技术(2G)的一种,属于北美的技术.另一种技术是GSM,属于欧洲的技术.这两种实现的原理不同,各有各的优点: 2 G ...