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

2.DBLE

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

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

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_java_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_中间件_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_xml_05

6.连接DBLE的管理端

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

9.分库分表中间件DBLE_java_06

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

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

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


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

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

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

9.分库分表中间件DBLE_中间件_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_中间件_10


9.分库分表中间件DBLE_java_11


9.分库分表中间件DBLE_数据库_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