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个读节点的配置

最新文章

  1. 3.C#WinForm基础累加器
  2. 一个非常有意思的css3属性filter
  3. C#的循环语句练习
  4. Windows XP PRO SP3 - Full ROP calc shellcode
  5. Hadoop发行版本介绍
  6. SpringMVC+Spring+Hibernate+Maven+mysql整合
  7. 基于HTML5的SLG游戏开发(序)
  8. 详细分析 javascript 的内存分配
  9. CVE-2015-8660分析
  10. 适应多行长文本的Android TextView
  11. 零复制(zero copy)技术
  12. 两款主流项目管理软件PK,哪个更好用?
  13. 【NOIP2015TG】solution
  14. dubbo核心要点及下载(dubbo二)
  15. 实例化和设置一个优秀的php对象
  16. Implementing HTTPS Everywhere in ASP.Net MVC application.
  17. SAP生产机该不该开放Debuger权限(转)
  18. Metaspolit使用简介
  19. java.lang.NoSuchMethodError问题处理
  20. 20180129周一之学习PYTHON笔记【PYTHON2写个自动点击学习功能】

热门文章

  1. 小强的HTML5移动开发之路(35)——jQuery中的过滤器详解
  2. JDBC连接数据库步骤及Class.forName()(转)
  3. WPF入门(三)-&gt;几何图形之椭圆形(EllipseGeometry)
  4. 微信小程序实例:实现tabs选项卡效果
  5. hadoop 3.x 关闭安全模式
  6. 常用软件的安装(windows/linux)
  7. Android之高仿手机QQ聊天
  8. WPF 使用 SharpDX 在 D3DImage 显示
  9. react 父组件向子组件传递函数
  10. Atitit.故障排除系列---php 计划网站数据库错误排除过程