侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

使用MyCAT搭建MySQL分布式架构

zze
zze
2020-05-20 / 0 评论 / 0 点赞 / 649 阅读 / 46723 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

本篇文章使用到的所有软件包都可通过点击此百度云链接下载,提取码:uqp6

环境准备

准备如下主机:

主机名IP
db0110.0.1.203
db0210.0.1.204
mycat10.0.1.200

在 db01 和 db02 主机中分别创建四个 MySQL 实例,分别占用主机端口 3307、3308、3309 和 3310。

架构说明

image.png

说明:

  • db01 的 3307 实例和 db02 的 3307 实例互为主从;
  • db02 的 3308 实例和 db02 的 3308 实例互为主从;
  • db01 和 db02 中的 3309 实例都为本机 3307 实例的从库;
  • db01 和 db02 中的 3310 实例都为本机 3308 实例的从库;

安装并启动

1、在 db01 和 db02 中执行如下操作安装并初始化数据库:

# 创建数据目录和程序目录
mkdir /data/33{07..10}/data /data/app -p 
# 解压 MySQL 程序包到程序目录
tar xf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz -C /data/app/
# 创建软链接
cd /data/app && ln -s mysql-5.7.28-linux-glibc2.12-x86_64/ mysql
# 添加环境变量
echo 'export PATH="$PATH:/data/app/mysql/bin"' > /etc/profile.d/mysql.sh && . /etc/profile.d/mysql.sh
# 移除 mariadb 相关
yum remove mariadb mariadb-* -y
# 安装依赖
yum install -y libaio-devel
# 创建用户并授权数据目录
useradd -M -s /sbin/nologin mysql && chown -R mysql.mysql /data
# 初始化数据
mysqld --initialize-insecure  --user=mysql --datadir=/data/3307/data --basedir=/data/app/mysql
mysqld --initialize-insecure  --user=mysql --datadir=/data/3308/data --basedir=/data/app/mysql
mysqld --initialize-insecure  --user=mysql --datadir=/data/3309/data --basedir=/data/app/mysql
mysqld --initialize-insecure  --user=mysql --datadir=/data/3310/data --basedir=/data/app/mysql

2、准备 db01 的配置文件和启动脚本:

# 配置文件
cat >/data/3307/my.cnf<<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
port=3307
log-error=/data/3307/mysql.log
log_bin=/data/3307/mysql-bin
binlog_format=row
skip-name-resolve
server-id=7
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF

cat >/data/3308/my.cnf<<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
log-error=/data/3308/mysql.log
log_bin=/data/3308/mysql-bin
binlog_format=row
skip-name-resolve
server-id=8
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF

cat >/data/3309/my.cnf<<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3309/data
socket=/data/3309/mysql.sock
port=3309
log-error=/data/3309/mysql.log
log_bin=/data/3309/mysql-bin
binlog_format=row
skip-name-resolve
server-id=9
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF

cat >/data/3310/my.cnf<<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3310/data
socket=/data/3310/mysql.sock
port=3310
log-error=/data/3310/mysql.log
log_bin=/data/3310/mysql-bin
binlog_format=row
skip-name-resolve
server-id=10
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF

# 启动脚本
cat >/etc/systemd/system/mysqld3307.service<<EOF
[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=/data/app/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF

cat >/etc/systemd/system/mysqld3308.service<<EOF
[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=/data/app/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
LimitNOFILE = 5000
EOF

cat >/etc/systemd/system/mysqld3309.service<<EOF
[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=/data/app/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE = 5000
EOF

cat >/etc/systemd/system/mysqld3310.service<<EOF
[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=/data/app/mysql/bin/mysqld --defaults-file=/data/3310/my.cnf
LimitNOFILE = 5000
EOF

3、准备 db02 的配置文件和启动脚本:

# 配置文件
cat >/data/3307/my.cnf<<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
port=3307
log-error=/data/3307/mysql.log
log_bin=/data/3307/mysql-bin
binlog_format=row
skip-name-resolve
server-id=17
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF

cat >/data/3308/my.cnf<<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
log-error=/data/3308/mysql.log
log_bin=/data/3308/mysql-bin
binlog_format=row
skip-name-resolve
server-id=18
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF

cat >/data/3309/my.cnf<<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3309/data
socket=/data/3309/mysql.sock
port=3309
log-error=/data/3309/mysql.log
log_bin=/data/3309/mysql-bin
binlog_format=row
skip-name-resolve
server-id=19
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF

cat >/data/3310/my.cnf<<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3310/data
socket=/data/3310/mysql.sock
port=3310
log-error=/data/3310/mysql.log
log_bin=/data/3310/mysql-bin
binlog_format=row
skip-name-resolve
server-id=20
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF

# 启动脚本
cat >/etc/systemd/system/mysqld3307.service<<EOF
[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=/data/app/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF

cat >/etc/systemd/system/mysqld3308.service<<EOF
[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=/data/app/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
LimitNOFILE = 5000
EOF

cat >/etc/systemd/system/mysqld3309.service<<EOF
[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=/data/app/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE = 5000
EOF

cat >/etc/systemd/system/mysqld3310.service<<EOF
[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=/data/app/mysql/bin/mysqld --defaults-file=/data/3310/my.cnf
LimitNOFILE = 5000
EOF

4、在 db01 和 db02 启动多实例并检查状态:

systemctl start mysqld3307 mysqld3308 mysqld3309 mysqld3310
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'"

主从配置

1、配置 db01 的 3307 实例和 db02 的 3307 实例互为主从:

-- db02 操作
mysql  -S /data/3307/mysql.sock -e "grant replication slave on *.* to repl@'10.0.1.%' identified by '123';"
mysql  -S /data/3307/mysql.sock -e "grant all  on *.* to root@'10.0.1.%' identified by '123'  with grant option;"

-- db01 操作
mysql  -S /data/3307/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.1.204', 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.1.203', 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"

2、配置 db01 中的 3309 实例为本机 3307 实例的从库:

-- db01 操作
mysql  -S /data/3309/mysql.sock  -e "CHANGE MASTER TO MASTER_HOST='10.0.1.203', 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"

3、配置 db02 中的 3309 实例为本机 3307 实例的从库:

-- db02 操作
mysql  -S /data/3309/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.1.204', 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"

4、配置 db01 的 3308 实例和 db02 的 3308 实例互为主从:

-- db01 操作
mysql  -S /data/3308/mysql.sock -e "grant replication slave on *.* to repl@'10.0.1.%' identified by '123';"
mysql  -S /data/3308/mysql.sock -e "grant all  on *.* to root@'10.0.1.%' identified by '123'  with grant option;"

-- db02 操作
mysql  -S /data/3308/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.1.203', 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.1.204', 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"

5、配置 db01 中的 3310 实例为本机 3308 实例的从库:

-- db01 操作
mysql  -S /data/3310/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.1.203', 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"

6、配置 db02 中的 3310 实例为本机 3308 实例的从库:

mysql  -S /data/3310/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.1.204', 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"

7、检测主从状态:

-- db01 和 db02 操作
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

如果中间步骤除了差错,可执行下面命令还原,然后重新开始主从配置:

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

MyCAT 使用

安装

下述操作都是在 mycat 主机中进行。

1、安装 jdk:

$ yum localinstall jdk-8u221-linux-x64.rpm -y

2、安装 mycat:

# 解压
$ tar xf Mycat-server-1.6.7.4-release-20200105164103-linux\ .tar.gz -C /usr/local/
# 配置环境变量
$ echo 'export PATH=/usr/local/mycat/bin:$PATH' > /etc/profile.d/mycat.sh && . /etc/profile.d/mycat.sh

3、启动:

$ mycat start
Starting Mycat-server...

4、连接 mycat(mycat 主机需要有 mysql 二进制程序):

$ mysql -uroot -p123456 -h 127.0.0.1 -P8066
...
Server version: 5.6.29-mycat-1.6.7.4-release-20200105164103 MyCat Server (OpenCloudDB)
...
mysql> 

程序文件介绍

下面对 mycat 安装目录下几个主要的文件进行一下说明:

bin:程序目录
conf:配置文件目录
	schema.xml:主配置文件:节点信息、读写分离、高可用设置、调用分片策略等;
	rule.xml:分片策略的定义、功能、使用用方法;
	server.xml:mycat 服务有关配置,用户、网络、权限、策略、资源等;
	xx.txt:分片参数定义文件;
	log4j2.xml:Mycat 相关日志记录配置;
logs:日志目录
	wrapper.log:启动日志;
	mycat.log:工作日志;

读写分离

1、修改配置:

# 备份原有配置文件
$ cd /usr/local/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/">
    <!-- 
        逻辑库配置:
            name:配置一个名为 TESTDB 的逻辑库 
            dataNode:访问逻辑库时实际访问的是 dn1 分片节点
    -->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
    <!-- 
        分片节点定义:
            name:节点名称;
            dataHost:数据主机名;
            database:数据库名;
    -->
    <dataNode name="dn1" dataHost="localhost1" database="world" />
    <!--
    数据主机定义:
        name:主机名称;
        balance:读操作负载均衡类型,目前的取值有 3 种: 
            balance="0",不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。;
            balance="1",全部的 readHost 与 standby writeHost 参与 select 语句的负载均衡;
            balance="2",所有读操作都随机的在 writeHost、readhost 上分发;
        writeType:写操作,负载均衡类型,目前的取值有 2 种: 
            writeType="0",所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后以切换后的为主,切换记录在配置文件中:dnindex.properties;
            writeType="1",所有写操作都随机的发送到配置的 writeHost,但不推荐使用;
        switchType:
            -1:表示不自动切换;
            1:默认值,自动切换;
            2:基于 MySQL 主从同步的状态决定是否切换 ,心跳语句为 show slave status;
        maxCon="1000":最大的并发连接数,可在主节点通过 show processlist 看到;
        minCon="10":mycat 在启动之后,会在后端节点上自动开启的连接线程数;
        tempReadHostAvailable="1":在一主一从时(1 个 writehost,1 个 readhost 时),可以开启这个参数,作用是当 writehost 挂掉时让 readhost 依旧可用提供读操作;
    -->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
        <!-- 心跳检测语句 -->
        <heartbeat>select user()</heartbeat>
        <!-- 写节点 -->
        <writeHost host="db1" url="10.0.1.203:3307" user="root" password="123">
            <!-- 读节点 -->
            <readHost host="db2" url="10.0.1.203:3309" user="root" password="123" />
        </writeHost>
    </dataHost>
</mycat:schema>
<!-- 该配置文件整体的作用就是:当通过 MyCAT 访问 TESTDB 库时,实际上是访问 10.0.1.203 (db01) 主机的 3307 和 3309 实例的 world 库,并且 3307 和 3309 实例是读写分离的 -->

2、重启 mycat 服务:

$ mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

3、测试环境准备:

# 在 db01 主机的 3307 和 3309 实例导入 world 
$ mysql -S /data/3307/mysql.sock < world.sql
# 仅在 3307 实例导入即可,因为 3309 是 3307 实例的从库,会跟着同步

4、测试:

# 在 mycat 主机登入 mycat 进行测试
$ mysql -uroot -p123456 -h 127.0.0.1 -P8066
...
# 测试读,查询的是 3309 实例
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|           9 |
+-------------+
1 row in set (0.10 sec)
# 测试写,查询的是 3307 实例
mysql> begin; select @@server_id; commit;
Query OK, 0 rows affected (0.00 sec)

+-------------+
| @@server_id |
+-------------+
|           7 |
+-------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

高可用

1、修改配置:

# 备份原有配置文件
$ cd /usr/local/mycat/conf/ && mv schema.xml schema.xml.rw
# 编写配置文件内容如下
$ 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"></schema>
    <!-- 分片节点配置 -->
    <dataNode name="sh1" dataHost="dh1" database="world" />
    <!-- 数据主机配置 -->
    <dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
        <heartbeat>select user()</heartbeat>
        <!-- 写主机 -->
        <writeHost host="db1" url="10.0.1.203:3307" user="root" password="123">
            <!-- 读主机 -->
            <readHost host="db2" url="10.0.1.203:3309" user="root" password="123" />
        </writeHost>
        <!-- 写主机 -->
        <writeHost host="db3" url="10.0.1.204:3307" user="root" password="123">
            <!-- 读主机 -->
            <readHost host="db4" url="10.0.1.204:3309" user="root" password="123" />
        </writeHost>
        <!-- 
            db1 和 db3 是双主关系
            db1 和 db2 是主从关系
            db3 和 db3 是主从关系
        -->
    </dataHost>
</mycat:schema>
<!-- 
    在此配置下,db1 为主库,db3 则为备用主库
    当 db1 挂掉时 db3 会成为主库
    db3 作为备用主库时只提供读操作
    即正常情况下仅有 db1 支持写操作
    当 db1 挂掉时,db1 和 db2 会被同时踢出集群
    当 db1 恢复时,db1 和 db2 又会被重新加入集群,但是此时 db1 会成为从库
-->

2、重启 mycat 服务:

$ mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

3、测试环境准备:

# 在 db01 主机的 3308 和 3310 实例导入 world 
$ mysql -S /data/3308/mysql.sock < world.sql
# 仅在 3308 实例导入即可,因为 3310 是 3308 实例的从库,会跟着同步
# 完成该导入后此时 db01 和 db02 主机的所有实例中应该都有了 world 库,
# 因为 db01 的 3307、3308 实例和 db02 的 3307、3308 分别互为主从

4、测试:

# 在 mycat 主机登入 mycat 进行测试
$ mysql -uroot -p123456 -h 127.0.0.1 -P8066
...
# 测试读,查询的是 db02 主机的 3307 实例,如上所述,正常情况下备用主库也支持读操作
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          17 |
+-------------+
1 row in set (0.00 sec)
# 测试读,查询的是 db02 主机的 3309 实例
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          19 |
+-------------+
1 row in set (0.00 sec)
# 测试读,查询的是 db01 主机的 3309 实例
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|           9 |
+-------------+
1 row in set (0.00 sec)
# 测试写,查询的是 db01 主机的 3307 实例,即主库
mysql> begin; select @@server_id; commit;
Query OK, 0 rows affected (0.01 sec)

+-------------+
| @@server_id |
+-------------+
|           7 |
+-------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
# 关闭主库,即关闭 db01 主机的 3307 实例,systemctl stop mysqld3307
# 测试读,会发现一直查询 db02 主机的 3309 实例
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          19 |
+-------------+
1 row in set (0.00 sec)
# 测试写,会发现一直查询 db02 主机的 3307 实例
mysql> begin; select @@server_id; commit;
Query OK, 0 rows affected (0.00 sec)

+-------------+
| @@server_id |
+-------------+
|          17 |
+-------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)
# 即 db01 主机的 3307、3309 实例和 db02 主机的 3307、3309 实例构成了高可用主从 

垂直分表

1、修改配置:

# 备份原有配置文件
$ cd /usr/local/mycat/conf/ && mv 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="dn1">
        <!-- 逻辑表配置 -->
        <table name="user" dataNode="dn1" />
        <table name="order_t" dataNode="dn2" />
    </schema>
    <dataNode name="dn1" dataHost="dh1" database="taobao" />
    <dataNode name="dn2" dataHost="dh2" database="taobao" />
    <dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
        <heartbeat>select user()</heartbeat>
        <writeHost host="db1" url="10.0.1.203:3307" user="root" password="123">
            <readHost host="db2" url="10.0.1.203:3309" user="root" password="123" />
        </writeHost>
        <writeHost host="db3" url="10.0.1.204:3307" user="root" password="123">
            <readHost host="db4" url="10.0.1.204:3309" user="root" password="123" />
        </writeHost>
    </dataHost>

    <dataHost name="dh2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
        <heartbeat>select user()</heartbeat>
        <writeHost host="db1" url="10.0.1.203:3308" user="root" password="123">
            <readHost host="db2" url="10.0.1.203:3310" user="root" password="123" />
        </writeHost>
        <writeHost host="db3" url="10.0.1.204:3308" user="root" password="123">
            <readHost host="db4" url="10.0.1.204:3310" user="root" password="123" />
        </writeHost>
    </dataHost>
</mycat:schema>
<!-- 
    该配置的作用就是:
        登入 mycat 后
        查询 TESTDB 库中的 user 表时,会被 mycat 调度到 dh1 数据主机的四个节点中的 taobao 库
        查询 TESTDB 库中的 order 表时,会被 mycat 调度到 dh2 数据主机的四个节点中的 taobao 库
        即将 user 表和 order_t 表保存到了不同的数据库实例中
-->

2、在 db01 主机创建测试库和测试表:

$ mysql -S /data/3307/mysql.sock -e "create database taobao charset utf8;"
$ mysql -S /data/3308/mysql.sock -e "create database taobao charset utf8;"
$ mysql -S /data/3307/mysql.sock -e "use taobao;create table user(id int,name varchar(20))";
$ mysql -S /data/3308/mysql.sock -e "use taobao;create table order_t(id int,name varchar(20))"

3、重启 mycat:

$ mycat restart 
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

4、测试:

# 在 mycat 主机登入 mycat 进行测试
$ mysql -uroot -p123456 -h 127.0.0.1 -P8066
...
mysql> use TESTDB;
Database changed
# 逻辑使用是 TESTDB 库同时存在两张表
mysql> show tables;
+------------------+
| Tables_in_taobao |
+------------------+
| order_t          |
| user             |
+------------------+
2 rows in set (0.00 sec)
# 测试往 user 表插入数据
mysql> insert into user values(1,'a');
mysql> insert into user values(2,'b');
mysql> insert into user values(3,'c');
mysql> commit;
# 测试网 order_t 表插入数据
mysql> insert into order_t values(1,'x'),(2,'y');
mysql> commit;

5、在 db01 主机进行检查:

# 可以看到,3307 实例中仅有一张 user 表
$ mysql -S /data/3307/mysql.sock -e "show tables from taobao"
+------------------+
| Tables_in_taobao |
+------------------+
| user             |
+------------------+
# 数据正常
$ mysql -S /data/3307/mysql.sock -e "select * from taobao.user"
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
+------+------+
# 可以看到,3308 实例中仅有一张 order_t 表
$ mysql -S /data/3308/mysql.sock -e "show tables from taobao"
+------------------+
| Tables_in_taobao |
+------------------+
| order_t          |
+------------------+
# 数据正常
$ mysql -S /data/3308/mysql.sock -e "select * from taobao.order_t"
+------+------+
| id   | name |
+------+------+
|    1 | x    |
|    2 | y    |
+------+------+

水平分表

概念

分片策略:mycat 几乎融合了经典业务中大部分的分片策略,并且已经提供了可用的调用接口,常用策略主要有范围分片、取模、枚举、日期、HASH 等。

分片键:作为分片条件的列。

范围分片

1、修改配置文件:

# 备份原有配置文件
$ cd /usr/local/mycat/conf/ && cp schema.xml{,.l}
# 在 schema 节下添加如下配置
$ vim schema.xml
<!-- auto-sharding-long 是分片策略名,对应在配置目录下的 rule.xml 中 -->
<table name="t3" dataNode="dn1,dn2" rule="auto-sharding-long" />

2、定义和使用分片策略:

# 检查 rule.xml 文件是否有上面指定的分片策略
$ cd /usr/local/mycat/conf/ && vim rule.xml
...
<!-- name:分片策略名 -->
<tableRule name="auto-sharding-long">
    <rule>
        <!-- 分片键 -->
        <columns>id</columns>
        <!-- 分片函数,对应下面的 function 节的定义 -->
        <algorithm>rang-long</algorithm>
    </rule>
</tableRule>
...
<!-- 
    name:分片函数名
    class:类文件
-->
<function name="rang-long"
            class="io.mycat.route.function.AutoPartitionByLong">
    <!-- 属性文件,这里使用的是相对路径,该文件就在 mycat 的 conf 目录下,该文件可用来定义分片的范围 -->
    <property name="mapFile">autopartition-long.txt</property>
</function>

3、修改分片范围:

$ cd /usr/local/mycat/conf/ && vim autopartition-long.txt 
# 定义格式:<start>-<end>=<node_index>
# 	start:起始 id
# 	end:结束 id
# 	node_index:节点索引,0 为第一个 dataNode,1 为第二个 dataNode,在此示例中 0 和 1 分别对应于 dn1、dn2
# 可用 K 和 M 进行数值转换,1K=1000,1M=10000
0-10=0 	# 0 < id <= 10,放在 dn1
10-20=1	# 10 < id <= 20,放在 dn2

4、在 db01 中创建测试表:

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

5、重启 mycat 服务:

$ mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

6、登入 mycat 测试:

$ mysql -uroot -p123456 -h 127.0.0.1 -P 8066
...
# 测试添加数据
mysql> use TESTDB;
Database changed

mysql> insert into t3(id,name) values(1,'a'),(2,'b'),(3,'c'),(4,'d'),(11,'aa'),(12,'bb'),(13,'cc'),(14,'dd');
# 查询数据
mysql> select * from t3;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
| 11 | aa   |
| 12 | bb   |
| 13 | cc   |
| 14 | dd   |
+----+------+
8 rows in set (0.05 sec)

7、在 db01 主机中检查表数据:

# 检查 3307 实例的 t3 表数据
$ mysql -S /data/3307/mysql.sock  -e "select * from taobao.t3"
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
+----+------+
# 检查 3308 实例的 t3 表数据
$ mysql -S /data/3308/mysql.sock  -e "select * from taobao.t3"
+----+------+
| id | name |
+----+------+
| 11 | aa   |
| 12 | bb   |
| 13 | cc   |
| 14 | dd   |
+----+------+
# 可以看到,数据的确如我们所定义的范围存放在了不同节点

取模分片

1、修改配置文件:

# 在 schema 节下添加如下配置
$ cd /usr/local/mycat/conf/ && vim schema.xml
<!-- mod-long 是分片策略名,对应在配置目录下的 rule.xml 中 -->
<table name="t4" dataNode="dn1,dn2" rule="mod-long" />

2、定义和使用分片策略:

# 检查 rule.xml 文件是否有上面指定的分片策略
$ cd /usr/local/mycat/conf/ && vim rule.xml
...
<tableRule name="mod-long">
    <rule>
        <columns>id</columns>
        <algorithm>mod-long</algorithm>
    </rule>
</tableRule>
...
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
    <!-- 用户分片键与这里指定的值取模,这个值一般是 dataNode 的个数,其结果为 0 时对应数据落在第一个 dataNode,为 1 时对应数据落在第二个 dataNode,以此类推。。。 -->
    <property name="count">2</property>
</function>

3、在 db01 主机执行下面命令准备测试环境:

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

4、重启 mycat 服务:

$ mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

5、登入 mycat 测试:

$ mysql -uroot -p123456 -h 127.0.0.1 -P8066
...
mysql> use TESTDB;
Database changed
# 添加测试数据
mysql> insert into t4(id,name) values(1,'a'),(2,'b'),(3,'c'),(4,'d'),(6,'x'),(8,'y'),(10,'z');
# 检查数据
mysql> select * from t4;
+----+------+
| id | name |
+----+------+
|  2 | b    |
|  4 | d    |
|  6 | x    |
|  8 | y    |
| 10 | z    |
|  1 | a    |
|  3 | c    |
+----+------+
7 rows in set (0.00 sec)

7、在 db01 主机中检查表数据:

# id%2=0 的行落在了 3307 实例
$ mysql -S /data/3307/mysql.sock  -e "select * from taobao.t4"
+----+------+
| id | name |
+----+------+
|  2 | b    |
|  4 | d    |
|  6 | x    |
|  8 | y    |
| 10 | z    |
+----+------+

# id%2=1 的行落在了 3308 实例
$ mysql -S /data/3308/mysql.sock  -e "select * from taobao.t4"
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  3 | c    |
+----+------+

枚举分片

1、修改配置文件:

# 在 schema 节下添加如下配置
$ cd /usr/local/mycat/conf/ && vim schema.xml
<!-- sharding-by-intfile 是分片策略名,对应在配置目录下的 rule.xml 中 -->
<table name="t5" dataNode="dn1,dn2" rule="sharding-by-intfile" />

2、定义和使用分片策略:

# 检查 rule.xml 文件是否有上面指定的分片策略
$ cd /usr/local/mycat/conf/ && vim rule.xml
...
<tableRule name="sharding-by-intfile">
    <rule>
        <!-- 修改分片键为 gender -->
        <columns>gender</columns>
        <algorithm>hash-int</algorithm>
    </rule>
</tableRule>
...
<!-- 对应枚举分片的函数 -->
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
    <!-- 枚举分片的规则定义文件为 mycat 的 conf 目录下的 partition-hash-int.txt -->
    <property name="mapFile">partition-hash-int.txt</property>
    <!-- 默认情况下分片键只能是数字类型,如果分片键是字符类型,则需要设定 type=1 -->
    <property name="type">1</property>
</function>

3、定义枚举分片规则:

$ cd /usr/local/mycat/conf/ && vim partition-hash-int.txt
# 格式:<分片键值>=<node_index>
F=0	# gender 为 F 的行落在第一个分片
M=1 # gender 为 M 的行落在第二个分片
DEFAULT_NODE=1 # 其它情况默认落在第二个分片

4、在 db01 主机执行下面命令创建测试表:

$ 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,gender char(1));"
$ 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,gender char(1));"

5、重启 mycat 服务:

$ mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

6、登入 mycat 测试:

$ mysql -uroot -p123456 -h127.0.0.1 -P8066
...
mysql> use TESTDB;
# 添加测试数据
mysql> insert into t5(id,name,gender) values(1,'bj','M'),(2,'sh','F'),(3,'bj','F'),(4,'sh','M'),(5,'tj','X');
# 检查数据
mysql> select * from t5;
+----+------+--------+
| id | name | gender |
+----+------+--------+
|  1 | bj   | M      |
|  2 | sh   | F      |
|  3 | bj   | F      |
|  4 | sh   | M      |
|  5 | tj   | X      |
+----+------+--------+
5 rows in set (0.06 sec)

7、在 db01 主机中检查表数据:

$ mysql -S /data/3307/mysql.sock  -e "select * from taobao.t5"
+----+------+--------+
| id | name | gender |
+----+------+--------+
|  2 | sh   | F      |
|  3 | bj   | F      |
+----+------+--------+

$ mysql -S /data/3308/mysql.sock  -e "select * from taobao.t5"
+----+------+--------+
| id | name | gender |
+----+------+--------+
|  1 | bj   | M      |
|  4 | sh   | M      |
|  5 | tj   | X      |
+----+------+--------+
# 可以看到,如我们所定义的,gender 为 F 的落在第一个分片,为 M 或其它的落在第二个分片

全局表

应用场景

如果你的业务中有些数据类似于数据字典,比如配置文件的配置,常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,而且大部分的业务场景都会用到,那么这种表适合于 mycat 全局表,无须对数据进行切分,要在所有的分片上保存一份数据即可,mycat 在 join 操作中,业务表与全局表进行 join 聚合会优先选择相同分片内的全局表 join,避免跨库 join,在进行数据插入操作时,mycat 将把数据分发到全局表对应的所有分片执行,在进行数据读取时候将会随机获取一个节点读取数据。

配置使用

1、修改配置文件:

# 在 schema 节下添加如下配置
$ cd /usr/local/mycat/conf/ && vim schema.xml
<!-- type="global" 标识 t_area 是个全局表,并且在插入时会同时落在两个分片中 -->
<table name="t_area" primaryKey="id"  type="global" dataNode="dn1,dn2" /> 

2、在 db01 主机执行下面命令创建测试表:

$ mysql -S /data/3307/mysql.sock -e "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 -e "use taobao;create table t_area (id int not null primary key auto_increment,name varchar(20) not null);"

3、重启 mycat 服务:

$ mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

4、登入 mycat 录入数据:

$ mysql -uroot -p123456 -h127.0.0.1 -P8066
...
mysql> use TESTDB;
# 添加测试数据
mysql> insert into t_area(id,name) values(1,'a'),(2,'b'),(3,'c'),(4,'d');
Query OK, 4 rows affected (0.08 sec)
Records: 4  Duplicates: 0  Warnings: 0
# 检查数据
mysql> select * from t_area;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
+----+------+
4 rows in set (0.05 sec)

5、在 db01 主机检查数据:

$ mysql -S /data/3308/mysql.sock  -e "select * from taobao.t_area"
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
+----+------+

$ mysql -S /data/3307/mysql.sock  -e "select * from taobao.t_area"
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
+----+------+
# 可以看到在两个分片中都有相同的数据

E-R 分片

应用场景

当多个表之间存在紧密的关联关系,常用来做联表查询时,此时可以使用 E-R 分片。

E-R 分片的作用就是让有关联关系的表数据处于同一个分片中,以避免跨分片联表的低效操作。

配置使用

1、以基于取模做 E-R 分片为例,修改配置文件如下:

# 在 schema 节下添加如下配置
$ cd /usr/local/mycat/conf/ && vim schema.xml
<!-- name="a" 定义了主表的名称,使用规则 mod-long_a_b -->
<table name="a" dataNode="dn1,dn2" rule="mod-long_a_b">
  	<!-- name="b" 定义了子表的名称,joinKey 为子表到主表的关联键,parentKey 为主表到字表的关联键 -->
    <childTable name="b" joinKey="aid" parentKey="id" /> 
</table> 

2、定义和使用分片策略:

$ cd /usr/local/mycat/conf/ && vim rule.xml
...
<!-- 自定义规则 -->
<tableRule name="mod-long_a_b">
    <rule>
        <!-- 分片键为主表的 id -->
        <columns>id</columns>
        <algorithm>mod-long_a_b</algorithm>
    </rule>
</tableRule>
...
<!-- 自定义函数 -->
<function name="mod-long_a_b" class="io.mycat.route.function.PartitionByMod">
    <property name="count">2</property>
</function>

3、在 db01 主机执行下面命令创建测试表:

$ mysql -S /data/3307/mysql.sock -e "use taobao;create table a (id int not null primary key auto_increment,name varchar(20) not null);"
$ mysql -S /data/3307/mysql.sock -e "use taobao;create table b (id int not null primary key auto_increment,addr varchar(20) not null ,aid int );"

$ mysql -S /data/3308/mysql.sock -e "use taobao;create table a (id int not null primary key auto_increment,name varchar(20) not null);"
$ mysql -S /data/3308/mysql.sock -e "use taobao;create table b (id int not null primary key auto_increment,addr varchar(20) not null ,aid int );"

4、重启 mycat 服务:

$ mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

5、登入 mycat 添加测试数据:

$ mysql -uroot -p123456 -h127.0.0.1 -P8066
...
mysql> use TESTDB;
Database changed
# 录入 a 表数据
mysql> insert into a(id,name) values(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e');
# 录入 b 表数据
mysql> insert into b(id,addr,aid) values(1001,'bj',1);
mysql> insert into b(id,addr,aid) values(1002,'sj',3);
mysql> insert into b(id,addr,aid) values(1003,'sd',4);
mysql> insert into b(id,addr,aid) values(1004,'we',2);
mysql> insert into b(id,addr,aid) values(1005,'er',5);
# 检查数据
mysql> select * from a;
+----+------+
| id | name |
+----+------+
|  2 | b    |
|  4 | d    |
|  1 | a    |
|  3 | c    |
|  5 | e    |
+----+------+
5 rows in set (0.00 sec)

mysql> select * from b;
+------+------+------+
| id   | addr | aid  |
+------+------+------+
| 1003 | sd   |    4 |
| 1004 | we   |    2 |
| 1001 | bj   |    1 |
| 1002 | sj   |    3 |
| 1005 | er   |    5 |
+------+------+------+
5 rows in set (0.00 sec)

6、在 db01 主机中检查数据:

$ mysql -S /data/3307/mysql.sock  -e "select * from taobao.a"
+----+------+
| id | name |
+----+------+
|  2 | b    |
|  4 | d    |
+----+------+

$ mysql -S /data/3307/mysql.sock  -e "select * from taobao.b"
+------+------+------+
| id   | addr | aid  |
+------+------+------+
| 1003 | sd   |    4 |
| 1004 | we   |    2 |
+------+------+------+

$ mysql -S /data/3308/mysql.sock  -e "select * from taobao.a"
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  3 | c    |
|  5 | e    |
+----+------+

$ mysql -S /data/3308/mysql.sock  -e "select * from taobao.b"
+------+------+------+
| id   | addr | aid  |
+------+------+------+
| 1001 | bj   |    1 |
| 1002 | sj   |    3 |
| 1005 | er   |    5 |
+------+------+------+
# 可以看到,a、b 表中有关联关系的行在同一个分片

管理类操作

在线管理

mycat 默认提供的管理端口为 9066,对 mycat 在线进行管理类操作可使用 mysql 客户端登入操作,如下:

$ mysql -uroot -p123456 -h127.0.0.1 -P9066
...
# 查看帮助
mysql> show @@help;
+--------------------------------------------------------------+--------------------------------------------+
| STATEMENT                                                    | DESCRIPTION                                |
+--------------------------------------------------------------+--------------------------------------------+
| show @@time.current                                          | Report current timestamp                   |
| show @@time.startup                                          | Report startup timestamp                   |
| show @@version                                               | Report Mycat Server version                |
| show @@server                                                | Report server status                       |
...
# 查看 mycat 服务状态
mysql> show @@server ;
+--------------+-------------+--------------+------------+---------------+---------------+---------+--------+
| UPTIME       | USED_MEMORY | TOTAL_MEMORY | MAX_MEMORY | RELOAD_TIME   | ROLLBACK_TIME | CHARSET | STATUS |
+--------------+-------------+--------------+------------+---------------+---------------+---------+--------+
| 10m 7s 741ms |   194876192 |   1037959168 | 4151836672 | 1589983139708 |            -1 | utf8    | ON     |
+--------------+-------------+--------------+------------+---------------+---------------+---------+--------+
1 row in set (0.00 sec)
# 查看分片信息
mysql> show @@datanode;
+------+------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST    | INDEX | TYPE  | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1  | dh1/taobao |     1 | mysql |      0 |    8 | 1000 |      82 |          0 |        0 |       0 |            -1 |
| dn2  | dh2/taobao |     0 | mysql |      0 |    8 | 1000 |      83 |          0 |        0 |       0 |            -1 |
+------+------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
2 rows in set (0.00 sec)
# 查看数据源
mysql> show @@datasource;
+----------+------+-------+------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE  | HOST       | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+------+-------+------------+------+------+--------+------+------+---------+-----------+------------+
| dn1      | db1  | mysql | 10.0.1.203 | 3307 | W    |      0 |    1 | 1000 |      70 |         2 |          0 |
| dn1      | db3  | mysql | 10.0.1.204 | 3307 | W    |      0 |    8 | 1000 |      87 |         0 |          7 |
| dn1      | db2  | mysql | 10.0.1.203 | 3309 | R    |      0 |    7 | 1000 |      77 |         3 |          0 |
| dn1      | db4  | mysql | 10.0.1.204 | 3309 | R    |      0 |    7 | 1000 |      74 |         0 |          0 |
| dn2      | db1  | mysql | 10.0.1.203 | 3308 | W    |      0 |    8 | 1000 |      88 |         0 |          8 |
| dn2      | db3  | mysql | 10.0.1.204 | 3308 | W    |      0 |    1 | 1000 |      68 |         0 |          0 |
| dn2      | db2  | mysql | 10.0.1.203 | 3310 | R    |      0 |    7 | 1000 |      76 |         2 |          0 |
| dn2      | db4  | mysql | 10.0.1.204 | 3310 | R    |      0 |    7 | 1000 |      76 |         2 |          0 |
+----------+------+-------+------------+------+------+--------+------+------+---------+-----------+------------+
8 rows in set (0.01 sec)
# 重载 schema.xml 配置
mysql> reload @@config;
Query OK, 1 row affected (0.09 sec)
Reload config success
# 重载所有配置
mysql> reload @@config_all;

逻辑库管理

mycat 默认提供的逻辑库库名为 TESTDB,我们可以通过修改配置文件来修改它,以修改逻辑库 TESTDB 的库名为 为 zzedb1 为例,需要进行如下操作。

1、修改 schema.xml 文件中的 schema 节的 name 属性为 zzedb1,如下:

$ vim schema.xml
<schema name="zzedb1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">

2、修改 server.xml 文件中的 user 节配置:

$ vim server.xml
<user name="root" defaultAccount="true">
    <property name="password">123456</property>
    <!-- 如果有多个逻辑库,使用 , 隔开即可 -->
    <property name="schemas">zzedb1</property>
    <property name="defaultSchema">zzedb1</property>
    <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->

    <!-- 表级 DML 权限设置 -->
    <!--        
    <privileges check="false">
        <schema name="TESTDB" dml="0110" >
            <table name="tb01" dml="0000"></table>
            <table name="tb02" dml="1111"></table>
        </schema>
    </privileges>       
     -->
</user>

<user name="user">
    <property name="password">user</property>
    <property name="schemas">zzedb1</property>
    <property name="readOnly">true</property>
    <property name="defaultSchema">zzedb1</property>
</user>

3、登入 mycat 管理服务使用 reload @@config_all;, 重载所有配置文件即可。

如果要添加逻辑库,在 schema.xml 中添加对应的 schema 节,然后在 server.xml 中的 user 节下的 schemas 属性添加上对应的逻辑库名即可。

0

评论区