首页 > 其他分享 >9.分库分表中间件DBLE

9.分库分表中间件DBLE

时间:2023-02-06 11:01:07浏览次数:35  
标签:虚拟 分库 中间件 db range DBLE sharding tb


1.原理
分析SQL语句,根据SQL语义将SQL拆分成多个,发送至数据节点,将多个数据节点的结果聚集,返回客户端。

2.DBLE

基于MyCat的开源免费的、高性能、高可用的MySQL分库分表中间件。

9.分库分表中间件DBLE_MySQL

3.基本概念
(1).schema
虚拟数据库,被拆分的数据库,不同于传统数据库的schema概念。

(2).shardingTable
虚拟表,被拆分的数据表,如下图的shardingTable。
虚拟表有多种表类型,下面为常见的三种类型。

  • 全局表:每个节点上有保存表的完整数据。
  • 拆分表:被拆分的表,存入不同的节点,DBLE只支持水平分表。
  • 单独表:不拆分的表,存在单一节点。

(3).shardingNode
虚拟节点,存储在实际的数据库中,如下图的shardingNode1和shardingNode2。

(4).dbGroup
实际的MySQL集群,如下图MySQL1和MySQL2组成的MySQL集群。

(5).database

实际的database,如下图的DatabaseA和DatabaseB。

9.分库分表中间件DBLE_MySQL_02

4.安装配置
(1).下载解压

wget https://github.com/actiontech/dble/releases/download/3.22.11.0%2Ftag/dble-3.22.11.0-20230112061440-java1.8.0_151-linux.tar.gz
tar -xvf dble-3.22.11.0-20230112061440-java1.8.0_151-linux.tar.gz

9.分库分表中间件DBLE_MySQL_03

(2).复制配置文件

cd /root/dble/conf
cp cluster_template.cnf cluster.cnf
cp bootstrap_template.cnf bootstrap.cnf
cp db_template.xml db.xml
cp user_template.xml user.xml
cp sharding_template.xml sharding.xml

(3).cluster.cnf
配置了DBLE集群的信息,使用默认即可。

(4).bootstrap.cnf
配置了DBLE实例启动时加载的系统参数,使用默认即可。

(5).user.xml
配置了连接DBLE的用户信息,使用默认即可。

<dble:user xmlns:dble="http://dble.cloud/" version="4.0">
<!-- 用户管理 -->
<managerUser name="man1" password="654321" maxCon="100"/>
<managerUser name="user" usingDecrypt="true" whiteIPs="127.0.0.1,0:0:0:0:0:0:0:1" readOnly="true" password="AqEkFEuIFAX6g2TJQnp4cJ2r7Yc0Z4/KBsZqKhT8qSz18Aj91e8lxO49BKQElC6OFfW4c38pCYa8QGFTub7pnw=="/>

<!-- 数据管理 -->
<shardingUser name="root" password="123456" schemas="testdb" readOnly="false" blacklist="blacklist1" maxCon="20"/>
<shardingUser name="root2" password="123456" schemas="testdb,testdb2" maxCon="20" tenant="tenant1">
<privileges check="true">
<schema name="testdb" dml="0110">
<table name="tb_global1" dml="0000"/>
<table name="tb_global2" dml="1111"/>
</schema>
</privileges>
</shardingUser>

<analysisUser name="analysisUser" password="123456" dbGroup="dbGroup3" blacklist="blacklist1" maxCon="20"/>
<blacklist name="blacklist1">
<property name="selelctAllow">true</property>
</blacklist>
</dble:user>

(6).db.xml
配置了真实的数据库实例信息。

<?xml version="1.0"?>
<dble:db xmlns:dble="http://dble.cloud/" version="4.0">
<dbGroup name="dbGroup1" rwSplitMode="2" delayThreshold="100">
<heartbeat>show slave status</heartbeat>
<!-- 修改url、user和password -->
<dbInstance name="instanceM1" url="121.4.211.73:3306" user="root" password="********" maxCon="1000" minCon="10" primary="true" readWeight="1" id="xx1">
<property name="testWhileIdle">true</property>
</dbInstance>
<!-- 配置从节点实例信息 -->
<!--<dbInstance name="instanceS1" url="ip3:3306" user="your_user" password="your_psw" maxCon="1000" minCon="10" readWeight="2" disabled="true">-->
<!--<property name="testWhileIdle">false</property>-->
<!--</dbInstance>-->
</dbGroup>

<dbGroup name="dbGroup2" rwSplitMode="0" delayThreshold="100" disableHA="true">
<heartbeat errorRetryCount="1" timeout="10" keepAlive="60">show slave status</heartbeat>
<!-- 修改url、user和password -->
<dbInstance name="instanceM2" url="121.4.191.124:3306" user="root" password="********" maxCon="1000" minCon="10" primary="true">
<property name="testWhileIdle">true</property>
</dbInstance>
</dbGroup>
</dble:db>

(7).sharding.xml
配置了虚拟节点shardingNode、虚拟数据库schema、虚拟数据表shardingTable和分表规则function。

<?xml version="1.0"?>
<dble:sharding xmlns:dble="http://dble.cloud/" version="4.0">
<schema name="testdb" sqlMaxLimit="100">
<shardingTable name="tb_enum_sharding" shardingNode="dn1,dn2" sqlMaxLimit="200" function="func_enum" shardingColumn="code"/>
<!-- 范围分表规则 -->
<shardingTable name="tb_range_sharding" shardingNode="dn1,dn2,dn3" function="func_range" shardingColumn="id"/>

<shardingTable name="tb_hash_sharding" shardingNode="dn1,dn2" function="func_common_hash" shardingColumn="id"/>
<shardingTable name="tb_hash_sharding_er1" shardingNode="dn1,dn2" function="func_common_hash" shardingColumn="id"/>
<shardingTable name="tb_hash_sharding_er2" shardingNode="dn1,dn2" function="func_common_hash" shardingColumn="id2"/>
<shardingTable name="tb_hash_sharding_er3" shardingNode="dn1,dn2" function="func_common_hash" shardingColumn="id" incrementColumn="id2"/>

<shardingTable name="tb_uneven_hash" shardingNode="dn1,dn2,dn3" function="func_uneven_hash" shardingColumn="id"/>

<shardingTable name="tb_mod" shardingNode="dn1,dn2,dn3,dn4" function="func_mod" shardingColumn="id" sqlRequiredSharding="true"/>

<shardingTable name="tb_jump_hash" shardingNode="dn1,dn2" function="func_jumpHash" shardingColumn="code"/>

<shardingTable name="tb_hash_string" shardingNode="dn1,dn2,dn3,dn4" function="func_hashString" shardingColumn="code"/>

<shardingTable name="tb_date" shardingNode="dn1,dn2,dn3,dn4" function="func_date" shardingColumn="create_date"/>

<shardingTable name="tb_pattern" shardingNode="dn1,dn2" function="func_pattern" shardingColumn="id"/>

<globalTable name="tb_global1" shardingNode="dn1,dn2" sqlMaxLimit="103" />
<globalTable name="tb_global2" shardingNode="dn1,dn2,dn3,dn4" cron="0 0 0 * * ?" checkClass="CHECKSUM"/>

<singleTable name="tb_single" shardingNode="dn6" sqlMaxLimit="105"/>

<shardingTable name="tb_parent" shardingNode="dn1,dn2" function="func_common_hash" shardingColumn="id">
<childTable name="tb_child1" joinColumn="child1_id" parentColumn="id" sqlMaxLimit="201">
<childTable name="tb_grandson1" joinColumn="grandson1_id" parentColumn="child1_id"/>
<childTable name="tb_grandson2" joinColumn="grandson2_id" parentColumn="child1_id2"/>
</childTable>
<childTable name="tb_child2" joinColumn="child2_id" parentColumn="id"/>
<childTable name="tb_child3" joinColumn="child3_id" parentColumn="id2"/>
</shardingTable>
</schema>

<schema name="testdb2" shardingNode="dn5"/>
<shardingNode name="dn1" dbGroup="dbGroup1" database="db_1"/>
<shardingNode name="dn2" dbGroup="dbGroup2" database="db_2"/>
<shardingNode name="dn3" dbGroup="dbGroup1" database="db_3"/>
<shardingNode name="dn4" dbGroup="dbGroup2" database="db_4"/>
<shardingNode name="dn5" dbGroup="dbGroup1" database="db_5"/>
<shardingNode name="dn6" dbGroup="dbGroup2" database="db_6"/>

<function name="func_enum" class="Enum">
<property name="mapFile">partition-enum.txt</property>
<property name="defaultNode">0</property>
<property name="type">0</property>
</function>

<function name="func_range" class="NumberRange">
<!-- 范围分表规则具体实现,以txt文件存储 -->
<property name="mapFile">partition-number-range.txt</property>
<property name="defaultNode">0</property>
</function>

<function name="func_common_hash" class="Hash">
<property name="partitionCount">2</property>
<property name="partitionLength">512</property>
</function>

<function name="func_uneven_hash" class="Hash">
<property name="partitionCount">2,1</property>
<property name="partitionLength">256,512</property>
</function>

<function name="func_mod" class="Hash">
<property name="partitionCount">4</property>
<property name="partitionLength">1</property>
</function>

<function name="func_jumpHash" class="jumpStringHash">
<property name="partitionCount">2</property>
<property name="hashSlice">0:2</property>
</function>

<function name="func_hashString" class="StringHash">
<property name="partitionCount">4</property>
<property name="partitionLength">256</property>
<property name="hashSlice">0:2</property>
<!--<property name="hashSlice">-4:0</property> -->
</function>

<function name="func_date" class="Date">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2015-01-01</property>
<property name="sEndDate">2015-01-31</property>
<property name="sPartionDay">10</property>
<property name="defaultNode">0</property>
</function>

<function name="func_pattern" class="PatternRange">
<property name="mapFile">partition-pattern.txt</property>
<property name="patternValue">1024</property>
<property name="defaultNode">0</property>
</function>
</dble:sharding>

9.分库分表中间件DBLE_数据库_04

5.启动

cd /root/dble
bin/dble start

9.分库分表中间件DBLE_java_05

6.连接DBLE的管理端

mysql -uman1 -h'127.0.0.1' -P9066 -p654321

9.分库分表中间件DBLE_xml_06

7.在DBLE管理端创建sharding.xml里配置的dn1-dn6
退出DBLE管理端,进入MySQL,查看数据库信息

mysql -uroot -h'127.0.0.1' -P3306 -p
mysql> show databases;

9.分库分表中间件DBLE_xml_07


9.分库分表中间件DBLE_MySQL_08

7.连接DBLE数据端操作数据
(1).连接,查询虚拟数据库

mysql -uroot -h'127.0.0.1' -P8066 -p123456
mysql> show databases;

9.分库分表中间件DBLE_xml_09


DBLE里存在一个虚拟数据库testdb,testdb被放在6个虚拟节点上,其中dn1、dn3、dn5存放在121.4.211.73的MySQL里,dn2、dn4、dn6存放在121.4.191.124的MySQL里。

(2).查询sharing.xml中tb_range_sharding表的建表语句

cd /root/dble/conf
vim template_table.sql
drop table if exists tb_range_sharding;
create table if not exists tb_range_sharding (
id int not null,
content varchar(250) not null,
primary key(id)
)engine=innodb charset=utf8;
insert into tb_range_sharding values(1,'1'),(5000001,'5000001'),(10000001,'10000001');

(3).进入虚拟数据库创建虚拟表并插入数据

mysql -uroot -h'127.0.0.1' -P8066 -p123456
mysql> use testdb;
drop table if exists tb_range_sharding;
create table if not exists tb_range_sharding (
id int not null,
content varchar(250) not null,
primary key(id)
)engine=innodb charset=utf8;
insert into tb_range_sharding values(1,'1'),(5000001,'5000001'),(10000001,'10000001');

(4).进入真实数据库验证数据

mysql -uroot -h'127.0.0.1' -P3306 -p
mysql> show databases;
mysql> use db_1;
mysql> show tables;
mysql> select * from tb_range_sharding;

9.分库分表中间件DBLE_xml_10


9.分库分表中间件DBLE_xml_11


9.分库分表中间件DBLE_java_12


由下面的配置信息可知,虚拟表tb_range_sharding按照id范围进行分表,0-500w进入db_1,500w-1000w进入db_2,1000w-1500w进入db_3,15000001应该进入db_1(tb_range_sharding表只配置了dn1,dn2,dn3,分别对应db_1,db_2,db_3,如果有db_4,那15000001应该进入db_4)。

<?xml version="1.0"?>
<dble:sharding xmlns:dble="http://dble.cloud/" version="4.0">
<schema name="testdb" sqlMaxLimit="100">
<!-- 范围分表规则 -->
<shardingTable name="tb_range_sharding" shardingNode="dn1,dn2,dn3" function="func_range" shardingColumn="id"/>

<shardingNode name="dn1" dbGroup="dbGroup1" database="db_1"/>
<shardingNode name="dn2" dbGroup="dbGroup2" database="db_2"/>
<shardingNode name="dn3" dbGroup="dbGroup1" database="db_3"/>
<shardingNode name="dn4" dbGroup="dbGroup2" database="db_4"/>
<shardingNode name="dn5" dbGroup="dbGroup1" database="db_5"/>
<shardingNode name="dn6" dbGroup="dbGroup2" database="db_6"/>

<function name="func_range" class="NumberRange">
<!-- 范围分表规则具体实现,以txt文件存储 -->
<property name="mapFile">partition-number-range.txt</property>
<property name="defaultNode">0</property>
</function>
</dble:sharding>

9.分库分表中间件DBLE_数据库_04


标签:虚拟,分库,中间件,db,range,DBLE,sharding,tb
From: https://blog.51cto.com/u_15843693/6038761

相关文章

  • 京东618大促压测时自研中间件暴露出的问题总结,压测级别数十万/秒
    前天618大促演练进行了全链路压测,在此之前刚好我的​​热key探测框架​​(点击可跳转到开源地址)也已经上线灰度一周了,小范围上线了几千台服务器,每秒大概接收几千个key探测,每......
  • 中间件介绍
    1.介绍2.组成3.中间件的合作伙伴//自定义中间件,https://localhost:44391/test请求结果为:/*1start2......
  • 【一句话】中间件调用顺序
    洋葱模型koaapp.use按顺序注册中间件,然后依次next调用自己的下一个中间件,awaitnext之后,整个的调用路径就像一个洋葱一样,从皮走到心,再从心走到皮除了koa之外很多带中......
  • 中间件Canal之Canal简单使用
    一.简单介绍​​Canal​​​是​​Java​​​开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件。目前,​​Canal​​​主要支持了​​MySQL​​​的​​Binlog​......
  • 官宣:计算中间件 Apache Linkis 正式毕业成为 Apache 顶级项目
    Apache软件基金会(ASF)孵化器于2022年12月03日,通过了ApacheLinkis计算中间件项目的孵化毕业投票。2023年01月18日,Apache软件基金会官方宣布ApacheLinkis顺利毕业,成为......
  • 数据同步中间件DataX
    今天介绍一款不错的中间件:DataX当有项目的数据量高达五千万,但是因为报表那块数据不太准确,业务库和报表库又是跨库操作,所以并不能使用SQL来进行同步。当时的打算是通过​​......
  • 分库分表后全局唯一ID的四种生成策略对比
    分库分表之后,ID主键如何处理?当业务量大的时候,数据库中数据量过大,就要进行分库分表了,那么分库分表之后,必然将面临一个问题,那就是ID怎么生成?因为要分成多个表之后,如果还是......
  • 数据库分库分表-水平分片与垂直分片
    水平分片与垂直分片垂直分片:​ 按照业务维度将表拆到不同的数据库中,专库专用,分担数据库压力​ 缺点:单表数据量大时,无法解决数据库访问慢的问题水平分片:​ 按照某种规......
  • 千万级数据,如何做性能优化?分库分表、Oracle分区表?
    大家好,我是哪吒,最近项目有一个新的需求,​​按月建表,按天分区​​。不都是分库分表吗?怎么又来个分区?让我们一起,一探究竟,深入理解一下Oracle分区表技术,实现快速入门,丰富个人简......
  • MySql分库分表
    MySql分库分表分库分表策略当数据量达到一定程度时,我们出于性能考虑就需要将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果......