业务场景:一张订单表order_info分割成多张表分配到三个数据库db1,db2,db3(同一主机)
实现方式:Mycat数据库中间件实现分库分表。
实现逻辑:客户端发起一个数据操作请求,Mycat拦截首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数
据库,并将返回的结果做适当的处理,最终再返回给用户。
在实现前我们下看下服务器规划
主机名 |
OS |
IP |
用途 |
备注 |
CentOS 7_107 |
CentOS7 |
192.168.1.107 |
Master/写 |
Mysql8/mysql-proxy |
CentOS 7_108 |
CentOS7 |
192.168.1.108 |
Slave/读 |
Mysql8 |
CentOS 7_109 |
CentOS7 |
192.168.1.109 |
Slave/读 |
Mysql8 |
CentOS 7_110 |
CentOS7 |
192.168.1.110 |
Mycat |
Mycat |
从表格我们可以看出来,Mycat是单独部署到一台服务器上,通过安装配置Mycat来完成分库分表功能
具体实现步骤:
- 下载安装jdk1.8
上传到/usr/local目录下并解压
tar -xvf jdk-8u181-linux-x64.tar.gz
配置jdk环境变量
vi /etc/profile
添加如下内容:
export JAVA_HOME=/usr/local/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
wq保存退出后:
source /etc/profile
输入命令:[root@localhost ~]#
java -version
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
显示如上信息表示jdk安装配置完成
- 下载 Mycat
官网地址: http://www.mycat.io/
- 上传至/usr/local/目录下并解压
tar -xvf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
- 修改mycat相关配置文件
配置server.xml
vi /usr/local/mycat/conf/server.xml
该配置主要修改用户信息
修改内容如下
<?xml version="1.0" encoding="UTF-8"?>
......
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">tDB</property>
<!-- 表级 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">TESTDB</property>
<property name="readOnly">true</property>
</user> -->
</mycat:server>
配置schema.xml
此文件关联mysql读写分离策略!读写分离、分库分表策略、分片节点都是在此文件中配置的!
首先备份schema.xml文件
cp schema.xml schema.xml_bak
编辑schema.xml文件
vi /usr/local/mycat/conf/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">
<!-- auto sharding by id (long) -->
<!—物理表的名称-->
<table name="order_info" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- url配置的是物理数据库的地址 -->
<writeHost host="hostM1" url="192.168.1.107:3306" user="root"
password="root">
<!-- can have multi read hosts -->
<!-- <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" /> -->
</writeHost>
</dataHost>
</mycat:schema>
wq保存退出;
- mycat启动
cd /usr/local/mycat/bin目录下
./mycat start
查看进程是否启动
ps -ef | grep mycat
- 创建数据库和表
在master主机上创建物理数据库db1、db2、db3
create database db1;
create database db2;
create database db3;
分别在三个库中执行以下sql创建orde_info表
DROP TABLE IF EXISTS `order_info`;
CREATE TABLE `order_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_no` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`total_count` int(11) NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
- 客户端登录Mycat数据库
- 插入数据,测试分库分表
在mycat客户端下插入数据
insert into order_info(id,order_no,total_count) VALUES (1,'100001',11);
insert into order_info(id,order_no,total_count) VALUES (2,'200001',22);
insert into order_info(id,order_no,total_count) VALUES (3,'300001',33);
insert into order_info(id,order_no,total_count) VALUES (4,'400001',44);
insert into order_info(id,order_no,total_count) VALUES (5,'500001',55);
insert into order_info(id,order_no,total_count) VALUES (6,'600001',66);
insert into order_info(id,order_no,total_count) VALUES (7,'700001',77);
- 在master主机和slave从机客户端查看mycat端写入的数据
select * from db1.order_info
select * from db2.order_info
select * from db3.order_info
从上面可以看出:
在mycat里做了sharding分片策略的order_info表里写入的数据,已经分片到db1、db2、db3三个库中了,即成功实现了分库分表功能!