设为首页 加入收藏

TOP

Mycat水平分表,垂直分表实践(2)(一)
2015-11-21 01:31:33 来源: 作者: 【 】 浏览:0
Tags:Mycat 平分 垂直 实践

1,迁移数据

举例说明,比如一个博客数据库数据表如下:
这里水平拆分,垂直拆分,只是做个简单的实验,真正的线上业务要根据情况,数据进行拆分。

--分类
CREATE TABLE category (
    id INT NOT NULL AUTO_INCREMENT,
    user_id INT NOT NULL,
    name VARCHAR(200) NOT NULL,
    PRIMARY KEY (id)
);
--标签
CREATE TABLE tag (
    id INT NOT NULL AUTO_INCREMENT,
    user_id INT NOT NULL,
    name VARCHAR(100) NOT NULL,
    PRIMARY KEY (id)
);
--文章
CREATE TABLE `article` (
  `id` int(11) NOT NULL PRIMARY KEY ,
  `user_id` int(11) NOT NULL,
  `title` varchar(200) NOT NULL,
  `abstract` text,
  `content` text,
  `publish_time` datetime NOT NULL,
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  `category_id` int(11) NOT NULL,
  KEY `category_id` (`category_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--标签
CREATE TABLE article_tags (
    user_id INT NOT NULL,
    article_id INT NOT NULL,
    tag_id INT NOT NULL,
    PRIMARY KEY (user_id,article_id,tag_id)
);
--用户信息
CREATE TABLE user_info (
    id INT NOT NULL AUTO_INCREMENT,
    email VARCHAR(200) NOT NULL,
    name VARCHAR(200) NOT NULL,
    password VARCHAR(100) NOT NULL,
    create_time DATETIME NOT NULL,
    update_time DATETIME NOT NULL,
    last_login_time DATETIME NOT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY (name)
);
--链接
CREATE TABLE link (
    id INT NOT NULL AUTO_INCREMENT,
    user_id INT NOT NULL,
    name VARCHAR(100) NOT NULL,
    url VARCHAR(300) NOT NULL,
    PRIMARY KEY (id),
    KEY (user_id)
 );

将所有数据都迁移到mycat中,一共有4个数据库,blog01,blog02,blog_article01,blog_article02。
article,article_tags分别在blog_article01,blog_article02,按照uid进行水平拆分。
user_info表在blog01,link,category,tag在blog02数据库中。

CREATE DATABASE blog01 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE blog02 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE blog_article01 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE blog_article02 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
#创建一共mycat数据库,存储mycat相关数据比如sequence。
CREATE DATABASE mycat DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

2,schema.xml,配置




        
                
                
mysql" dbDriver="native"> select 1

配置4个数据库连接,user_info做垂直拆分(配置type=global)。
blog_article,数据库进行水平拆分,拆分成两个数据库。
当设置成全局表的时候必须保证这个表在所有的数据库中,和配置的dataNode无关。
article规则配置:



    
    
        
            user_id
            mod-long
        
    

    
        2
    

配置service.xml:




        
            druidparser
        

        
                mycat
                mycat,blog_user,blog_category,blog_article
        

3,数据库sequence生成

牵扯到分库的时候就一定要由sequence生成,mysql的主键自增就不能使用了。
mycat的文档里面没有找到这部分的配置资料,但是找到了sequence的存储过程。
可以把这个存储过程存储到一个单独的数据库中,然后进行一次查询,再做入库。
存储过程地址:
https://github.com/MyCATApache/Mycat-doc/blob/master/%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/sequnce-sql.txt

DROP TABLE IF EXISTS MYCAT_SEQUENCE;  
CREATE TABLE MYCAT_SEQUENCE (  name VARCHAR(50) NOT NULL,  current_value INT NOT NULL,  increment INT NOT NULL DEFAULT 100, PRIMARY KEY (name) ) ENGINE=InnoDB;

DROP FUNCTION IF EXISTS `mycat_seq_currval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
    DETERMINISTIC
BEGIN  
        DECLARE retval VARCHAR(64);
        SET retval="-999999999,null";  
        SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval   FROM MYCAT_SEQUENCE  WHERE name = seq_name;  
        RETURN retval ; 
END
;;
DELIMITER ;

DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
    DETERMINISTIC
BEGIN  

              
            
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux下screen命令的使用 下一篇ODBC数据源管理器和三种DSN(还记..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: