现在随着互联网的发展,数据的量级也是撑指数的增加,从GB到TB到PB。对数据的各类操做也是越发的困难,传统的关系性数据库已经没法知足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它经过下降数据的安全性,减小对事务的支持,减小对复杂查询的支持,来获取性能上的提高。
可是,在有些场合NoSQL一些折衷是没法知足使用场景的,就好比有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL确定是没法知足的,因此仍是须要使用关系性数据库。若是使用关系型数据库解决海量存储的问题呢?此时就须要作数据库集群,为了提升查询性能将一个数据库的数据分散到不一样的数据库中存储java
cobar是阿里之前的产品,它是基于java开发的,实现了mysql公开的二进制传输协议,巧妙地将本身假装成一个MySQLServer,对目前市场上的大多数客户端和应用都比较兼容node
MyCat是基于cobar演变而来,对cobar的代码进行了完全的重构,使用NIO重构了网络模块,而且优化了buffer内核,加强了聚合,join 等基本特性,同时兼容绝大多数的数据库成为了通用的数据库中间件
MyCat就是一个数据库中间件,支持mysql集群,提供高可用性的数据分片集群mysql
MyCat支持的数据库linux
要求JDK必须是1.7或者更高的
要求mysql是5.5以上的git
将mysql的服务端和客户端安装包上传到服务器
github
查询是否安装过mysql
rpm -qa | grep -i mysql
算法
若是有之前的版本就卸掉
rpm -e --nodeps 版本名称
sql
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;
数据库
能够在本地用软件链接一下mysql数据库安全
MyCat的官方网站
http://www.mycat.org.cn/
下载地址
https://github.com/MyCATApache/Mycat-download
进入到MyCat的目录下的bin目录,启动MyCat
./mycat start
中止
./mycat stop
mycat 支持的命令{ console | start | stop | restart | status | dump }
其中使用console命令的时候若是出错了还能显示错误信息
MyCat的默认端口号是8066
就是经过某种特定的条件,将咱们存放在同一个数据库中的数据分散存放到多个数据库上面.
数据切分(sharding)根据其切分规则的类型,能够分为两种切分方式.
一种是按照不一样的表来切分到不一样的数据库上,这种切分能够称为数据垂直(纵向)切分
一种是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库上面,这种切分称之为数据的水平(横向)切分
逻辑库(schema)
数据中间件能够被看作是一个或者多个数据库集群构成的逻辑库
逻辑表(table)
分布式数据库中,对应用来讲,读写数据的表就是逻辑表。逻辑表,能够是数据切分后,分布在一个或多个分片库中,也能够不作数据切分,不分片,只有一个表构成。
分片表:是指那些原有的很大数据的表,须要切分到多个数据库的表,这样,每一个分片都有一部分数据,全部分片构成了完整的数据。 总而言之就是须要进行分片的表。
非分片表:一个数据库中并非全部的表都很大,某些表是能够不用进行切分的,非分片是相对分片表来讲的,就是那些不须要进行数据切分的表。
分布节点(dataNode)
数据切分后,一个大表被分到不一样的分片数据库上面,每一个表分片所在的数据库就是分片节点(dataNode).
节点主机(dataHost)
数据切分后,每一个分片节点(dataNode)不必定都会独占一台机器,同一机器上面能够有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽可能将读写压力高的分片节点(dataNode)均衡的放在不一样的节点主机(dataHost)
分片规则(rule)
一个大表要想被被分红若干个分片表,就须要必定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则很是重要,将极大的避免后续数据处理的难度.
schema.xml是MyCat的一个配置文件,主要管理MyCat的逻辑库,逻辑表,分片规则,dataNode,和DataSource.
schema标签用于定义MyCat事例中的逻辑库
table标签订义了MyCat中的逻辑表rule用于指定分片规则
dataNode标签订义了MyCat中的数据节点,也就是数据分片
dataHost标签订义了具体的数据库实例,读写分离配置和心跳语句
案例:
按服务器mysql中建立三个数据库 db1,db2,db3
修改schema.xml
<?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>
配置server.xml
server.xml几乎保存了全部MyCat须要的系统配置信息.常在这里配置用户名,密码以及权限.在system中添加utf-8字符集设置,否则那存储中文时会出现问号
<property name="charset">utf8</property>
修改user的设置,这里为PINYOUGOUDB设置了两个用户
<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会自动把表的名字转换为大写,之后再写表的名字的时候最好把表的名字都写成大写
还有在插入数据的时候必定要把字段列表写出来,否则就会报错
错误代码: 1064
partition table, insert must provide ColumnList
往表里面插入一些数据
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');
注意,上面的三条数据会在第一个表里面显示,若是想要在db2中显示数据须要用下面的数据
INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'goods5000001');
由于咱们采用的分片规则是每一个节点存储500万条数据,也就是一共可以存储1500万条数据,超过该范围的就会出现错误
rule.xml用于定义分片规则 ,咱们这里讲解两种最多见的分片规则
<tableRule name="auto-sharding-long"> <rule> <columns>id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule>
tableRule 是定义具体某个表或某一类表的分片规则名称 columns用于定义分片的列 algorithm表明算法名称
rang-long的定义
<function name="rang-long" class="org.opencloudb.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> </function>
Function用于定义算法 mapFile 用于定义算法须要的数据,打开autopartition-long.txt
# range start-end ,data node index # K=1000,M=10000. 0-500M=0 500M-1000M=1 1000M-1500M=2
找到function的name为murmur 的定义,将count属性改成3,由于我要将数据分红3片
<function name="murmur" class="org.opencloudb.route.function.PartitionByMurmurHash"> <property name="seed">0</property><!-- 默认是0 --> <property name="count">3</property><!-- 要分片的数据库节点数量,必须指定,不然无法分片 --> <property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 --> <!-- <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>
可是这个规则指定的列是id ,若是咱们的表主键不是id ,而是order_id ,那么咱们应该从新定义一个tableRule:
<tableRule name="sharding-by-murmur-order"> <rule> <columns>order_id</columns> <algorithm>murmur</algorithm> </rule> </tableRule>
在schema.xml中配置逻辑表时,指定规则为sharding-by-murmur-order
<table name="tb_order" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur-order" />
能够建立一个订单表,并插入数据,测试分片的效果
1.4 数据库的读写分离
数据库读写分离对于大型系统或者访问量很高的互联网应用来讲,是必不可少的一个重要功能。对于MySQL来讲,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,一般是1-3个读节点的配置