现在随着互联网的发展,数据的量级也是撑指数的增加,从GB到TB到PB。对数据的各类操做也是越发的困难,传统的关系性数据库已经没法知足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它经过下降数据的安全性,减小对事务的支持,减小对复杂查询的支持,来获取性能上的提高。node
可是,在有些场合NoSQL一些折衷是没法知足使用场景的,就好比有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL确定是没法知足的,因此仍是须要使用关系性数据库。若是使用关系型数据库解决海量存储的问题呢?此时就须要作数据库集群,为了提升查询性能将一个数据库的数据分散到不一样的数据库中存储。mysql
Mycat 背后是阿里曾经开源的知名产品——Cobar。Cobar 的核心功能和优点是 MySQL 数据库分片,此产品曾经广为流传,听说最先的发起者对 Mysql 很精通,后来从阿里跳槽了,阿里随后开源的 Cobar,并维持到 2013 年年初,而后,就没有而后了。linux
Cobar 的思路和实现路径的确不错。基于 Java 开发的,实现了 MySQL 公开的二进制传输协议,巧妙地将本身假装成一个 MySQL Server,目前市面上绝大多数MySQL客户端工具和应用都能兼容。比本身实现一个新的数据库协议要明智的多,由于生态环境在哪里摆着。git
Mycat 是基于 cobar 演变而来,对 cobar 的代码进行了完全的重构,使用 NIO 重构了网络模块,而且优化了 Buffer 内核,加强了聚合,Join 等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。github
简单的说,MyCAT就是:一个新颖的数据库中间件产品支持mysql集群,或者mariadb cluster,提供高可用性数据分片集群。你能够像使用mysql同样使用mycat。对于开发人员来讲根本感受不到mycat的存在。算法
JDK:要求jdk必须是1.7及以上版本
MySQL:推荐mysql是5.5以上版本
MySQL安装与启动步骤以下:( 步骤1-5省略 )sql
rpm -qa|grep -i mysql
rpm -e --nodeps 软件名称
rpm -ivh MySQL-server-5.5.49-1.linux2.6.i386.rpm
rpm -ivh MySQL-client-5.5.49-1.linux2.6.i386.rpm
service mysql start
mysql -u root
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
MyCat的官方网站: www.mycat.org.cn
下载地址: github.com/MyCATApache…数据库
tar -xzvf Mycat-server-1.4-release-20151019230038-linux.tar.gz
mv mycat /usr/local
复制代码
./mycat start
中止:./mycat stop
mycat 支持的命令{ console | start | stop | restart | status | dump }
Mycat的默认端口号为:8066安全
简单来讲,就是指经过某种特定的条件,将咱们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。bash
数据的切分(Sharding)根据其切分规则的类型,能够分为两种切分模式。
逻辑库(schema) :
逻辑表(table):
分片表:
非分片表:
分片节点(dataNode)
节点主机(dataHost)
分片规则(rule)
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="PINYOUGOUDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="tb_test" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.25.142:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
复制代码
<property name="charset">utf8</property>
<user name="test">
<property name="password">test</property>
<property name="schemas">PINYOUGOUDB</property>
</user>
<user name="root">
<property name="password">123456</property>
<property name="schemas">PINYOUGOUDB</property>
</user>
复制代码
进入mycat ,执行下列语句建立一个表:
CREATE TABLE tb_test (
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL ,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8
复制代码
建立后你会发现,MyCat会自动将你的表转换为大写,这一点与Oracle有些相似。
INSERT INTO TB_TEST(ID,TITLE) VALUES(1,'goods1');
INSERT INTO TB_TEST(ID,TITLE) VALUES(2,'goods2');
INSERT INTO TB_TEST(ID,TITLE) VALUES(3,'goods3');
复制代码
咱们会发现这些数据被写入到第一个节点中了,那何时数据会写到第二个节点中呢? 咱们插入下面的数据就能够插入第二个节点了
INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'goods5000001');
由于咱们采用的分片规则是每节点存储500万条数据,因此当ID大于5000000则会存储到第二个节点上。 目前只设置了两个节点,若是数据大于1000万条,会怎么样呢?执行下列语句测试一下 INSERT INTO TB_TEST(ID,TITLE) VALUES(10000001,'goods10000001');
rule.xml用于定义分片规则 ,咱们这里讲解两种最多见的分片规则
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
复制代码
<function name="rang-long"
class="org.opencloudb.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
复制代码
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
复制代码
<function name="murmur"
class="org.opencloudb.route.function.PartitionByMurmurHash">
<property name="seed">0</property> <!-- 默认是0 -->
<property name="count">3</property> <!-- 要分片的数据库节点数量,必须指定,不然无法分片 -->
<!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
<property name="virtualBucketTimes">160</property>
<!--
<property name="weightMapFile">weightMapFile</property>
节点的权重,没有指定权重的节点默认是1。
以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,
以节点权重值为值。全部权重值必须是正整数,不然以1代替
-->
<!--
<property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
用于测试时观察各物理节点与虚拟节点的分布状况,若是指定了这个属性,
会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,若是不指定,就不会输出任何东西
-->
</function>
复制代码
<tableRule name="sharding-by-murmur">
<rule>
<columns>id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
复制代码
<tableRule name="sharding-by-murmur-order">
<rule>
<columns>order_id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
复制代码
<table name="tb_order" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur-order" />