关于分布式:分布式数据库中间件-MyCat-分库分表实践

8次阅读

共计 5606 个字符,预计需要花费 15 分钟才能阅读完成。

MyCat 简介

MyCat 是一个功能强大的分布式数据库中间件,是一个实现了 MySQL 协定的 Server,前端人员能够把它看做是一个数据库代理中间件,用 MySQL 客户端工具和命令行拜访;而后端人员能够用 MySQL 原生协定与多个 MySQL 服务器通信,也能够用 JDBC 协定与大多数支流数据库服务器通信。能够用作 读写拆散 分库分表(分片)容灾备份 多租户利用开发 大数据基础设施,使底层数据架构具备很强的适应性和灵活性。

MyCat 的智能优化模块能够使零碎的数据拜访瓶颈和热点高深莫测,并且能够将这些统计分析数据主动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个利用的代码能够一行也不必变。

具体利用场景

  1. 读写拆散:反对读写拆散,主从切换,此配置最简略;
  2. 分库分表:对于超过 1000 万的表进行分片,最大反对 1000 亿的单表分片;
  3. 多租户利用:每个利用一个库,但应用程序只连贯 MyCat,使程序不必革新自身,实现多租户化;
  4. 代替 Hbase:用于剖析大数据;
  5. 报表零碎:借助 MyCat 的分表能力,解决大规模报表的统计;
  6. 海量数据查问:比方 10 亿条频繁查问的记录须要在 3 秒内查问进去后果,除了基于主键的查问,还可能存在范畴查问或其余属性查问,此时 MyCat 可能是最简略无效的抉择。

本文次要实际外围性能 分库分表

分库分表原理分析

指通过某种特定的条件,将寄存在同一个数据库中的数据扩散寄存到多个数据库下面,以达到扩散单台设施负载的成果。

依据切分规定的类型能够分为以下两种切分模式。

  • 垂直切分:最大特点是规定简略,适宜各业务之间的的耦合度非常低、相互影响小、业务逻辑十分清晰的零碎。在这种零碎中,能够很容易 将不同业务模块所应用的的表切到不同的数据库中
  • 程度切分:相对来说简单一些,因为要 将同一个表中的不同数据切分到不同的数据库中,前期的数据保护也更为简单一些。

垂直切分

一个数据库由很多表形成,每个表对应着不同的业务,垂直切分就是依照业务将表进行分类,从而散布到不同的数据库下面,这样也就将压力分担到不同的数据库上,如图。

一个架构设计好的零碎其总体性能通常是由多个功能模块所组成的,而每一个功能模块的数据对应到数据库中就是一个或多个表。而在架构设计中,各个功能模块相互之间的交互点越少和越对立,零碎的耦合度就越低,零碎各个模块的维护性以及扩展性也就越好,这样的零碎也就越容易实现垂直切分。

然而往往零碎中有些表难以做到齐全的独立,存在跨库 join 的状况,对于这类分库,能够共用一个数据源,业务之间通过接口来调用。

长处:规定明确、业务清晰、更易于整合和扩大、保护简略。

毛病:局部业务表无奈 join,须要通过业务接口方式解决,进步零碎复杂度;各业务存在单库性能瓶颈,不易于数据扩大和性能进步;事务处理简单问题。

因为垂直切分是将表依照业务分类切分到不同的单库中,所有导致某些业务表过于宏大,存在单库读写与存储瓶颈,则须要程度切分来解决。

程度切分

程度切分不是将表依照业务分类,而是依照某个字段的某种规定扩散到多个库中,每个表中蕴含一部分数据,如图。

拆分数据须要定义分片规定,拆分的第一准则是找到 拆分维度。比方:从会员的角度来剖析,须要查问会员某天某月某个订单,那么就须要依照日期来拆分,不同的数据依照会员 ID 做分组。

长处:拆分规定形象好;不存在单库数据瓶颈问题;进步零碎稳定性和负载能力。

毛病:事务一致性难以解决;数据扩大和保护的难度极大;跨库 join 性能差。

附:多数据源治理计划

  • 第一种:客户端模式,在每个应用程序中配置管理本人须要的一个或多个数据源,间接拜访各个数据库。
  • 第二种:通过两头代理层来对立治理所有的数据源。

搭建环境

均采纳 Docker Compose 搭建服务

部署 3 台 MySQL 容器

别离创立 3 份 docker-compose.yml 文件

  • mysql-01

    version: ‘3.1’
    services:
    mysql-1:
    image: mysql
    container_name: mysql-01
    environment:
    MYSQL_ROOT_PASSWORD: 123456
    command:
    –default-authentication-plugin=mysql_native_password
    –character-set-server=utf8mb4
    –collation-server=utf8mb4_general_ci
    –explicit_defaults_for_timestamp=true
    –lower_case_table_names=1
    ports:

    • 3306:3306
 volumes:  
 - ./data:/var/lib/mysql
  • mysql-02

    version: ‘3.1’
    services:
    mysql-2:
    image: mysql
    container_name: mysql-02
    environment:
    MYSQL_ROOT_PASSWORD: 123456
    command:
    –default-authentication-plugin=mysql_native_password
    –character-set-server=utf8mb4
    –collation-server=utf8mb4_general_ci
    –explicit_defaults_for_timestamp=true
    –lower_case_table_names=1
    ports:

    • 3307:3306
 volumes:  
 - ./data:/var/lib/mysql
  • mysql-03

    version: ‘3.1’
    services:
    mysql-3:
    image: mysql
    container_name: mysql-03
    environment:
    MYSQL_ROOT_PASSWORD: 123456
    command:
    –default-authentication-plugin=mysql_native_password
    –character-set-server=utf8mb4
    –collation-server=utf8mb4_general_ci
    –explicit_defaults_for_timestamp=true
    –lower_case_table_names=1
    ports:

    • 3308:3306
 volumes:  
 - ./data:/var/lib/mysql

别离启动 3 台容器

$ docker-compose up -d

部署 MyCat 容器

  • 克隆我的项目

    $ git clone https://github.com/antoniopen…

  • 构建镜像

    $ cd docker.mycat
    $ docker-compose build

  • 启动容器

    $ docker-compose up -d

配置数据库分片

此处以 程度切分 为例

配置用户名和明码

$ vi config/mycat/server.xml

找到第 90 行,参考配置如下:

<mycat:server xmlns:mycat=”http://io.mycat/”>

<user name=”root”>

<property name=”password”>123456</property>

<property name=”schemas”>hellomycat</property>

<property name=”usingDecrypt”>0</property>
</user>
</mycat:server>

配置数据库节点

$ vi config/mycat/schema.xml

参考配置如下:

<?xml version=”1.0″?>
<!DOCTYPE mycat:schema SYSTEM “schema.dtd”>
<mycat:schema xmlns:mycat=”http://io.mycat/”>

<schema name=”hellomycat” checkSQLschema=”true” sqlMaxLimit=”100″>

</schema>

<dataNode name=”dataNode1″ dataHost=”dataHost1″ database=”hellomycat_1″ />
<dataNode name=”dataNode2″ dataHost=”dataHost2″ database=”hellomycat_2″ />
<dataNode name=”dataNode3″ dataHost=”dataHost3″ database=”hellomycat_3″ />

<dataHost name=”dataHost1″ maxCon=”1000″ minCon=”10″ balance=”0″
writeType=”0″ dbType=”mysql” dbDriver=”jdbc” switchType=”-1″ slaveThreshold=”100″>
<heartbeat>select user()</heartbeat>

<writeHost
host=”192.168.127.130″
url=”jdbc:mysql://192.168.127.130:3306?useSSL=false&serverTimezone=UTC&characterEncoding=utf8″
user=”root” password=”123456″>

</writeHost>
</dataHost>
<dataHost name=”dataHost2″ maxCon=”1000″ minCon=”10″ balance=”0″
writeType=”0″ dbType=”mysql” dbDriver=”jdbc” switchType=”-1″ slaveThreshold=”100″>
<heartbeat>select user()</heartbeat>
<writeHost
host=”192.168.127.130″
url=”jdbc:mysql://192.168.127.130:3307?useSSL=false&serverTimezone=UTC&characterEncoding=utf8″
user=”root” password=”123456″>

</writeHost>
</dataHost>
<dataHost name=”dataHost3″ maxCon=”1000″ minCon=”10″ balance=”0″
writeType=”0″ dbType=”mysql” dbDriver=”jdbc” switchType=”-1″ slaveThreshold=”100″>
<heartbeat>select user()</heartbeat>
<writeHost
host=”192.168.127.130″
url=”jdbc:mysql://192.168.127.130:3308?useSSL=false&serverTimezone=UTC&characterEncoding=utf8″
user=”root” password=”123456″>

</writeHost>
</dataHost>

</mycat:schema>

#### 分片规定配置如下

$ vi config/mycat/rule.xml

第 32 行配置

<tableRule name=”auto-sharding-long”>
<rule>

<columns>id</columns>

<algorithm>rang-long</algorithm>
</rule>
</tableRule>

第 105 行配置

<function name=”rang-long” class=”io.mycat.route.function.AutoPartitionByLong”>

<property name=”mapFile”>autopartition-long.txt</property>
</function>

#### 自定义数字范畴分片规定

$ vi config/mycat/autopartition-long.txt

配置如下:

# range start-end ,data node index
# K=1000,M=10000.
# ID 0-5000000 保留在 dataNode1
0-500M=0
# ID 5000000-10000000 保留在 dataNode2
500M-1000M=1
# ID 10000000-15000000 保留在 dataNode3
1000M-1500M=2

### 验证是否胜利

应用 MySQL 客户端工具连贯 MyCat,默认端口号为 8066

* 别离在 3 个数据库中创立表,只须要 ID 一个字段即可:

create table sys_user (id int not null primary key);

* 新增数据:

insert into sys_user(id) values(2000000);
insert into sys_user(id) values(7000000);
insert into sys_user(id) values(1200000);

新增后如果 3 个数据库的表中都呈现了一条数据,则阐明分片胜利。

> * 文章作者:彭超
>
> * 本文首发于集体博客:https://antoniopeng.com/2020/08/20/%E5%88%86%E5%B8%83%E5%BC%8F/%E5%88%86%E5%B8%83%E5%BC%8F%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B8%AD%E9%97%B4%E4%BB%B6%20MyCat%20-%20%E5%88%86%E5%BA%93%E5%88%86%E8%A1%A8%E5%AE%9E%E8%B7%B5/
>
> * 版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自 彭超的博客 | Antonio Blog
>

正文完
 0