MySQL使用MyCat实现分库分表
MySQL分库分表的实现方式有:
- shardingJDBC:基于AOP原理,在应用程序中对本地执行的SQL进行拦截,解析、改写、路由处理。需要自行编码配置实现,只支持java语言,性能较高。
- MyCat:数据库分库分表中间件,不用调整代码即可实现分库分表,支持多种语言,性能不及前者。
这里使用的是MyCat
mycat2官网地址:MyCat2
mycat只需要在一台服务器上安装即可,安装的服务器也称为中间件服务器。
我这里是在虚拟机上进行的,一共3台服务器,192.168.168.100,192.168.168.101,192.168.168.102
3台服务器上都需要安装mysql(安装mysql:Linux安装MySQL_生骨大头菜的博客-CSDN博客),只需要在192.168.168.100上安装mycat和jdk
1.安装jdk
如果系统没有安装jdk,需要先安装:linux安装java_生骨大头菜的博客-CSDN博客_java安装linux
2.下载安装包并且解压
地址:https://github.com/MyCATApache/Mycat-download/tree/master/1.6-RELEASE
将下载好的文件上传到服务器的/usr/mycat目录下
# 进入mycat文件夹
cd /usr/mycat
# 解压
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
cd /usr/local/
ll
进入mycat可以看到文件及文件夹
3.设置分片配置
cd conf/
ll
分片配置文件是schema.xml ,删除不需要的部分进行精简
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"><table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-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><writeHost host="hostS1" url="localhost:3316" user="root" password="123456" /></dataHost></mycat:schema>
编辑相关配置:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="DB01" checkSQLschema="true" sqlMaxLimit="100"><table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /></schema><dataNode name="dn1" dataHost="dhost1" database="db01" /><dataNode name="dn2" dataHost="dhost2" database="db01" /><dataNode name="dn3" dataHost="dhost3" database="db01" /><dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="master" url="jdbc:mysql://192.168.168.100:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="root" /></dataHost><dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="master" url="jdbc:mysql://192.168.168.101:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="root" /></dataHost><dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="master" url="jdbc:mysql://192.168.168.102:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="root" /></dataHost></mycat:schema>
配置server.xml,配置mycat的用户及用户的权限信息
<user name="root"><property name="password">123456</property><property name="schemas">DB01</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">123456</property><property name="schemas">DB01</property><property name="readOnly">true</property></user>
4.启动mycat服务
# /usr/local/mycat/为mycat的安装目录
# 启动
/usr/local/mycat/bin/mycat start
# 停止
/usr/local/mycat/bin/mycat stop
mycat启动之后,占用的端口号8806
查看是否启动成功
tail -f /usr/local/mycat/logs/wrapper.log
如果这时提示错误:
原因为缺少驱动,可以下载相应的驱动:https://downloads.mysql.com/archives/c-j/
上传到/usr/local/mycat/lib进行解压,取出文件夹里jar文件
# 授权
chmod 777 mysql-connector-java-5.1.49.jar
/usr/local/mycat/bin/mycat stop
/usr/local/mycat/bin/mycat start
tail -f /usr/local/mycat/logs/wrapper.log
看到这句话证明正常启动了
5.登录mycat服务
mysql -h 192.168.168.100 -P 8066 -uroot -p123456
show databases;
可以看到对应的逻辑数据库以及表
创表并插入数据
CREATE TABLE TB_ORDER (
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL,
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
可以在Navicat工具上看到每台虚拟机的数据库都有这张表了
INSERT INTO TB_ORDER(id,title) VALUES(1,'goods1');
INSERT INTO TB_ORDER(id,title) VALUES(2,'goods2');
INSERT INTO TB_ORDER(id,title) VALUES(3,'goods3');
INSERT INTO TB_ORDER(id,title) VALUES(1000000, 'goods1000000');
INSERT INTO TB_ORDER(id,title) VALUES(10000000, 'goods10000000');
INSERT INTO TB_ORDER(id,title) VALUES(10000001, 'goods10000001');
注意:由于分配规则使用的是auto-sharding-long,所以只能插入id<=15000000的数据,如果需要插入这个值以上的就需要增加数据节点,或者修改规则
至此mycat部署已基本完成
如果想更灵活地使用mycat,则需要了解mycat的相关配置文件的使用
6.mycat配置文件
主要有3个:
- schema.xml:配置逻辑库逻辑表等相关信息
- server.xml:mycat运行的服务的信息,例如用户及其权限
- rule.xml:分片规则的信息
都存放在/usr/local/mycat/conf
6.1.schema.xml
schema.xml作为MyCat中最重要的配置文件之一, 涵盖了MyCat的逻辑库、逻辑表、分片规则、分片节点及数据源的配置。
主要包含以下三组标签:
6.1.1.schema标签
schema标签用于定义MyCat实例中的逻辑库,一个MyCat实例中, 可以有多个逻辑库,可以通过schema标签来划分不同的逻辑库。 MyCat中的逻辑库的概念,等同于MySQL 中的database概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxx)。
核心属性:
- name:指定自定义的逻辑库库名
- checkSQLschema:在SQL语句操作时指定了数据库名称,执行时是否自动去除; true: 自动去除,false: 不自动去除
- sqlMaxLimit:如果未指定limit进行查询,列表查询模式查询多少条记录
table标签
table标签定义了MyCat中逻辑库schema'下的逻辑表,所有需要拆分的表都需要在table标签中定义。
核心属性:
- name:定义逻辑表表名,在该逻辑库下唯一
- dataNode: 定义逻辑表所属的dataNode, 该属性需要与dataNode标签中name对应;多个dataNode逗号分隔
- rule:分片规则的名字,分片规则名字是在rule.xml中定义的
- primaryKey:逻辑表对应真实表的主键
- type:逻辑表的类型,目前逻辑表只有全局表和普通表,如果未配置,就是普通表;全局表,配置为global
6.1.2. dataNode标签
dataNode标签中定义了MyCat中的数据节点,也就是我们通常说的数据分片。一个dataNode标签就是-个独立的数据分片。
核心属性:
- name:定义数据节点名称
- dataHost: 数据库实例主机名称,引用自dataHost标签中name属性
- database:定义分片所属数据库
6.1.3.datahost栋签
该标签在MyCat逻辑库中作为底层标签存在,直接定义了具体的数据库实例、读写分离、心跳语句。
核心属性:
- name:唯一标识,供上层标签使用
- maxCon/minCon: 最大连接数/最小连接数
- balance: 负载均衡策略,取值0,1,2,3
- writeType: 写操作分发方式(0:写操作转发到第一个writeHost, 第一个挂了,切换到第二个; 1:写操作随机分发到配置的writeHost)
- dbDriver:数据库驱动,支持native、jdbc
6.2.rule.xml
rule.xml中定义所有拆分表的规则,在使用过程中可以灵活的使用分片算法,或者对同一个分片算法使用不同的参数,它让分片过程可配置化。
主要包含两类标签: tableRule、Function。
6.3.server.xml
server.xml配置文件包含了MyCat的系统配置信息,主要有两个重要的标签: system、 user。
6.3.1.system标签
对应的系统配置项及其含义
6.3.2.user标签
了解这些配置文件后可以灵活地对数据库进行水平拆分、垂直拆分
MySQL使用MyCat实现分库分表相关推荐
- MySQL使用Mycat实现分库分表-读写分离
MySQL使用Mycat实现分库分表-读写分离 Mycat Mycat介绍 什么是Mycat? Mycat架构 Mycat核心概念 MyCat主要解决的问题 MyCat对多数据库的支持 Mycat分片 ...
- Linux+MySQL+MyCat实现分库分表,通过MyCat数据库中间件实现分库分表配置实战
目录 前言 Linux+MySQL+MyCat实现读写分离,主从同步的解决方案 一.Linux下MySQL数据库服务的安装与部署 二.下载Linux MyCat 三.上传Linux服务器,并解压 四. ...
- Mycat - 数据库分库分表中间件,国内最活跃的、性能最好的开源数据库中间件
转载自 Mycat - 数据库分库分表中间件,国内最活跃的.性能最好的开源数据库中间件 Mycat是什么 Mycat - 数据库分库分表中间件,国内最活跃的.性能最好的开源数据库中间件! 一个彻底开源 ...
- 开源分布式数据库中间件MyCat架构简介(二)——基于MyCat的分库分表,读写分离,水平切分和垂直切分实现原理
目录 前言 基于MyCat的分库分表,读写分离,水平切分和垂直切分实现原理 一.关于Mycat 二.Mycat 实现原理 三.MyCat 应用场景 四.MyCat 未来展望 五.Mycat 中相关概念 ...
- Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案
Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 参考文章: (1)Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 (2)https://www.cnblogs.com/ ...
- mysql查逻辑表的分片规则_MySQL(19) Mycat分片(分库分表)配置
一.前言 本文将基于主从复制,读写分离的环境基础上进行一个简单的分片(分库分表)配置 二.Mycat分片配置 mycat分片主要在scheam.xml,rule.xml这2个表中配置 ① scheam ...
- 主从复制MySQL的安装和用数据库中间件MyCat实现分库分表、读写分离
1.MySql主从复制 1.1.安装mysql 1.1.1.下载 下载地址:https://dev.mysql.com/downloads/mysql/ 1.1.2.卸载预装mysql #查看已安装: ...
- 【mycat】分库分表
在分库分表时,我们先安装好mycat:https://blog.csdn.net/wangyunzhao007/article/details/107330854 一.垂直切分 按照业务模块进行切分, ...
- mycat配置访问oracle_MySQL:如何使用MyCAT实现分库分表?
分库分表介绍 随着微服务这种架构的兴起,我们应用从一个完整的大的应用,切分为很多可以独立提供服务的小应用.每个应用都有独立的数据库. 数据的切分分为两种: 垂直切分:按照业务模块进行切分,将不同模块的 ...
最新文章
- python 解析XML xml.dom
- [转]window.open居中
- thinkphp连接oracle
- pytorch,onnx和tensorrt 的速度对比
- Permission denied (publickey) 解决方案
- 我很喜欢电影背后这个看上去很精神分裂的故事,跟影片中那个盘根错节的故事相得益彰。好的艺术作品永远都不可能被简化成纬度单一的说教。
- arcgis面积计算
- Python开发——16.HTML
- vscode+markdown+pandoc写论文
- 基于单片机的贪吃蛇游戏
- 【无标题】c++日常练习(16)——从中序与前序遍历序列构造二叉树
- 2019年前端road map
- 【SAP】ABAP——币种金额转换
- 力扣-167题 两数之和 II - 输入有序数组(C++)- 双指针
- Http缓存机制(强缓存与协商缓存)及过程
- Django 安装(Django-3.2.13)
- Nginx跨域配置、防盗链配置
- android5.1 MT6735 编译过程
- 转自一个CG大神的文章
- 用Python写表白程序,给另一半一个惊喜