从开始接触mycat,到现在为止也有三个多月的时间了,目前在测试环境中已经初步应用!大概可以总结一下了

mycat是一个数据库中间件,也可以理解为是数据库代理。在架构体系中是位于数据库和应用层之间的一个组件,并且对于应用层是透明的,即数据库感受不到mycat的存在,认为是直接连接的mysql数据库(实际上是连接的mycat,mycat实现了mysql的原生协议)

mycat的三大功能:分表、读写分离、主从切换;mycat的主要功能也就是这三个了吧!??

1、分表

  对于数据量很大的表(千万级以上),mysql性能会有很大下降,因此尽量控制在每张表的大小在百万级别。对于数据量很大的一张表,可以考虑将这些记录按照一定的规则放到不同的数据库里面。这样每个数据库的数据量不是太大,性能也不会有太大损失。

  mycat自动会帮助我们实现分表功能,而对于应用层来说是透明的,即跟一张表没有什么区别!

  mycat分表的实现:首先在mycat的scheme.xml中配置逻辑表,并且在配置中说明此表在哪几个物理库上。此逻辑表的名字与真实数据库中的名字一致!然后需要配置分片规则,即按照什么逻辑分库!分片规则有很多,选取以下几个简单说明:

  1、根据数据库某字段的hash值片

  2、截取某字段的几位数字,匹配分区号

  3、按照时间(年份分表)

  4、……

  分表的原则是尽量避免跨库操作操作,跨库操作会损失很多性能,mycat会对各个库的结果集进行合并,另外就是要考虑扩展之后,尽量使最少量的数据迁移。

  分表规则很多,很灵活,并且在源码基础上修改分片规则也很容易!

  分表之后有什么弊端呢?

  使用存储过程/函数就不太方便了,mycat本身不支持存储过程,是通过注解的方式实现存储过程的调用。并且在所有库上都执行,将执行结果合并,并返回(mysql存储过程返回结果最好使用select方式返回)。

  分表之后还有一个问题,就是自增ID的问题,在分库场景下,如果使用mysql的自增主键,会导致各个库中主键之间有重复。mycat使用内部的全局序列号解决这个问题;即插入数据的时候,mycat会自动的显示的插入自增主键,使用的是全局序列号;

  需要在配置逻辑表的时候,配置上自增字段,自增属性=true 这两个属性;

 <table name="fh_fullnote" primaryKey="FH_FULLNOTE_ID" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="sharding-by-substring" />

  那么全局序列号存储在什么地方呢?mycat是怎么去取的呢?

  全局序列号有两种存储方式:基于本地文件和基于数据库的存储;

  我们是采用基于数据库的存储方式,需要在数据库中建立 mycat_sequence表

Create Table: CREATE TABLE `mycat_sequence` (
`name` varchar(50) NOT NULL,
`current_value` int(11) NOT NULL,
`increment` int(11) NOT NULL DEFAULT '100',
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

  全局序列号就是存储在这个表中;第一个是全局序列号的名,第二个是当前值,第三个是增量;即每次mycat会取出一批序列号(增量就是作用与此),用完之后再取;如果每次都取,在效率上会有损失。

  mycat取全局序列号是通过函数来取的,因此需要在数据库上增加如下三个函数:

⑤    /******************************获取函数当前值***********************************/

DELIMITER $$

USE `mycat1`$$

DROP FUNCTION IF EXISTS `mycat_seq_currval`$$

CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS VARCHAR(64) CHARSET utf8
DETERMINISTIC
BEGIN
DECLARE retval VARCHAR(64);
SET retval="-999999999,null";
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 ;
/*******************************获取下一批值***************************************/
DELIMITER $$ USE `mycat1`$$ DROP FUNCTION IF EXISTS `mycat_seq_nextval`$$ CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS VARCHAR(64) CHARSET utf8
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE NAME = seq_name;
RETURN mycat_seq_currval(seq_name);
END$$ DELIMITER ; /*******************************设定值***************************************/
DELIMITER $$ USE `mycat1`$$ DROP FUNCTION IF EXISTS `mycat_seq_setval`$$ CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50),VALUE INTEGER) RETURNS VARCHAR(64) CHARSET utf8
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = VALUE
WHERE NAME = seq_name;
RETURN mycat_seq_currval(seq_name);
END$$ DELIMITER ;

  一般来说,每一个表应该对应一个全局序列号;

  此对应关系在sequence_db_conf.properties配置;

  表名 = 全局序列号数据库(dn1)

  2、读写分离

  经过统计发现,对数据库的大量操作是读操作,一般占到所有操作70%以上。所以做读写分离还是很有必要的,如果不做读写分离,那么从库也是一种很大的浪费。

  mycat的读写分离也是在scheme.xml里面配置的。配置方式如下:

<writeHost host="hostM1" url="192.168.91.231:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.91.232:3306" user="root" password="123456" />
</writeHost>

  值得注意的是,读库是附属于写库的,如果写库挂掉之后,读库也就不能使用了。

  读写分离一般涉及到两个问题:一个是读操作的均衡,是全部走读库?还是部分走读库,部分读写库?    另一个问题,如果同步不及时或者同步出错,或者实时性要求较高,这种场景下,如何强制走写库?

  首先来看第一个问题,读写均衡问题:

  scheme.xml配置文件  dataHost标签中有一个balance属性,该属性的不同值表示不同的含义:

mycat 概述的更多相关文章

  1. Mycat概述

    Mycat是什么?从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL协议的的Server,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用 ...

  2. 分布式mysql中间件(mycat)

    1.   MyCAT概述 1.1 背景 随着传统的数据库技术日趋成熟.计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上.这时集中式数据库系统表现出它的不足: (1)集中 ...

  3. Mycat对MySQL进行垂直水平分表分库,读写分离

    1.   MyCAT概述 1.1 背景 随着传统的数据库技术日趋成熟.计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上.这时集中式数据库系统表现出它的不足: (1)集中 ...

  4. Mycat中间件

    数据库中间件Mycat自我介绍 一.mycat概述 1.功能介绍 mycat一个开源的分布式数据库系统,是一个实现了mysql协议的server前端用户可以把它看成一个数据库代理,用mysql客户端工 ...

  5. MyCAT详解

    一.MyCAT概述 MyCAT是一款由阿里Cobar演变而来的用于支持数据库读写分离.分片的分布式中间件.MyCAT可不但支持Oracle.MSSQL.MYSQL.PG.DB2关系型数据库,同时也支持 ...

  6. 关系型数据的分布式处理系统MyCAT(转载)

      ——概述和基本使用教程 日期:2014/12/24 文:阿蜜果 1.   MyCAT概述 1.1 背景 随着传统的数据库技术日趋成熟.计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建 ...

  7. Mycat分布式数据库架构解决方案--Mycat的介绍

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 如果我 ...

  8. MyCAT详解【转】

    原文链接:MyCAT详解 作者:Rangle 一.MyCAT概述MyCAT是一款由阿里Cobar演变而来的用于支持数据库读写分离.分片的分布式中间件.MyCAT可不但支持Oracle.MSSQL.MY ...

  9. 大觅网05Day

    1.Mycat概述 在此前的服务器对数据库的存储数量要求并不高的时候,被经常使用的MySql数据基本能够满足对数据存储的要求. 但随着技术的不断发展,MySql甚至Redis都无法满足现今存储数量的指 ...

随机推荐

  1. Jwalk发布——一个比较小的Js动画库

    断断续续折腾了几个晚上终于于周日把Jwalk发布了,顺便用了下yahoo的前端框架-pure css ,很简洁,非常帅.推荐使用以下. 下面说下Jwalk是做什么的: 前端开发过程中经常会用到一些动画 ...

  2. vsftpd配置seccomp_sandbox=NO

    在ubuntu14.04 配置vsftp时如果不加上seccomp_sandbox=NO这一句会出现莫名的530错误

  3. jq模糊匹配

    jq是一般程序员在前台开发的时候都会使用的技术,其中模糊匹配查询在动态添加标签的时候经常用到,这里我写出我经常用到的几个模糊匹配的方法.其中有:^(前缀).$(后缀).*(包含)例如有这样一段代码: ...

  4. 使用纯css代码实现div的“回”字型“叠放”效果

    正如大家所知道的那样,div是一个块级元素,也是网页编写过程中使用频率最高的一个元素,通过不同的样式控制可以实现一些最常见的页面效果,当然也可以实现一些比较复杂的页面效果,这里就展示一个本人面试过程中 ...

  5. Dell-R730 【Pxe+dhcp+ftp+tftp+Kickstart+CentOs6.6】

    IP:10.104.0.101 [root@localhost network-scripts]# cat ifcfg-em1 [root@localhost network-scripts]# ip ...

  6. C#开发学习——SqlHelper的应用

    使用App.config配置文件封装连接字符串,方便重复使用--->添加App.conifg配置文件--->Add : ConnectionString:--->添加引用 <? ...

  7. SASS使用CSS3动画并使动画暂停和停止在最后一帧的简单例子

    今天在手机上试了试这个 css3 动画效果,可以把动画效果停留在最后一帧上,以及鼠标 :hover 暂停动画,比较实用的功能,不用 JS 也能实现这些效果了. 不过测试体验感觉手机上没有 jQuery ...

  8. oracle数据库一些用户管理语句

    查询所有数据库用户 select * from dba_users 查看数据库名称 select name from v$database 查看权限 select * from user_sys_pr ...

  9. 双数组trie树的基本构造及简单优化

    一 基本构造 Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现.它本质上是一个确定的有限状 ...

  10. 端口(port)的安全模式(security mode)

    1. Cisco29系列交换机可以做基于2层的端口安全 ,即mac地址与端口进行绑定.2. Cisco3550以上交换机均可做基于2层和3层的端口安全, 即mac地址与端口绑定以及mac地址与ip地址 ...