mysql 分布式架构_MySQL-分布式架构-MyCAT

atlas实现了读写分离,成千上万的用户进行写入的操作的时候,希望引入在不同节点写的轮询

MyCAT基础架构图

2a31e463235be997ec19baa188e735b6.png

MyCAT基础环境(mysql多实例)搭建

1.1 环境准备:

两台虚拟机 db01 db02

每台创建四个mysql实例:3307 3308 3309 3310

1.2 删除历史环境:

pkill mysqld

\rm -rf /data/330*

\mv /etc/my.cnf /etc/my.cnf.bak

1.3 创建相关目录初始化数据

mkdir /data/33{07..10}/data -p

mysqld --initialize-insecure --user=mysql --datadir=/data/3307/data --basedir=/application/mysql

mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/application/mysql

mysqld --initialize-insecure --user=mysql --datadir=/data/3309/data --basedir=/application/mysql

mysqld --initialize-insecure --user=mysql --datadir=/data/3310/data --basedir=/application/mysql

1.4 准备DB01配置文件和启动脚本

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

cat >/data/3307/my.cnf<

[mysqld]

basedir=/application/mysql

datadir=/data/3307/data

socket=/data/3307/mysql.sock

port=3307log-error=/data/3307/mysql.log

log_bin=/data/3307/mysql-bin

binlog_format=row

skip-name-resolve

server-id=7gtid-mode=on

enforce-gtid-consistency=truelog-slave-updates=1EOF

cat>/data/3308/my.cnf<

[mysqld]

basedir=/application/mysql

datadir=/data/3308/data

port=3308socket=/data/3308/mysql.sock

log-error=/data/3308/mysql.log

log_bin=/data/3308/mysql-bin

binlog_format=row

skip-name-resolve

server-id=8gtid-mode=on

enforce-gtid-consistency=truelog-slave-updates=1EOF

cat>/data/3309/my.cnf<

[mysqld]

basedir=/application/mysql

datadir=/data/3309/data

socket=/data/3309/mysql.sock

port=3309log-error=/data/3309/mysql.log

log_bin=/data/3309/mysql-bin

binlog_format=row

skip-name-resolve

server-id=9gtid-mode=on

enforce-gtid-consistency=truelog-slave-updates=1EOF

cat>/data/3310/my.cnf<

[mysqld]

basedir=/application/mysql

datadir=/data/3310/data

socket=/data/3310/mysql.sock

port=3310log-error=/data/3310/mysql.log

log_bin=/data/3310/mysql-bin

binlog_format=row

skip-name-resolve

server-id=10gtid-mode=on

enforce-gtid-consistency=truelog-slave-updates=1EOF

cat>/etc/systemd/system/mysqld3307.service<

[Unit]

Description=MySQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf

LimitNOFILE= 5000EOF

cat>/etc/systemd/system/mysqld3308.service<

[Unit]

Description=MySQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf

LimitNOFILE= 5000EOF

cat>/etc/systemd/system/mysqld3309.service<

[Unit]

Description=MySQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf

LimitNOFILE= 5000EOF

cat>/etc/systemd/system/mysqld3310.service<

[Unit]

Description=MySQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3310/my.cnf

LimitNOFILE= 5000EOF

View Code

1.5 准备DB02配置文件和启动脚本

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

cat >/data/3307/my.cnf<

[mysqld]

basedir=/application/mysql

datadir=/data/3307/data

socket=/data/3307/mysql.sock

port=3307log-error=/data/3307/mysql.log

log_bin=/data/3307/mysql-bin

binlog_format=row

skip-name-resolve

server-id=17gtid-mode=on

enforce-gtid-consistency=truelog-slave-updates=1EOF

cat>/data/3308/my.cnf<

[mysqld]

basedir=/application/mysql

datadir=/data/3308/data

port=3308socket=/data/3308/mysql.sock

log-error=/data/3308/mysql.log

log_bin=/data/3308/mysql-bin

binlog_format=row

skip-name-resolve

server-id=18gtid-mode=on

enforce-gtid-consistency=truelog-slave-updates=1EOF

cat>/data/3309/my.cnf<

[mysqld]

basedir=/application/mysql

datadir=/data/3309/data

socket=/data/3309/mysql.sock

port=3309log-error=/data/3309/mysql.log

log_bin=/data/3309/mysql-bin

binlog_format=row

skip-name-resolve

server-id=19gtid-mode=on

enforce-gtid-consistency=truelog-slave-updates=1EOF

cat>/data/3310/my.cnf<

[mysqld]

basedir=/application/mysql

datadir=/data/3310/data

socket=/data/3310/mysql.sock

port=3310log-error=/data/3310/mysql.log

log_bin=/data/3310/mysql-bin

binlog_format=row

skip-name-resolve

server-id=20gtid-mode=on

enforce-gtid-consistency=truelog-slave-updates=1EOF

cat>/etc/systemd/system/mysqld3307.service<

[Unit]

Description=MySQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf

LimitNOFILE= 5000EOF

cat>/etc/systemd/system/mysqld3308.service<

[Unit]

Description=MySQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf

LimitNOFILE= 5000EOF

cat>/etc/systemd/system/mysqld3309.service<

[Unit]

Description=MySQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf

LimitNOFILE= 5000EOF

cat>/etc/systemd/system/mysqld3310.service<

[Unit]

Description=MySQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3310/my.cnf

LimitNOFILE= 5000EOF

View Code

1.6 修改权限,启动多实例

chown -R mysql.mysql /data/*

systemctl start mysqld3307

systemctl start mysqld3308

systemctl start mysqld3309

systemctl start mysqld3310

1.6.1 db01上检查mysql多实例是否配置成功

mysql -S /data/3307/mysql.sock -e "show variables like 'server_id'"

mysql -S /data/3308/mysql.sock -e "show variables like 'server_id'"

mysql -S /data/3309/mysql.sock -e "show variables like 'server_id'"

mysql -S /data/3310/mysql.sock -e "show variables like 'server_id'"

1c0f20141a24f186da9018e9908d906b.png

1.6.2 db02上检查mysql多实例是否配置成功

mysql -S /data/3307/mysql.sock -e "show variables like 'server_id'"

mysql -S /data/3308/mysql.sock -e "show variables like 'server_id'"

mysql -S /data/3309/mysql.sock -e "show variables like 'server_id'"

mysql -S /data/3310/mysql.sock -e "show variables like 'server_id'"

4504afb3ca6e1632b7c52dcefbf25601.png

1.7 节点主从规划

箭头指向谁是主库

10.0.0.51:3307 10.0.0.52:3307

10.0.0.51:3309 ------> 10.0.0.51:3307

10.0.0.52:3309 ------> 10.0.0.52:3307

10.0.0.52:3308 10.0.0.51:3308

10.0.0.52:3310 -----> 10.0.0.52:3308

10.0.0.51:3310 -----> 10.0.0.51:3308

1.8 分片规划

shard1:

Master:10.0.0.51:3307

slave1:10.0.0.51:3309

Standby Master:10.0.0.52:3307

slave2:10.0.0.52:3309

shard2:

Master:10.0.0.52:3308

slave1:10.0.0.52:3310

Standby Master:10.0.0.51:3308

slave2:10.0.0.51:3310

1.9 开始配置

第一组四节点结构

10.0.0.51:3307 10.0.0.52:3307 互为主从搭建

db02执行:

mysql -S /data/3307/mysql.sock -e "grant replication slave on *.* to repl@'10.0.0.%' identified by '123';"

mysql -S /data/3307/mysql.sock -e "grant all on *.* to root@'10.0.0.%' identified by '123' with grant option;"

db01执行:

mysql -S /data/3307/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"

mysql -S /data/3307/mysql.sock -e "start slave;"

mysql -S /data/3307/mysql.sock -e "show slave status\G"

db02执行:

mysql -S /data/3307/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.0.51', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"

mysql -S /data/3307/mysql.sock -e "start slave;"

mysql -S /data/3307/mysql.sock -e "show slave status\G"

10.0.0.51:3309 ------> 10.0.0.51:3307 (51上配置3309从3307主)

db01执行:

mysql -S /data/3309/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.0.51', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"

mysql -S /data/3309/mysql.sock -e "start slave;"

mysql -S /data/3309/mysql.sock -e "show slave status\G"

10.0.0.52:3309 ------> 10.0.0.52:3307(52上配置3309从3307主)

db02执行:

mysql -S /data/3309/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"

mysql -S /data/3309/mysql.sock -e "start slave;"

mysql -S /data/3309/mysql.sock -e "show slave status\G"

第二组四节点结构

10.0.0.52:3308 10.0.0.51:3308

db01执行:

mysql -S /data/3308/mysql.sock -e "grant replication slave on *.* to repl@'10.0.0.%' identified by '123';"

mysql -S /data/3308/mysql.sock -e "grant all on *.* to root@'10.0.0.%' identified by '123' with grant option;"

db02执行:

mysql -S /data/3308/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.0.51', MASTER_PORT=3308, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"

mysql -S /data/3308/mysql.sock -e "start slave;"

mysql -S /data/3308/mysql.sock -e "show slave status\G"

db01执行:

mysql -S /data/3308/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3308, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"

mysql -S /data/3308/mysql.sock -e "start slave;"

mysql -S /data/3308/mysql.sock -e "show slave status\G"

10.0.0.52:3310 -----> 10.0.0.52:3308

db02执行:

mysql -S /data/3310/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3308, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"

mysql -S /data/3310/mysql.sock -e "start slave;"

mysql -S /data/3310/mysql.sock -e "show slave status\G"

10.0.0.51:3310 -----> 10.0.0.51:3308

db01执行:

mysql -S /data/3310/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.0.51', MASTER_PORT=3308, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"

mysql -S /data/3310/mysql.sock -e "start slave;"

mysql -S /data/3310/mysql.sock -e "show slave status\G"

1.10 检测主从状态

mysql -S /data/3307/mysql.sock -e "show slave status\G"|grep Yes

mysql -S /data/3308/mysql.sock -e "show slave status\G"|grep Yes

mysql -S /data/3309/mysql.sock -e "show slave status\G"|grep Yes

mysql -S /data/3310/mysql.sock -e "show slave status\G"|grep Yes

3a9c604889f911c9a28b8c5f98425cf1.png

注:如果中间出现错误,在每个节点进行执行以下命令,从第1.9步重新开始即可

mysql -S /data/3307/mysql.sock -e "stop slave; reset slave all;"

mysql -S /data/3308/mysql.sock -e "stop slave; reset slave all;"

mysql -S /data/3309/mysql.sock -e "stop slave; reset slave all;"

mysql -S /data/3310/mysql.sock -e "stop slave; reset slave all;"

MySQL分布式架构介绍

1. schema拆分及业务分库

2. 垂直拆分-分库分表,把在一个实例上的库或者表查分到不同的实例上去

3. 水平拆分-分片把一个表中的数据拆分到不同的实例上去

分布式解决的是,在读数据库操作的时候把查分的表练习在一起

cc47e6faaf185b3e0a046d32948002d4.png

企业代表产品

360 Atlas-Sharding

Alibaba cobar

Mycat

TDDL

Heisenberg

Oceanus

Vitess

OneProxy

DRDS

MyCAT安装

1 预先安装Java运行环境

yum install -y java

2 下载

Mycat-server-xxxxx.linux.tar.gz

http://dl.mycat.io/

3 解压文件

tar xf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz

4 软件目录结构

ls

bin catlet conf lib logs version.txt

配置文件介绍

logs目录:

wrapper.log ---->mycat启动日志

mycat.log ---->mycat详细工作日志

conf目录:

schema.xml 主配置文件(读写分离、高可用、分布式策略定制、节点控制)

server.xml mycat 软件本身相关的配置

rule.xml 分片规则配置文件,记录分片规则列表、使用方法等

log4j2.xml *** ,记录日志有关

*.txt ,分片策略使用的规则

5 启动和连接

配置环境变量

vim /etc/profile

export PATH=/application/mycat/bin:$PATH

source /etc/profile

启动

mycat start

连接mycat:

mysql -uroot -p123456 -h 127.0.0.1 -P8066

mycat基础--高可用+读写分离

用户创建及数据库导入

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

读写分离配置

cd /application/mycat/conf

mv schema.xml schema.xml.bak

vim schema.xml

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

select user()

schema.xml

配置文件简单介绍

mycat 逻辑库定义:

==================================================

数据节点定义:

==================================================

后端主机定义:

select user()

===================================================

说明:

第一个 writehost: 10.0.0.51:3307 真正的写节点,负责写操作

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

测试:

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

6f4a2b17ed0e7076f0bdc991080d7744.png

读:

mysql> select @@server_id;

7dbf7c7e764089beef25bfd653423e77.png

写:

mysql> begin ;select @@server_id; commit;

76b8348d0dc6d4394e1e033662516728.png

配置中的属性介绍

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其他配置

maxCon="1000":最大的并发连接数

minCon="10" :mycat在启动之后,会在后端节点上自动开启的连接线程

tempReadHostAvailable="1"

这个一主一从时(1个writehost,1个readhost时),可以开启这个参数,如果2个writehost,2个readhost时

select user() 监测心跳

Mycat高级应用-分布式解决方案

垂直分表

mv schema.xml schema.xml.ha

vim schema.xml

select user()

select user()

多了几行配置

访问user表分到 sh1数据节点 访问sh2表分到sh2数据节点

访问其他的表默认是sh1数据节点

创建测试库和表

[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 ~]#

范围分片把表查分到不同的分片上

比如说t3表

(1)行数非常多,2000w(1-1000w:sh1 1000w01-2000w:sh2)

(2)访问非常频繁,用户访问较离散

配置文件局部要修改如下

05df165513ead7a9984b41d9c3aef671.png

配置说明

把表t3拆分到sh1和sh2数据节点上,安装auto-sharding-long的策略

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

select user()

select user()

schema.xml

rule.xml 拆分的策略中重要的地方(默认的不用自己配置)

id

rang-long

class="io.mycat.route.function.AutoPartitionByLong">

autopartition-long.txt

autopartition-long.txt 1-10条数据在1号分片,10-20在2号分片

1-10=0

10-20=1

创建测试表:

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

user testdb

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');

查询测试

[root@db01 ~]# mysql -S /data/3308/mysql.sock -e "select * from taobao.t3;"

[root@db01 ~]# mysql -S /data/3307/mysql.sock -e "select * from taobao.t3;"

82a0068d78e7522c713839297404565c.png

取模分片(mod-long)

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

配置在逻辑库下添加以下内容

vim schema.xml

vim rule.xml 修改为2,因为只有2个节点

2

创建测试表

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;"

8953c8203b8b8f71f29d971c29b20315.png

枚举分片 sharding-by-intfile

t5 表结构如下

id name telnum

1 bj 1212

2 sh 22222

3 bj 3333

4 sh 44444

5 bj 5555

北京的落在一个分片,上海的落在一个分片

配置逻辑库

vim schema.xml

配置规则  rule.xml 字段按照name,在函数中加入 1支持字符串和中文

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

name

hash-int

partition-hash-int.txt

1

0

partition-hash-int.txt 配置

bj=0

sh=1

DEFAULT_NODE=1

准备测试环境

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;"

13e152df58b7f918c4fe84116f023184.png

Mycat全局表

a b c d

join

t

select t1.name ,t.x from t1

join t

select t2.name ,t.x from t2

join t

select t3.name ,t.x from t3

join t

使用场景:

如果你的业务中有些数据类似于数据字典,比如配置文件的配置,

常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,

而且大部分的业务场景都会用到,那么这种表适合于Mycat全局表,无须对数据进行切分,

要在所有的分片上保存一份数据即可,Mycat 在Join操作中,业务表与全局表进行Join聚合会优先选择相同分片内的全局表join,

避免跨库Join,在进行数据插入操作时,mycat将把数据分发到全局表对应的所有分片执行,在进行数据读取时候将会随机获取一个节点读取数据。

vim schema.xml

后端数据准备

mysql -S /data/3307/mysql.sock

use taobao

create table t_area (id int not null primary key auto_increment,name varchar(20) not null);

mysql -S /data/3308/mysql.sock

use taobao

create table t_area (id int not null primary key auto_increment,name varchar(20) not null);

重启mycat

mycat restart

测试:

mysql -uroot -p123456 -h10.0.0.52 -P8066

use TESTDB

insert into t_area(id,name) values(1,'a');

insert into t_area(id,name) values(2,'b');

insert into t_area(id,name) values(3,'c');

insert into t_area(id,name) values(4,'d');

E-R分片

A

join

B

为了防止跨分片join,可以使用E-R模式

A join B

on a.xx=b.yy

join C

on A.id=C.id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值