Home  >  Article  >  Database  >  Mycat(4):消息表mysql数据库分表实践_MySQL

Mycat(4):消息表mysql数据库分表实践_MySQL

WBOY
WBOYOriginal
2016-06-01 12:59:311108browse

 

1,业务需求

比如一个社交软件,比如像腾讯的qq。可以进行群聊天(gid),也可以单人聊天。
这里面使用到了数据库中间件mycat,和mysql数据表分区。
关于mycat分区参考:
【 数据库垂直拆分,水平拆分利器,cobar升级版mycat】
http://blog.csdn.net/freewebsys/article/details/44046365

2,具体方案设置分区

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

<code class="hljs sql">CREATE TABLE `group_msg` (
  `id` bigint(20) NOT NULL,
  `gid` bigint(20) DEFAULT NULL COMMENT &#39;&#39;,
  `content` varchar(4000),
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`,`gid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
PARTITION BY KEY(`gid`) 
PARTITIONS 100;</code>

数据表中按照gid进行分区,id不是自增,而是使用全局变量生成的。<br> 在mycat中带全局变量生成的函数。这里有个技巧,按照每一个群组做一个全局的id,每个群组的消息都是从1开始。这样每个群组的id就是聊天信息的总数,方便分页查询历史记录使用。历史记录表后面继续分析。

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

分区表可以设置的大些,因为数据放在本地切分成多个文件成本比较低。

3,配置mycat分表

由于mycat配置分表是按照分库进行的。所有需要创建多个数据库。<br> 比起表分区是麻烦点。<br> 参考之前博客:<br> 【Mycat 水平分表,垂直分表实践(2)】博客数据表拆分和全局id<br> http://blog.csdn.net/freewebsys/article/details/44399901<br> 其中规则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>

<code class="hljs xml">分区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,总结

 

这个只是消息表的一个简单的设计方案。通过使用成熟的组件搭建的分表方案。同时利用了mysql分区和mycat分表两个结合下。 

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

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn