Mycat(4):消息表mysql数据库分表实践
本文的原文连接是: 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数据库分表实践的更多相关文章
- MySQL数据库分表的3种方法
原文地址:MySQL数据库分表的3种方法作者:dreamboycx 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目 ...
- 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变
[Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...
- MySQL数据库分表分区(一)(转)
面对当今大数据存储,设想当mysql中一个表的总记录超过1000W,会出现性能的大幅度下降吗? 答案是肯定的,一个表的总记录超过1000W,在操作系统层面检索也是效率非常低的 解决方案: 目前针对 ...
- mysql 数据库 分表后 怎么进行分页查询?Mysql分库分表方案?
Mysql分库分表方案 1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. m ...
- 阅读之MySQL数据库分表
移动互联网时代,海量的用户数据每天都在产生,基于用户使用数据等这样的分析,都需要依靠数据统计和分析,当数据量小时,数据库方面的优化显得不太重要,一旦数据量越来越大,系统响应会变慢,TPS直线下降,直至 ...
- mysql 数据库分表小实例
项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询书读变慢,而且由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈. 当出现这种情况时,我们可以考虑分表,即将单 ...
- 亿条数据在PHP中实现Mysql数据库分表100张
当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过程如下: 首先创建100张表: $i=0; while($i<=9 ...
- 1亿条数据在PHP中实现Mysql数据库分表100张
当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过程如下: 首先创建100张表: $i=0; while($i<=9 ...
- php+mysql 数据库分表分段备份程序--宋正河
<?php //宋正河 转载请注明出处 set_time_limit(0); header('content-type:text/html;charset=utf-8'); mysql_conn ...
随机推荐
- [NOI2014]购票 --- 斜率优化 + 树形DP + 数据结构
[NOI2014]购票 题目描述 今年夏天,NOI在SZ市迎来了她30周岁的生日. 来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每 ...
- [待码][BZOJ1858]SCOI2010序列操作 jzyzoj1655
待码的线段树.....太长了看上去不是很想写 [ 什么破理由啊摔,不要脸 ] 嗯先水几道再写
- 【插头DP】BZOJ3125-city
开学忙成狗,刷题慢如蜗牛…… [题目大意] 给出一个m*n的矩阵里面有一些格子为障碍物,一些格子只能上下通行,一些格子只能左右通行,一些格子上下左右都能通行.问经过所有非障碍格子的哈密顿回路个数. [ ...
- uoj22 【UR #1】外星人
link 题意: 给一个长为n的序列a[],现在有一个初始值m,问一个1~n的排列p[],满足将m对a[p[i]]顺次取模后得到的值最大,输出最大值和方案数. $n,m\leq 5\times 10^ ...
- [CC-SEABUB]Sereja and Bubble Sort
[CC-SEABUB]Sereja and Bubble Sort 题目大意: 一个\(n(n\le100)\)个数的排列\(A\),有两种操作: 交换两个相邻元素: 等概率随机打乱整个序列. 最多执 ...
- 执行时间 Exercise07_16
import java.util.Arrays; import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:执行时间 * */ pu ...
- 【点分治】【路径小于等于k的条数】【路径恰好等于k是否存在】
POJ1741:Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 29574 Accepted: 9915 Des ...
- Android ConstraintLayout约束控件链接整理
Android新特性介绍,ConstraintLayout完全解析 探索Android ConstraintLayout布局 了解使用Android ConstraintLayout
- Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) D. Little Artem and Dance 模拟
D. Little Artem and Dance 题目连接: http://www.codeforces.com/contest/669/problem/D Description Little A ...
- activemq消息重发机制[转]
大家知道,JMS规范中,Message消息头接口中有setJMSRedelivered(boolean redelivered)和getJMSRedelivered()方法,用于设置和获取消息的重发标 ...