• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

9.分库分表间件DBLE

武飞扬头像
lwen.steven
帮助1

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/tag/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>
学新通

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiaekbh
系列文章
更多 icon
同类精品
更多 icon
继续加载