0


MyCat 分片

更多内容,前往IT-BLOG

如今随着互联网的发展,数据的量级也是呈指数的增长,从

GB

TB

PB

。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候

NoSQL

的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。但是,在有些场合

NoSQL

是无法满足的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候

NoSQL

肯定是无法满足的,所以还是需要使用关系型数据库。如果使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储。

一、简介

Mycat

背后是阿里曾经开源的知名产品

Cobar

Cobar

的核心功能和优势是

MySQL

数据库分片,阿里随后开源的

Cobar

,并维护到

2013

年初。

Cobar

的思路和实现路径的确不错。基于

Java

开发的,实现了

MySQL

公开的二进制传输协议,巧妙地将自己伪装成一个

MySQL Server

,目前市面上绝大多数

MySQL

客户端工具和应用都能兼容。比自己实现一个新的数据库协议要明智的多,因为生态环境在哪里摆着。

Mycat

是基于

Cobar

演变而来,对

Cobar

的代码进行了彻底的重构,使用

NIO

重构了网络模块,并且优化了

Buffer

内核,增强了聚合,

Join

等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。

简单的说,

MyCat

就是一个新颖的数据库中间件产品,支持

MySQL

集群,或者

mariaDB cluster

(数据库管理系统集群),提供高可用的数据分片集群。你可以像使用

MySQL

一样使用

MyCat

。对于开发人员来说根本感觉不到

MyCat

的存在。

MyCat

基本支持的所有数据库的集群,主要如下:

二、Mycat 下载及安装

前提: 安装并启动

MySQL

数据库,并设置远程访问:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION

;
【1】

MyCat

官方网站:链接
【2】下载地址:链接
【3】将下载的

MyCat(Mycat-server-1.4-release-20151019230038-linux.tar.gz)

上传至服务器。
【4】解压

(tar -zxvf Mycat-server-1.4-release-20151019230038-linux.tar.gz)

后生成

MyCat

目录。
【5】进入

MyCat

目录下的

bin

目录,启动

MyCat

./mycat start 
MyCat

支持的命令

{ console | start | stop | restart | status | dump(导出) }

Mycat

的默认端口号为:

8066
Mycat

大概的目录结构如下:

|—— bin
|    |—— mycat                 MyCat启动程序
|    |—— ...
|—— catlet
|—— conf
|    |—— log4j2.xml           日志的配置,可以根据自己的需要调整输出级别为 bebug
|    |—— rule.xml               分片规则的配置文件,分片规则的具体参数信息被单独存放为文件,也在当前目录下,对配置文件进行修改时需要重启 MyCat
|    |—— schema.xml        逻辑库和逻辑表的定义,以及分片定义的配置文件
|    |—— server.xml           MyCat 服务器参数和用户授权的配置文件
|    |—— wrapper.conf       JVM内存配置文件
|    |—— zkconf                 ZooKeeper 的配置目录
|—— lib                             MyCat自身的 Jar包或依赖的 Jar包的存放目录
|—— logs                          MyCat日志的存放目录。日志被存放在 logs/log中,每天生成一个文件
|—— version.txt                版本信息 

三、MyCat 分片(海量数据存储解决方案)

什么是分片: 就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。数据的切分

Sharding

根据其切分规则的类型,可以分为两种切分模式:
【1】一种是按照不同的表(或者

Schema

)来切分到不同的数据库(主机)之上,这种切分可以称之为数据的垂直(纵向)切分

【2】另外一种则是根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分

MyCat 分片策略:

**【1】逻辑库

schema

:** 前面说了数据库中间件,通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。
**【2】逻辑表

table

:** 既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
 ■ 分片表: 是指那些原有的很大数据的表,需要切分到多个数据库的表,这样每个分片都有一部分数据,所有分片构成了完整的数据。 总而言之就是需要进行分片的表。
 ■ 非分片表: 一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。
**【3】分片节点

dataNode

:** 数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode)。与实体数据库中的表是相互对应的。
**【4】节点主机

dataHost

:** 数据切分后,每个分片节点

dataNode

不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机

dataHost

,为了规避单节点主机并发数限制,尽量将读写压力高的分片节点

dataNode

均衡的放在不同的节点主机

dataHost


**【5】分片规则

rule

:** 前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。

四、MyCat 分片配置

提示:建议每次修改配置前都对其进行备份,例如:

cp conf/schema.xml conf/schema.xml.bak

**【1】配置

schema.xml

:**

schema.xml

作为

MyCat

中重要的配置文件之一,管理着

MyCat

的逻辑库、逻辑表以及对应的分片规则、

DataNode

以及

DataHost

。弄懂这些配置,是正确使用

MyCat

的前提。这里就一层层对该文件进行解析。

<mycat:schemaxmlns:mycat="http://org.opencloudb/"><!-- schema 标签用于定义MyCat实例中的逻辑库 name 表示连接时的数据源,需要在server.xml中配置连接的用户名和密码 --><schemaname="TESTDB"checkSQLschema="false"sqlMaxLimit="100"><!--Table标签 定义了 MyCat中的逻辑表(可以有多个)
            name: 逻辑表的名称
            dataNode:对应 dataNode 标签,配置了 节点与实体数据库表的关系
            rule:对应 rule.xml 配置文件中的规则 name,auto-sharding-long的分片规则是按ID值的范围进行分片 1-5000000 为第1片  5000001-10000000 为第2片....  具体设置我们会rule.xml 中说明
                    name中的值是表的名称,创建的表需要再此定义,否则不会成功
        --><tablename="tb_test"dataNode="dn1,dn2,dn3"rule="auto-sharding-long"/></schema><!--dataNode 标签定义了 MyCat中的数据节点,也就是我们通常说所的数据分片。
        dataHost:对应 dataHost标签中的 name
        database:对应数据库中的表名(必须存在实体数据源db1,db2,db3) --><dataNodename="dn1"dataHost="localhost1"database="db1"/><dataNodename="dn2"dataHost="localhost1"database="db2"/><dataNodename="dn3"dataHost="localhost1"database="db3"/><!--dataHost标签 在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。 --><dataHostname="localhost1"maxCon="1000"minCon="10"balance="0"writeType="0"dbType="mysql"dbDriver="native"switchType="1"slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- 主服务hostM1信息,修改url与用户名和密码为自己的地址等 --><writeHosthost="hostM1"url="192.168.88.129:3306"user="root"password="123456"></writeHost></dataHost></mycat:schema>

**【2】配置

server.xml

:**

server.xml

几乎保存了所有

MyCat

需要的系统配置信息。最常用的是在此配置用户名、密码及权限。在

system

标签中添加

UTF-8

字符集设置,否则存储中文会出现问号

<propertyname="charset">utf8</property>

修改 user标签的设置 , 我们这里为 TESTDB 设置了一个用户:

<!--schemas:对应 schema 中的逻辑库 <schema> 标签name 的值,这里=TESTDB
    password:用户登录的密码
    name:用户登录名称--><username="test"><propertyname="password">test</property><propertyname="schemas">TESTDB</property></user>

**【3】配置

rule.xml

:** 用于定义分片规则 ,我们这里讲解两种最常见的分片规则:

【第一种分片规则】: 按主键范围分片

rang-long

,在配置文件中我们找到对应配置如下:

<!--我们配置的默认规则--><!--tableRule 是定义具体某个表或某一类表的分片规则名称   
    columns用于定义分片的列  
    algorithm代表算法名称 
    我们接着找rang-long的定义--><tableRulename="auto-sharding-long"><rule><columns>id</columns><algorithm>rang-long</algorithm></rule></tableRule><!--Function 用于定义算法 mapFile 用于定义算法需要的数据,我们打开autopartition-long.txt--><functionname="rang-long"class="org.opencloudb.route.function.AutoPartitionByLong"><propertyname="mapFile">autopartition-long.txt</property></function>

打开

autopartition-long.txt

文件,内如如下:

# range start-end ,data node index# K=1000,M=10000.#表示第一个db1存储id在 0-500万 之间的数据
0-500M=0
#表示第一个db2存储id在 500万-1000万 之间的数据
500M-1000M=1
#表示第一个db3存储id在 1000万-1500万 之间的数据
1000M-1500M=2

【第二种分片规则】: 一致性哈希

murmur

,当我们需要将数据平均分在几个分区中,需要使用一致性

hash

规则,我们找到

rule.xml

中的

function

name

murmur

的定义,将

count

属性改为

3

,因为我要将数据分成

3

片:

<tableRulename="sharding-by-murmur"><rule><columns>id</columns><algorithm>murmur</algorithm></rule></tableRule><functionname="murmur"class="org.opencloudb.route.function.PartitionByMurmurHash"><propertyname="seed">0</property><!-- 默认是0 --><!-- 要分片的数据库节点数量,必须指定,否则没法分片 --><propertyname="count">3</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 --><propertyname="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>

五、MyCat 分片测试

【1】通过外部工具连接

MyCat

逻辑库

TESTDB

【2】进入

TESTDB(use TESTDB)

执行下列语句创建一个表:创建后你会发现,

MyCat

会自动将你的表转换为大写,这一点与

Oracle

有些类似。并且在

db1

db2

db3

TESTDB

数据源中都会创建

tb_test

表,此表名需要在

schema.xml

中定义。

CREATETABLE tb_test (
    id BIGINT(20)NOTNULL,
    title VARCHAR(100)NOTNULL,PRIMARYKEY(id))ENGINE=INNODBDEFAULTCHARSET=utf8

我们查看一下,我们创建的

db1

db2

db3

的状况,会发现都创建了

tb_test

表。接下来是插入表数据(注意:在写

INSERT

语句时一定要写把字段列表写出来,否则会出现下列错误提示:

1064

INSERTINTO TB_TEST(ID,TITLE)VALUES(1,'goods1');INSERTINTO TB_TEST(ID,TITLE)VALUES(5000001,'goods5000001');INSERTINTO TB_TEST(ID,TITLE)VALUES(1100000,'goods10000001');

我们会发现这些数据按照我们说的第一种分片规则,将

id=1

的写入

db1

id=5000001

的写入

db2

id=1100000

写入

db3

。采用的分片规则是每节点存储

500

万条数据。如果查出了定义的范围,则直接抛错。


本文转载自: https://blog.csdn.net/zhengzhaoyang122/article/details/140747322
版权归原作者 程序猿进阶 所有, 如有侵权,请联系我们删除。

“MyCat 分片”的评论:

还没有评论