9.分库分表中间件DBLE
1.原理
分析SQL语句,根据SQL语义将SQL拆分成多个,发送至数据节点,将多个数据节点的结果聚集,返回客户端。
2.DBLE
基于MyCat的开源免费的、高性能、高可用的MySQL分库分表中间件。

3.基本概念
(1).schema
虚拟数据库,被拆分的数据库,不同于传统数据库的schema概念。
(2).shardingTable
虚拟表,被拆分的数据表,如下图的shardingTable。
虚拟表有多种表类型,下面为常见的三种类型。
- 全局表:每个节点上有保存表的完整数据。
- 拆分表:被拆分的表,存入不同的节点,DBLE只支持水平分表。
- 单独表:不拆分的表,存在单一节点。
(3).shardingNode
虚拟节点,存储在实际的数据库中,如下图的shardingNode1和shardingNode2。
(4).dbGroup
实际的MySQL集群,如下图MySQL1和MySQL2组成的MySQL集群。
(5).database
实际的database,如下图的DatabaseA和DatabaseB。

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

(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>

5.启动
cd /root/dble
bin/dble start

6.连接DBLE的管理端
mysql -uman1 -h'127.0.0.1' -P9066 -p654321

7.在DBLE管理端创建sharding.xml里配置的dn1-dn6
退出DBLE管理端,进入MySQL,查看数据库信息
mysql -uroot -h'127.0.0.1' -P3306 -p
mysql> show databases;


7.连接DBLE数据端操作数据
(1).连接,查询虚拟数据库
mysql -uroot -h'127.0.0.1' -P8066 -p123456
mysql> show databases;

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;



由下面的配置信息可知,虚拟表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>

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
