水平拆分实现 - 按ID分片

MyCat Nicholas 2018-11-28 260浏览
相关标签: MyCat

image.png

水平拆分:通俗来讲就是将大表按行还拆分


在一般的应用系统中,用户表及其密切相关的关联表,可根据“用户表”(eg:t_user)中的“用户ID”(user_id)进行水平切分,并基于MyCAT的E-R关系分片策略将其密切相关的表(eg:t_user_class_rel)也分到对应的库中。

多(2)实例实现水平拆分:192.168.1.195:3306、192.168.1.18:3306

在每个实例上新建库、表:

CREATE DATABASE IF NOT EXISTS `mycat_node1`;

全局表:

CREATE TABLE `t_area` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
 `caller` varchar(16) CHARACTER SET utf8 DEFAULT NULL COMMENT '调用方系统表示',
 `province_code` varchar(10) CHARACTER SET utf8 NOT NULL COMMENT '省份编码',
 `area_code` varchar(10) CHARACTER SET utf8 NOT NULL COMMENT '区域编码',
 `area_name` varchar(100) CHARACTER SET utf8 DEFAULT NULL COMMENT '区域名称',
 `parent_area_code` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '父区域编码',
 `create_time` datetime NOT NULL COMMENT '创建时间',
 `modify_time` datetime DEFAULT NULL COMMENT '修改时间',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3792 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

分片表 t_user:

DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
 `user_id` int(11) NOT NULL COMMENT '用户ID',
 `receive_address` varchar(256) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '收货地址',
 `create_time` datetime NOT NULL,
 `province_code` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
 PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户信息表';

节点测试表:

DROP TABLE IF EXISTS `t_node`;
CREATE TABLE `t_node` (
 `vid` int(11) NOT NULL COMMENT 'ID',
 `user_id` int(11) NOT NULL COMMENT '用户ID',
 `note` varchar(256) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'note',
 `create_time` datetime NOT NULL,
 PRIMARY KEY (`vid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='note表';

schema.xml 配置:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <schema name="mycat" checkSQLschema="true" sqlMaxLimit="100">
        <table name ="t_user" primaryKey="user_id" dataNode="dn1,dn2" rule="rule1" />
        <table name ="t_node" autoIncrement="true" primaryKey="vid" dataNode="dn1,dn2" rule="rule1" />
        <table name ="t_area" type="global" primaryKey="ID" dataNode="dn1,dn2" />
    </schema>
    <dataNode name="dn1" dataHost="jdbchost1" database="mycat_node1" />
    <dataNode name="dn2" dataHost="jdbchost2" database="mycat_node1" />
    <dataHost name="jdbchost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" >
        <heartbeat>select 1</heartbeat>
        <writeHost host="db195" url="192.168.1.195:3306" user="root" password="zhujie1986">
            <readHost host="db18" url="192.168.1.18:3310" user="root" password="zhujie1986" />
        </writeHost>
    </dataHost>
    <dataHost name="jdbchost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" >
        <heartbeat>select 1</heartbeat>
        <writeHost host="db1806" url="192.168.1.18:3306" user="root" password="zhujie1986">
        </writeHost>
    </dataHost>
</mycat:schema>

rule.xml 配置:

<tableRule name="rule1">
    <rule>
        <columns>user_id</columns>
        <algorithm>func1</algorithm>
    </rule>
</tableRule>
<function name="func1" class="org.opencloudb.route.function.PartitionByLong">
<property name="partitionCount">2</property>
<property name="partitionLength">512</property>

server.xml 配置:

<user name="test_rw">
    <property name="password">test_rw</property>
    <property name="schemas">mycat</property>
</user>
<user name="test_ro">
    <property name="password">test_ro</property>
    <property name="schemas">mycat</property>
    <property name="readOnly">true</property>
</user>
insert into t_user(user_id,receive_address,create_time,province_code) values('6','广州市越秀区广州大道中604号','now()','GD');
insert into t_user(user_id,receive_address,create_time,province_code) values('7','广州市越秀区广州大道中605号','now()','GD');
insert into t_user(user_id,receive_address,create_time,province_code) values('8','广州市越秀区广州大道中606号','now()','GD');
insert into t_user(user_id,receive_address,create_time,province_code) values('9','广州市越秀区广州大道中607号','now()','GD');
insert into t_user(user_id,receive_address,create_time,province_code) values('10','广州市越秀区广州大道中608号','now()','GD');
.........
mysql -utest_rw -ptest_rw -P8066 -h192.168.1.220
use mycat;
source tt.sql
select count(*) from mycat.t_user; 
2050

然后分别在2台分片实例上查询数据量,以及数据分片情况:

2实例数据和为 2050


数据根据 user_id 进行分布,当 user_id%512=0 时,数据分片插入。

insert into t_area values(100,'test','ZX','1','全','0',now(),now());

2个实例都会插入数据


相关标签: MyCat
相关文章
1. 问题:分表的自增主键重复 现象: 对point_msg_his和broadcast_msg_his表进行了分表操作,该表有自增主键id,分表键使用的是其他字段。 在sqlmap中的insert语句: <!--table insert--> <insert id="insert" parameterClass="pointMsgHisDO" > insert into&nb继续阅读>>
2018-12-01 600浏览 2个赞
分片规则: 1:官方建议是做成MyCAT Cluster  ,但是测试环境中开启两个MyCAT,会有时而连不上的问题; 2:MyCAT 在修改配置文件之后,可以通过 reload @@config ,在不重启的情况下更新配置:比如修改schema.xml  <table /> <dataNode /> <dataHost />,server.xml 。但是在管理端口看不到修改后的配置信息。 3:对节点、表的扩展操作可以执继续阅读>>
2018-11-28 347浏览 0个赞
数据库配置方式: 在数据库中建立一张表,存放sequence 名称(name) sequence 当前值(current-value),步长(increment int 类型每次读取多少个 sequence,假设为 K)等信息 创建全局序列表: CREATE TABLE MYCAT_SEQUENCE     (`name` VARCHAR(50) NOT NULL,    继续阅读>>
2018-11-28 288浏览 0个赞
表 tdate 的数据水平分布在3 个数据库上 新建3个数据库: CREATE DATABASE db1; CREATE DATABASE db2; CREATE DATABASE db3; 每个数据库新建表: CREATE TABLE `tdate` (    `id` INT(11) NOT NULL,   &nbs继续阅读>>
2018-11-28 411浏览 0个赞
水平拆分:通俗来讲就是将大表按行还拆分 在一般的应用系统中,用户表及其密切相关的关联表,可根据“用户表”(eg:t_user)中的“用户ID”(user_id)进行水平切分,并基于MyCAT的E-R关系分片策略将其密切相关的表(eg:t_user_class_rel)也分到对应的库中。 多(2)实例实现水平拆分:192.168.1.195:3306、192.168.1.18:3306 在每个实例上新建库、表: CREATE DATABAS继续阅读>>
2018-11-28 259浏览 1个赞
垂直切分即常说的分库,降低数据库耦合性。可以配置同一个实例下不同库,不同实例下不同库 schema.xml 配置 <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/"> 继续阅读>>
2018-11-28 184浏览 0个赞
1、安装 JAVA 环境,必须是 JDK7 或更高版本 yum search JDK yum install java-1.7.0 java -version     java version "1.7.0_95"     OpenJDK Runtime Environment (rhel-继续阅读>>
2018-11-28 287浏览 2个赞
版权声明
本站的文章和资源来自互联网或者站长的原创。如果有侵犯版权的资源请尽快联系站长,我们会在24h内删除有争议的资源。