数据库中间件Mycat入门介绍

MyCat简介

何为MyCat?

MyCat是一个彻底开源的、面向企业应用开发的大数据库集群,是支持事务、ACID、可以替代MySQL的加强版数据库,是一个新颖的数据库中间件产品。随着互联网的高速发展,使得每一个线上的互联网应用都需要考虑高并发的问题,MyCat正是为了缓解数据库读写压力而生的,通过它能够实现数据库数据的大量存储,并提高读写效率。

MyCat能够实现主从复制、读写分离,那么不借助MyCat能够实现这些效果吗?

可以想象一下,假设是一个最简单的应用场景,有两个数据库,一个读、一个写,那么对于Java程序来说,它就需要有两份数据源的配置文件,还要在代码中判断哪些时候是读的操作,哪些时候是写的操作,并将这些操作分别在数据库中执行。这样会导致一个很严重的问题,就是Java程序和数据库之间的高度耦合,使得数据库修改之后,Java程序需要修改大量的配置和代码。为此,可以在Java程序和数据库中间添加一层MyCat,将配置都交给MyCat,这样不仅实现了功能,也使程序与数据库之间的耦合度大大降低。

数据库分布式

在学习MyCat之前,还需要了解一下这些概念:

  • 垂直分表
  • 垂直分库
  • 水平分库
  • 水平分表

以某电商平台举例,我们知道, 对于电商平台,平台上的数据量非常多,一天的访问量也非常大,很显然若是将所有数据放在一个数据库或一张表中会严重影响平台的运行效率,降低用户体验,为此,可以采用分库分表的方式将单个数据库和单张数据表的数据压缩,从而提高平台运行效率。

垂直分表

定义:将一个表按照字段分成多表,每个表存储其中一部分字段

在这里插入图片描述

通常我们浏览商品时,看到的都仅仅是商品的部分信息,对商品的详细介绍、评价、参数等等都需要点进去后才能看到,这里采用的便是垂直分表的操作,将用户第一眼比较关心的信息:品牌、价格、图片等先显示出来,为此可以设计两张数据表,一张数据表存放的是前台信息,另一张数据表存放的是评价、手机参数等的后台信息,这样便缩小了两张表的数据量,提高了访问效率。

垂直分库

定义:按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,其核心理念是专库专用

垂直分表虽然提高了访问效率,但毕竟还是单一数据库,它只解决了单张表数据量过大的问题,但这些表仍然存放在单一的数据库和服务器上,为了进一步提高效率,可以将每张表按照业务类型进行分类,比如建立商品库存放商品表,店铺库存放店铺表,并将这两个库分别部署到两台不同的服务器中。

水平分库

定义:把同一个表的数据按一定规则分解到不同的数据库中,每个库可以放在不同的服务器上

垂直分库虽然能够解决单一数据库访问效率低的问题,但当数据量非常庞大,以至于分库也无法解决性能的时候,就需要进行水平分库,即在垂直分库的基础上,将数据库分为两个同样的数据库,其中数据表id为奇数的放在一个数据库中,id为偶数的放在另一个数据库中。

水平分表

定义:在同一个数据库内,把同一个表的数据按一定规则分解到多个表中

水平分表的思想与水平分库类似,只不过水平分表操作的是数据表,同样按照奇数偶数或者其它方式将单张表中的数据分解到多个表中,以提高访问效率。

MyCat的安装

下载mycat-server.tar.gz文件,将其上传至linux的/opt目录下并解压,再将解压后的目录在/usr/local下复制一份:

cp -r mycat/ /usr/local/

在mycat的conf目录下存放了许多的配置文件:

[root@centos-7 mycat]# cd conf/
[root@centos-7 conf]# ls -l
总用量 104
-rwxr-xr-x. 1 root root   92 9月  16 02:16 autopartition-long.txt
-rwxr-xr-x. 1 root root   51 9月  16 02:16 auto-sharding-long.txt
-rwxr-xr-x. 1 root root   67 9月  16 02:16 auto-sharding-rang-mod.txt
-rwxr-xr-x. 1 root root  340 9月  16 02:16 cacheservice.properties
-rwxr-xr-x. 1 root root 3338 9月  16 02:16 dbseq.sql
-rwxr-xr-x. 1 root root  446 9月  16 02:16 ehcache.xml
-rwxr-xr-x. 1 root root 2454 9月  16 02:16 index_to_charset.properties
-rwxr-xr-x. 1 root root 1285 9月  16 02:16 log4j2.xml
-rwxr-xr-x. 1 root root  183 9月  16 02:16 migrateTables.properties
-rwxr-xr-x. 1 root root  271 9月  16 02:16 myid.properties
-rwxr-xr-x. 1 root root   16 9月  16 02:16 partition-hash-int.txt
-rwxr-xr-x. 1 root root  108 9月  16 02:16 partition-range-mod.txt
-rwxr-xr-x. 1 root root 4808 9月  16 02:16 rule.xml
-rwxr-xr-x. 1 root root 4296 9月  16 02:16 schema.xml
-rwxr-xr-x. 1 root root  440 9月  16 02:16 sequence_conf.properties
-rwxr-xr-x. 1 root root   79 9月  16 02:16 sequence_db_conf.properties
-rwxr-xr-x. 1 root root   29 9月  16 02:16 sequence_distributed_conf.properties
-rwxr-xr-x. 1 root root   53 9月  16 02:16 sequence_time_conf.properties
-rwxr-xr-x. 1 root root 5300 9月  16 02:16 server.xml
-rwxr-xr-x. 1 root root   18 9月  16 02:16 sharding-by-enum.txt
-rwxr-xr-x. 1 root root 4299 9月  16 02:16 wrapper.conf
drwxr-xr-x. 2 root root 4096 9月  16 02:16 zkconf
drwxr-xr-x. 2 root root   36 9月  16 02:16 zkdownload

其中有三个特别重要:

  • schema.xml:定义逻辑库、表、分片节点等内容
  • rule.xml:定义分片规则
  • server.xml:定义用户以及系统相关变量,如端口等

MyCat的启动

在启动MyCat之前,需要修改几个配置文件,首先是server.xml(将name值修改为mycat):

在这里插入图片描述

这里的name值可以是任意的,后面登录MyCat的时候会使用到这里配置的name。

然后修改schema.xml(将schema标签下的所有测试库删除):

在这里插入图片描述

最后结果如下:

<?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">
        </schema>
        <dataNode name="dn1" dataHost="host1" database="testdb" />
        <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="127.0.0.1:3306" user="root"
                                   password="123456">
                        <!-- can have multi read hosts -->
                        <readHost host="hostS1" url="192.168.190.135:3306" user="root" password="123456" />
                </writeHost>
        </dataHost>
</mycat:schema>

配置文件修改完成后,我另外启动了一台虚拟机,ip地址为:192.168.190.135,并以当前这台虚拟机为测试机进行测试(ip地址为192.168.190.134),分别为它们安装mysql,接下来测试一下是否能够远程连接这,台虚拟机的mysql:

[root@centos-7 etc]# mysql -uroot -p123456 -h 192.168.190.135 -P 3306
ERROR 1130 (HY000): Host '192.168.190.134' is not allowed to connect to this MariaDB server

报错了,这是因为mysql默认拒绝root用户进行远程访问,我们为其添加权限即可(需要在ip为192.168.190.135的虚拟机上执行该条sql语句):

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.190.134' IDENTIFIED BY '123456' WITH GRANT OPTION;

该sql语句的意思是允许ip地址为192.168.190.134的虚拟机使用root用户并以123456为密码进行远程连接,再次尝试连接:

[root@centos-7 etc]# mysql -uroot -p123456 -h 192.168.190.135 -P 3306
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 5.5.65-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

这样就连接成功了。

验证成功后,接下来就可以启动MyCat了,先切换至MyCat的bin目录,然后执行指令:

./mycat console

若启动产生如下问题:

在这里插入图片描述

可修改conf目录下的wrapper.conf文件,添加如下配置:

wrapper.ping.timeout=120

wrapper.startup.timeout=300

然后回到bin目录下重新启动MyCat。

MyCat的登录

执行指令以数据窗口的方式登录MyCat:

mysql -umycat -p123456 -P 8066 -h 192.168.190.134

登录成功后是这样的:

[root@centos-7 conf]# mysql -umycat -p123456 -h 192.168.190.134 -P 8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.29-mycat-1.6.7.1-release-20190627191042 MyCat Server (OpenCloudDB)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.00 sec)

MySQL [(none)]> use TESTDB;
Database changed
MySQL [TESTDB]> show tables;
Empty set (0.00 sec)

然后我们先创建一张表,接下来会使用到它:

create table test(id int,name varchar(20));

主从复制

我们先试着使用mysql搭建两种读写分离模式:

  • 一主一从
  • 双主双从

一主一从

即一个主机用于处理所有写请求,一个主机处理所有读请求。

先来配置一下主机,修改ip为192.168.190.134的虚拟机/etc目录下的my.cnf文件:

# 主服务器唯一ID
server-id=1
# 启用二进制日志,从库的复制需要使用该日志
log-bin=mysql-bin
# 设置不需要复制的数据库
binlog-ignore-db=mysql
# 设置需要复制的数据库
binlog-do-db=testdb
# 设置logbin格式
binlog_format=STATEMENT

若是使用yum下载的mysql,则mysql的配置文件my-medium.cnf将存放在/usr/share/mysql目录下,所以需要将其复制到/etc目录下:

cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

直接覆盖/etc目录下的my.cnf文件即可,然后将文件中已经配置的部分注释掉,再添加自己的配置。

在这里插入图片描述

接下来配置一下从机,修改ip为192.168.190.135的虚拟机/etc目录下的my.cnf文件:

# 从服务器唯一ID
server-id=2
# 启用中继日志
relay-log=mysql-relay

从机的做法也是一样的,先覆盖配置文件,然后注释掉原先的配置,并添加自己的配置。

配置文件到此就修改好了,接下来将主机和从机的mysql服务都重新启动一下:

systemctl start mariadb.service

为了操作方便,将主机和从机的防火墙都关掉:

systemctl stop firewalld.service

然后在主机上建立账户并授权slave:

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%'IDENTIFIED BY '123456';

并验证一下刚刚的配置是否成功:

MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      245 | testdb       | mysql            |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> 

接着在从机上配置需要复制的主机 (执行下面的sql语句):

CHANGE MASTER TO MASTER_HOST='192.168.190.134',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=245;

这里的MASTER_LOG_FILE和MASTER_LOG_POS都已经在主机中查询出来了。

然后启动从机的复制功能:

start slave;

执行show slave status查看从机状态:

在这里插入图片描述

若发现这两项为yes则表示主从复制搭建成功。

现在你可以尝试着在主机的mysql上创建一个数据库,看看从机是不是会自动复制过去,需要注意的是这里只能创建testdb数据库,因为之前在配置文件中只限定了复制testdb数据库:

# 设置需要复制的数据库
binlog-do-db=testdb

若想停止主从复制的功能,可以执行:

stop slave;

若想重新配置主从,可以执行:

stop slave;
reset master;

一主一从读写分离

在前面我们已经配置了MyCat的读写分离主机,所以这里我们可以直接登录MyCat并查看数据表:

mysql -umycat -p123456 -h 192.168.190.134 -P 8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.29-mycat-1.6.7.1-release-20190627191042 MyCat Server (OpenCloudDB)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.00 sec)

MySQL [(none)]> use TESTDB;
1 row in set (0.00 sec)

MySQL [TESTDB]> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| test             |
+------------------+
1 row in set (0.00 sec

MySQL [TESTDB]> select * from test;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
+------+----------+
1 row in set (0.00 sec)

还记得在MyCat登录那里我们创建的表吗?那时候表还是空的,现在已经有数据了,显然读写分离有效果了,但是这样就真的实现了读写分离吗?

回过头来看看之前配置的schema.xml文件:

在这里插入图片描述

按照这样的配置,读操作应该在从机进行(192.168.190.135),写操作应该在主机(192.168.190.134)进行,但是看这样一个情况:

# 主机
MariaDB [testdb]> select * from test;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | aaa      |
+------+----------+
3 rows in set (0.00 sec)

# 从机
MariaDB [testdb]> select * from test;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
+------+----------+
2 rows in set (0.00 sec)

现在主机和从机的数据不一致,若是在MyCat中进行查询,读操作应该在从机进行,就会查询到两条记录,但事实上:

MySQL [TESTDB]> select * from test;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | aaa      |
+------+----------+
3 rows in set (0.00 sec)

查询到的仍然是主机上的数据库内容,所以读写分离的配置其实并没有配好,我们还需要回到schema.xml再次进行配置:

在这里插入图片描述

将balance属性值设置为3,关于balance属性可设置的值及作用例举如下:

  • 0:不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上

  • 1:全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单地说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡

  • 2:所有读操作都随机的在 writeHost、readhost 上分发

  • 3:所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力

配置完成后,要重新启动MyCat,并登陆MyCat再次查询数据表:

MySQL [TESTDB]> use TESTDB;
Database changed
MySQL [TESTDB]> select * from test;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
+------+----------+
2 rows in set (0.00 sec)

这次查询到的就是从机上的内容了,真正实现了读写的分离。

双主双从

在实际生产环境中,还需要考虑不可预料的一些状况,比如主机突然宕机了,所以我们可以对主机做一个备份,目的是当主机挂了以后,备机能够切换成主机保证项目的正常工作。

鉴于双主双从的实现过程和一主一从是一样的,这里就不再去演示了,介绍一下如何配置即可。

首先需要启动四台虚拟机,暂且取名为master1、master2、slave1、slave2,先配置master1的mysql配置文件:

修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=testdb
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1

然后配置master2的mysql配置文件:

修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=3
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=testdb
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=2

需要注意的是,这两台主机是互为主备的关系,当master1为主机且宕机了之后,master2就会切换为主机继续工作,而当master1修复完成后,它又会成为master2的备机等待master2宕机,所以两台主机配置文件中都需要配置log-slave-updates

接着配置slave1的mysql配置文件:

修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay

最后 slave2的mysql配置文件:

修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=4
#启用中继日志
relay-log=mysql-relay

全部配置完成后,重启四台虚拟机的mysql服务,并关闭防火墙,然后在两台主机上建立账户并授权slave:

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

然后在两台主机上分别执行show master status;查看master1和master2的状态:

在这里插入图片描述

在这里插入图片描述

在从机上配置需要复制的主机(slave1复制master1,slave2复制master2):

#复制主机的命令
CHANGE MASTER TO MASTER_HOST='192.168.190.140',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000008',MASTER_LOG_POS=154;
#复制主机的命令
CHANGE MASTER TO MASTER_HOST='192.168.190.141',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;

然后启动两台从机的复制功能:

start slave;

这样主从之间的复制就配置好了,我们还需要让两个主机之间互为主备关系,配置两个主机之间互相复制:

#master2复制master1
CHANGE MASTER TO MASTER_HOST='192.168.190.140',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;
#master1复制master2
CHANGE MASTER TO MASTER_HOST='192.168.190.141',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;

然后启动两台主机的复制功能:

start slave;

这样双主双从的复制就完成了,在master1主机上新建表、插入数据等操作,在master2和两个从机上都能够进行同步,接下来配置一下读写分离。

双主双从读写分离

修改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">
        </schema>
        <dataNode name="dn1" dataHost="host1" database="testdb" />
    	<!-- 将balance属性值设为1 -->
        <dataHost name="host1" maxCon="1000" minCon="10" balance="1"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
            	<!-- 本机ip:192.168.190.140 -->
                <writeHost host="hostM1" url="127.0.0.1:3306" user="root"
                                   password="123456">
                        <!-- can have multi read hosts -->
                        <readHost host="hostS1" url="192.168.190.135:3306" user="root" password="123456" />
                </writeHost>
            	
            	 <writeHost host="hostM2" url="192.168.190.141:3306" user="root"
                                   password="123456">
                        <!-- can have multi read hosts -->
                        <readHost host="hostS2" url="192.168.190.136:3306" user="root" password="123456" />
                </writeHost>
        </dataHost>
</mycat:schema>

配置完成后介绍一下双主双从中使用到的一些配置:

  • writeType:
    • 若值为’0’,则所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个
    • 若值为’1’,则所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃,不推荐使用
  • switchType:
    • 若值为’1’:自动切换
    • 若值为’-1’:不自动切换
    • 若值为’2’:基于 MySQL 主从同步的状态决定是否切换

重启MyCat即可。

此时若master1主机宕机(可以手动停止master1主机的mysql服务用于模拟宕机场景),然后在MyCat中进行数据的插入,会发现数据仍然能够插入成功,这是因为master2发现master1宕机了之后马上自动切换成写主机保证了数据的正常插入。

配置实现垂直分库

关于数据库分布式的概念在前面已经介绍过了,这里以垂直分库和水平分表为例进行介绍,下面直接说明如何配置,修改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">
        <!-- 将客户表单独放置在dn2节点,其它表默认放置在dn1节点 -->
        <table name="customer" dataNode="dn2" ></table>
    </schema>
    <dataNode name="dn1" dataHost="host1" database="orders" />
    <!-- 配置host2为dn2节点的主机 -->
    <dataNode name="dn2" dataHost="host2" database="orders" />
    <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM1" url="127.0.0.1:3306" user="root"
                   password="123456">
            <!-- can have multi read hosts -->
            <readHost host="hostS1" url="192.168.190.134:3306" user="root" password="123456" />
        </writeHost>
    </dataHost>
    <!-- 配置host2主机 -->
    <dataHost name="host2" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"
              slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM2" url="192.168.140.135:3306" user="root"
                   password="123456">
        </writeHost>
    </dataHost>
</mycat:schema>

这里将orders数据库中的订单信息拆分为订单表、订单详情表、订单字典表和客户表,因为订单表、订单详情表和订单字典表属于相关联的表,所以将其放在一个数据库中,将客户表与其分隔开,将它单独放置在另外一台主机上,以此实现垂直分库。

重启然后登录MyCat,并分别创建这四张表,发现数据表的分布如下:

在这里插入图片描述

配置实现水平分表

首先修改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="customer" dataNode="dn2" ></table>
        <!-- 将orders表分为dn1、dn2两片,这里的rule属性后续需要使用到 -->
        <table name="orders" dataNode="dn1,dn2" rule="mod_rule" ></table>
    </schema>
    <dataNode name="dn1" dataHost="host1" database="orders" />
    <dataNode name="dn2" dataHost="host2" database="orders" />
    <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="127.0.0.1:3306" user="root"
                   password="123456">
            <readHost host="hostS1" url="192.168.190.134:3306" user="root" password="123456" />
        </writeHost>
    </dataHost>
    <dataHost name="host2" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"
              slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM2" url="192.168.140.135:3306" user="root"
                   password="123456">
        </writeHost>
    </dataHost>
</mycat:schema>

然后修改rule.xml文件:

在这里插入图片描述

添加一个tableRule,name属性值是你在schema.xml中配置的rule属性值,然后是columns标签,配置数据表根据哪个字段进行拆分,algorithm标签配置使用何种算法,这里采用MyCat提供的mod-long,然后需要将配置文件末尾的count属性值设为2,因为我们目前只有两个数据节点(dataNode):

在这里插入图片描述

重新启动并登录MyCat,在这之前需要确保每台主机中的数据库中都含有需要拆分的表。

MyCat监控工具

这里介绍一款MyCat监控工具——MyCat-web:

MyCat-web 是 MyCat可视化运维的管理和监控平台,弥补了 MyCat 在监控上的空白。帮 MyCat分
担统计任务和配置管理任务。MyCat-web 引入了 ZooKeeper 作为配置中心,可以管理多个节点。
MyCat-web 主要管理和监控 Mycat 的流量、连接、活动线程和内存等,具备 IP 白名单、邮件告警等模
块,还可以统计 SQL 并分析慢 SQL 和高频 SQL 等。为优化 SQL 提供依据。

首先需要下载zookeeper的安装包:http://zookeeper.apache.org/

在这里插入图片描述

点击Download完成下载,然后下载MyCat-web,打开MyCat的官网:

在这里插入图片描述

点击更多下载并找到Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz文件完成下载,下载好后将两个文件都上传至linux的/opt目录下。

解压zookeeper:

tar -zxvf zookeeper-3.4.14.tar.gz

进入zookeeper目录下的bin目录,启动zookeeper:

./zkServer.sh start

接着解压MyCat-web:

tar -zxvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz

然后进入解压后的目录,直接启动MyCat-web:

./start.sh

启动完成后,就可以在浏览器上访问 http://192.168.190.134:8082/mycat/:

在这里插入图片描述

现在尝试着添加一个MyCat的配置管理,点击Mycat-配置下的mycat服务管理,并点击新增:

在这里插入图片描述

然后配置一下:

在这里插入图片描述

和在server.xml中进行的配置一样,只不过这里是图形化的界面。

监控平台的功能很多,这里就不一一列举了:

在这里插入图片描述

~wangweijun CSDN认证博客专家 Spring Java
人生如逆旅,我亦是行人。
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 39.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值