Mycat数据库分布式架构方式

本文详细介绍了Mycat数据库分布式架构的垂直拆分和水平拆分策略,包括range、取模、枚举和hash等方法。内容涵盖Mycat的基础应用,如主从读写分离、高可用配置,以及Mycat的高级应用,如垂直分表和水平分片(范围、取模、枚举)。通过实例展示了如何配置和测试Mycat的分布式解决方案。
摘要由CSDN通过智能技术生成
  1. 数据库分布式架构方式
    3.1 垂直拆分
    3.2 水平拆分
    range
    取模
    枚举
    hash
    时间
    等等

  2. Mycat基础应用
    4.1 主要配置文件介绍

rule.xml	*****,分片策略定义
schema.xml  *****,主配置文件
server.xml	***  ,mycat服务有关
log4j2.xml  ***  ,记录日志有关
*.txt			 ,分片策略使用的规则  

4.2 用户创建及数据库导入
db01:
mysql -S /data/3307/mysql.sock

grant all on *.* to root@'10.0.0.%' identified by '123';
source /root/world.sql

mysql -S /data/3308/mysql.sock

grant all on *.* to root@'10.0.0.%' identified by '123';
source /root/world.sql

4.3 配置文件结构介绍
cd /application/mycat/conf
mv schema.xml schema.xml.bak
vim schema.xml

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

mycat 逻辑库定义:
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="sh1">  
</schema> 

数据节点定义:
	<dataNode name="sh1" dataHost="test1" database= "world" />   
	
后端主机定义:
        <dataHost name="test1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">    
                <heartbeat>select user()</heartbeat>  
        <writeHost host="db1" url="10.0.0.51:3307" user="root" password="123">
                        <readHost host="db2" url="10.0.0.51:3309" user="root" password="123" /> 
        </writeHost> 
        </dataHost>  
			
</mycat:schema>

注:switchType="1" 如果后端使用其他高可用如MHA PXC等需要改为3

4.4 mycat实现1主1从读写分离
vim schema.xml

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="sh1"> 
</schema>  
        <dataNode name="sh1" dataHost="test1" database= "world" />         
        <dataHost name="test1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">    
                <heartbeat>select user()</heartbeat>  
        <writeHost host="db1" url="10.0.0.51:3307" user="root" password="123">
                        <readHost host="db2" url="10.0.0.51:3309" user="root" password="123" /> 
        </writeHost> 
        </dataHost>  
</mycat:schema>

4.5 Mycat高可用+读写分离
mv schema.xml schema.xml.1
vim schema.xml

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="sh1"> 
</schema>  
        <dataNode name="sh1" dataHost="test1" database= "world" />         
        <dataHost name="test1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">    
                <heartbeat>select user()</heartbeat>  
        <writeHost host="db1" url="10.0.0.51:3307" user="root" password="123">
                        <readHost host="db2" url="10.0.0.51:3309" user="root" password="123" /> 
        </writeHost> 
		 <writeHost host="db3" url="10.0.0.52:3307" user="root" password="123">
                        <readHost host="db4" url="10.0.0.52:3309" user="root" password="123" /> 
        </writeHost> 
        </dataHost>  
</mycat:schema>

说明:

<writeHost host="db1" url="10.0.0.51:3307" user="root" password="123">
            <readHost host="db2" url="10.0.0.51:3309" user="root" password="123" /> 
</writeHost> 
<writeHost host="db3" url="10.0.0.52:3307" user="root" password="123">
            <readHost host="db4" url="10.0.0.52:3309" user="root" password="123" /> 
 </writeHost> 

第一个 whost: 10.0.0.51:3307 真正的写节点,负责写操作
第二个 whost: 10.0.0.52:3307 准备写节点,负责读,当 10.0.0.51:3307宕掉,会切换为真正的写节点

测试:
[root@db01 conf]# mysql -uroot -p123456 -h 10.0.0.51 -P 8066

读:
mysql> select @@server_id;
写:
mysql> begin ;select @@server_id; commit;

4.6 配置中的属性介绍:

balance属性
负载均衡类型,目前的取值有3种:

  1. balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
  2. balance=“1”,全部的readHost与standby writeHost参与select语句的负载均衡,简单的说,
    当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
  3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发。

writeType属性
负载均衡类型,目前的取值有2种:

  1. writeType=“0”, 所有写操作发送到配置的第一个writeHost,
    第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为主,切换记录在配置文件中:dnindex.properties .
  2. writeType=“1”,所有写操作都随机的发送到配置的writeHost,但不推荐使用

switchType属性
-1 表示不自动切换
1 默认值,自动切换
2 基于MySQL主从同步的状态决定是否切换 ,心跳语句为 show slave status
datahost其他配置

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1"> 

maxCon=“1000”:最大的并发连接数
minCon=“10” :mycat在启动之后,会在后端节点上自动开启的连接线程

tempReadHostAvailable=“1”
这个一主一从时(1个writehost,1个readhost时),可以开启这个参数,如果2个writehost,2个readhost时
<heartbeat>select user()</heartbeat> 监测心跳

  1. Mycat高级应用-分布式解决方案
    5.1 垂直分表
    mv schema.xml schema.xml.ha
    vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="sh1">
        <table name="user" dataNode="sh1"/>
        <table name="order_t" dataNode="sh2"/>
</schema>
    <dataNode name="sh1" dataHost="test1" database= "taobao" />
    <dataNode name="sh2" dataHost="test2" database= "taobao" />
    <dataHost name="test1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">
        <heartbeat>select user()</heartbeat>
    <writeHost host="db1" url="10.0.0.51:3307" user="root" password="123">
            <readHost host="db2" url="10.0.0.51:3309" user="root" password="123" />
    </writeHost>
    <writeHost host="db3" url="10.0.0.52:3307" user="root" password="123">
            <readHost host="db4" url="10.0.0.52:3309" user="root" password="123" />
    </writeHost>
    </dataHost>
	
    <dataHost name="test2" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">
        <heartbeat>select user()</heartbeat>
    <writeHost host="db1" url="10.0.0.51:3308" user="root" password="123">
            <readHost host="db2" url="10.0.0.51:3310" user="root" password="123" />
    </writeHost>
    <writeHost host="db3" url="10.0.0.52:3308" user="root" password="123">
            <readHost host="db4" url="10.0.0.52:3310" user="root" password="123" />
    </writeHost>
    </dataHost>	
</mycat:schema>

创建测试库和表:
[root@db01 conf]# mysql -S /data/3307/mysql.sock -e “create database taobao charset utf8;”
[root@db01 conf]# mysql -S /data/3308/mysql.sock -e “create database taobao charset utf8;”
[root@db01 conf]# mysql -S /data/3307/mysql.sock -e “use taobao;create table user(id int,name varchar(20))”;
[root@db01 conf]# mysql -S /data/3308/mysql.sock -e “use taobao;create table order_t(id int,name varchar(20))”

重启mycat :
mycat restart

测试功能:
[root@db01 conf]# mysql -uroot -p123456 -h 10.0.0.51 -P 8066
mysql> use TESTDB
mysql> insert into user(id ,name ) values(1,‘a’),(2,‘b’);
mysql> commit;

mysql> insert into order_t(id ,name ) values(1,‘a’),(2,‘b’);
mysql> commit;

[root@db01 ~]# mysql -S /data/3307/mysql.sock -e “show tables from taobao;”
±-----------------+
| Tables_in_taobao |
±-----------------+
| user |
±-----------------+
[root@db01 ~]# mysql -S /data/3308/mysql.sock -e “show tables from taobao;”
±-----------------+
| Tables_in_taobao |
±-----------------+
| order_t |
±-----------------+
[root@db01 ~]#

5.2 Mycat分布式-水平拆分(分片)介绍
分片:对一个"bigtable",比如说t3表
(1)行数非常多,800w
(2)访问非常频繁

分片的目的:
(1)将大数据量进行分布存储
(2)提供均衡的访问路由

分片策略:
范围 range 800w 1-400w 400w01-800w
取模 mod 取余数
枚举
哈希 hash
时间 流水

优化关联查询
全局表
ER分片

5.3 Mycat分布式-范围分片
比如说t3表
(1)行数非常多,2000w(1-1000w:sh1 1000w01-2000w:sh2)
(2)访问非常频繁,用户访问较离散
cp schema.xml schema.xml.11
vim schema.xml

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="sh1"> 
        <table name="t3" dataNode="sh1,sh2" rule="auto-sharding-long" />
</schema>  
    <dataNode name="sh1" dataHost="test1" database= "taobao" /> 
    <dataNode name="sh2" dataHost="test2" database= "taobao" />  

vim rule.xml
<tableRule name="auto-sharding-long">
                <rule>
                        <columns>id</columns>
                        <algorithm>rang-long</algorithm>
                </rule>             
<function name="rang-long"
    class="io.mycat.route.function.AutoPartitionByLong">
    <property name="mapFile">autopartition-long.txt</property>
</function>

vim autopartition-long.txt
1-10=0 -----> >=1 , <=10
10-20=1 -----> >10 ,<=20

创建测试表:
mysql -S /data/3307/mysql.sock -e “use taobao;create table t3 (id int not null primary key auto_increment,name varchar(20) not null);”

mysql -S /data/3308/mysql.sock -e “use taobao;create table t3 (id int not null primary key auto_increment,name varchar(20) not null);”

测试:
重启mycat
mycat restart

mysql -uroot -p123456 -h 127.0.0.1 -P 8066
insert into t3(id,name) values(1,‘a’);
insert into t3(id,name) values(2,‘b’);
insert into t3(id,name) values(3,‘c’);
insert into t3(id,name) values(10,‘d’);
insert into t3(id,name) values(11,‘aa’);
insert into t3(id,name) values(12,‘bb’);
insert into t3(id,name) values(13,‘cc’);
insert into t3(id,name) values(14,‘dd’);
insert into t3(id,name) values(20,‘dd’);

5.4 取模分片(mod-long):
取余分片方式:分片键(一个列)与节点数量进行取余,得到余数,将数据写入对应节点

vim schema.xml

<table name="t4" dataNode="sh1,sh2" rule="mod-long" />


vim rule.xml
<property name="count">2</property>

准备测试环境
创建测试表:
mysql -S /data/3307/mysql.sock -e “use taobao;create table t4 (id int not null primary key auto_increment,name varchar(20) not null);”
mysql -S /data/3308/mysql.sock -e “use taobao;create table t4 (id int not null primary key auto_increment,name varchar(20) not null);”

重启mycat
mycat restart

测试:
mysql -uroot -p123456 -h10.0.0.51 -P8066

use TESTDB
insert into t4(id,name) values(1,‘a’);
insert into t4(id,name) values(2,‘b’);
insert into t4(id,name) values(3,‘c’);
insert into t4(id,name) values(4,‘d’);

分别登录后端节点查询数据
mysql -S /data/3307/mysql.sock -e “select * from taobao.t4;”
mysql -S /data/3308/mysql.sock -e “select * from taobao.t4;”

  1. 枚举分片
    t5 表
    id name telnum
    1 bj 1212
    2 sh 22222
    3 bj 3333
    4 sh 44444
    5 bj 5555
vim schema.xml
<table name="t4" dataNode="sh1,sh2" rule="sharding-by-intfile" />

vim schema.xml

<table name="t5" dataNode="sh1,sh2" rule="sharding-by-intfile" />

vim rule.xml

<tableRule name="sharding-by-intfile"> 
<rule> <columns>name</columns> 
<algorithm>hash-int</algorithm> 
</rule> 
</tableRule> 

<function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap"> 
<property name="mapFile">partition-hash-int.txt</property> 
  <property name="type">1</property>                                        #支持字符串
                <property name="defaultNode">0</property>
</function> 

partition-hash-int.txt 配置:
bj=0
sh=1
DEFAULT_NODE=1

columns 标识将要分片的表字段,algorithm 分片函数, 其中分片函数配置中,mapFile标识配置文件名称

准备测试环境

mysql -S /data/3307/mysql.sock -e “use taobao;create table t5 (id int not null primary key auto_increment,name varchar(20) not null);”

mysql -S /data/3308/mysql.sock -e “use taobao;create table t5 (id int not null primary key auto_increment,name varchar(20) not null);”
重启mycat
mycat restart
mysql -uroot -p123456 -h10.0.0.51 -P8066
use TESTDB
insert into t5(id,name) values(1,‘bj’);
insert into t5(id,name) values(2,‘sh’);
insert into t5(id,name) values(3,‘bj’);
insert into t5(id,name) values(4,‘sh’);
insert into t5(id,name) values(5,‘tj’);
分别登录后端节点查询数据

mysql -S /data/3307/mysql.sock -e "select * from taobao.t5;"
mysql -S /data/3308/mysql.sock -e "select * from taobao.t5;"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值