MyCat的初步了解
MyCat
1 开源数据库中间件 MyCat
如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。
但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。如果使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储
1.1 mycat 简介
cobar是阿里以前的产品,它是基于java开发的,实现了mysql公开的二进制传输协议,巧妙地将自己伪装成一个MySQLServer,对目前市场上的大多数客户端和应用都比较兼容
MyCat是基于cobar演变而来,对cobar的代码进行了彻底的重构,使用NIO重构了网络模块,并且优化了buffer内核,增强了聚合,join 等基本特性,同时兼容绝大多数的数据库成为了通用的数据库中间件
MyCat就是一个数据库中间件,支持mysql集群,提供高可用性的数据分片集群
MyCat支持的数据库
1.2 MyCat的安装
要求JDK必须是1.7或者更高的
要求mysql是5.5以上的
1.2.1 安装mysql
将mysql的服务端和客户端安装包上传到服务器
查询是否安装过mysql
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
启动mysql服务
service mysql start
登录 mysql
mysql -u root
设置远程登录权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
可以在本地用软件连接一下mysql数据库
# 1.2.2 MyCat的安装及启动
MyCat的官方网站
http://www.mycat.org.cn/
下载地址
https://github.com/MyCATApache/Mycat-download
将 Mycat-server-1.4-release-20151019230038-linux.tar.gz 上传到服务器
将压缩包解压.我的是将MyCat放到/usr/local/mycat
tar -xzvf Mycat-server-1.4-release-20151019230038-linux.tar.gz
mv mycat /usr/local进入到MyCat的目录下的bin目录,启动MyCat
./mycat start
停止
./mycat stop
mycat 支持的命令{ console | start | stop | restart | status | dump }
其中使用console命令的时候如果出错了还能显示错误信息
MyCat的默认端口号是8066
1.3 MyCat 分片-海量数据的解决方案
1.3.1 分片
就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库上面.
数据切分(sharding)根据其切分规则的类型,可以分为两种切分方式.
一种是按照不同的表来切分到不同的数据库上,这种切分可以称为数据垂直(纵向)切分
一种是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库上面,这种切分称之为数据的水平(横向)切分
1.3.2 分片的相关概念
逻辑库(schema)
数据中间件可以被看做是一个或者多个数据库集群构成的逻辑库
逻辑表(table)
分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
分片表:是指那些原有的很大数据的表,需要切分到多个数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。 总而言之就是需要进行分片的表。
非分片表:一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。
分布节点(dataNode)
数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode).
节点主机(dataHost)
数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)
分片规则(rule)
一个大表要想被被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度.
1.3.3 MyCat的分片配置
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>
1.3.4 MyCat分片的测试
进入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万条数据,超过该范围的就会出现错误
1.3.5 MyCat的分片规则
rule.xml用于定义分片规则 ,我们这里讲解两种最常见的分片规则
- 按逐渐范围分片 rang-long
<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
- 一致性哈希 murmur
如果需要将数据平均分在几个分区中,可以使用一致性哈希规则
找到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个读节点的配置
MyCat的初步了解的更多相关文章
- 我家很管事的猫——mycat初步部署实践与问题排查
mycat,阿里出品的mysql中间件,提供读写分离和分库分表方案.项目中主要使用的是其读写分离功能. [如何部署?] 本文只采用并测试了双主从模式,配置看这一篇足矣: https://www.cnb ...
- mycat 概述
从开始接触mycat,到现在为止也有三个多月的时间了,目前在测试环境中已经初步应用!大概可以总结一下了 mycat是一个数据库中间件,也可以理解为是数据库代理.在架构体系中是位于数据库和应用层之间的一 ...
- mysql主从同步+mycat读写分离+.NET程序连接mycat代理
背景 最近新项目需要用到mysql数据库,并且由于数据量大的原因,故打算采用1主1从(主数据库负责增.删.改操作:从数据库负责查操作)的数据库架构,在实现主从之后还要实现读写分离的代理,在网上搜寻了很 ...
- Mycat读写分离、主从切换、分库分表的操作记录
系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...
- 数据库垂直拆分,水平拆分利器,cobar升级版mycat(转)
原文:数据库垂直拆分,水平拆分利器,cobar升级版mycat 1,关于Mycat Mycat情报 基于阿里的开源cobar ,可以用于生产系统中,目前在做如下的一些改进: 非阻塞IO的实现,相对于目 ...
- Mycat连接数据库之后导致表名全小写的问题分析研究
初步研究:通过部署发现在Mycat中部署逻辑表表名大小写混合时,在Mycat连接后出现全变小.容易造成错误逻辑表(按混合表名创建物理表): 可能拯救的方法: 1.Linux下部署安装MySQL,默认不 ...
- mycat快速体验(转)
横空出世的MyCat截至到2015年4月,保守估计已经有超过60个项目在使用,主要应用在电信领域.互联网项目,大部分是交易和管理系统,少量是信息系统.比较大的系统中,数据规模单表单月30亿.本人也初步 ...
- Mycat常见问题与解决方案---宜将剩勇追穷寇,不可沽名学霸王
1 Mycat目前有哪些功能与特性? 答: • 支持 SQL 92标准 • 支持Mysql集群,可以作为Proxy使用 • 支持JDBC连接多数据库 • 支持NoSQL数据库 • 支持galera f ...
- Mycat 关键特性
关键特性 支持SQL92标准 支持MySQL.Oracle.DB2.SQL Server.PostgreSQL等DB的常见SQL语法 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理. ...
随机推荐
- AlphaImageLoader用法
在 IE6 中,能够非常方便地利用 img 的 src 属性,实现本地图片预览,然而在 IE7 中,这样的办法却行不通.须要用 AlphaImageLoader. AlphaImageLoader 说 ...
- Java 出现内存溢出的定位以及解决方案
在上一节中Java虚拟机内存分布 说了Java虚拟机中分为五个区域,而且也知道了在Java程序计数器区域不会出现OOM(OutOfMemeryError),那么以下就对除了程序计数器以外的四个区域 ...
- linux服务器集群重复批量操作脚本实现
http://blog.csdn.net/flyinmind/article/details/8074863 在服务器集群的维护中,经常会遇到同样的操作重复执行很多遍的情况,“登录服务器->做 ...
- 【25.23%】【codeforces 731C】Socks
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- mac下装php5.6
OS X10.11自带了php5.5,项目中使用的是php5.6,用brew install --without-apache --with-fpm --with-mysql php56装php5.6 ...
- Android 平台下Ftp 使用模拟器需要注意的问题
以下代码在pc上测试通过,可是在android模拟器上就不工作,不过还可以链接到服务器但不能得到文件 纠结了半天,原来是模式的问题,具体请Google 模拟器中采用建议被动模式 public void ...
- 自定义滚动条样式 -webkit-scrollbar
demo .page-one-content-area-inner-select-wrap height 200px margin-bottom 30px overflow auto &::- ...
- C#连接Oracle数据库乱码问题
C#连接Oracle数据库乱码问题 数据库连接之前,设置环境变量,如下 Environment.SetEnvironmentVariable("NLS_LANG", "A ...
- Retrieving data from a server
A system includes a server and a controller embedded in a device. Both the server and the embedded c ...
- 【OC语法要闻速览】一、方法调用
调用方法 [object method]; [object methodWithInput:input]; output = [object methodWithOutput]; output = [ ...