MySQL 高可用:mysql+mycat实现数据库分片(分库分表)

2023-11-14

什么是MYCAT:

一个彻底开源的,面向企业应用开发的大数据库集群

支持事务、ACID、可以替代MySQL的加强版数据库

一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

一个新颖的数据库中间件产品

 

 Mycat关键特性 :

支持SQL92标准

遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。

基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。

支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster

基于Nio实现,有效管理线程,高并发问题。

支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。

支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。

支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。

支持多租户方案。

支持分布式事务(弱xa)。

支持全局序列号,解决分布式下的主键生成问题。

分片规则丰富,插件化开发,易于扩展。

强大的web,命令行监控。

支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。

支持密码加密

支持服务降级

支持IP白名单

支持SQL黑名单、sql注入攻击拦截

支持分表(1.6)

集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。

 

官方说明参考:Mycat 数据库分库分表中间件 )

 

JDK 下载(建议要求jdk7及以上):

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html

Linux x86 147.68 MB jdk-7u80-linux-i586.tar.gz


MyCAT 相关:

Mycat 捐赠地址:http://www.mycat.io/donate.html

Mycat 官斱网站:http://www.mycat.io/

Mycat 源码:https://github.com/MyCATApache/Mycat-Server

Mycat 下载地址:https://github.com/MyCATApache/Mycat-download

 

 

既然 mycat  那么强大,那就测试看看:

 

#测试环境:

# 有3张表 users,item,item_detail (item 的子表) 和 3 个数据库 db01,db02,db03

# 表 users 存储在数据库 db01, 表 item 和 item_detail 分布存储在数据 db01 和 db02 

# 现在在3个数据库都创建相同的表

create database db01;
create database db02;
create database db03;

CREATE TABLE users (
    id INT NOT NULL AUTO_INCREMENT,
    name varchar(50) NOT NULL default '',
    indate DATETIME NOT NULL default '0000-00-00 00:00:00',
    PRIMARY KEY (id)
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE item (
    id INT NOT NULL AUTO_INCREMENT,
    value INT NOT NULL default 0,
    indate DATETIME NOT NULL default '0000-00-00 00:00:00',
    PRIMARY KEY (id)
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE item_detail (
    id INT NOT NULL AUTO_INCREMENT,
    value INT NOT NULL default 0,
    name varchar(50) NOT NULL default '',
	item_id INT NOT NULL,
    PRIMARY KEY (id),
	key (item_id)
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

# JDK 安装配置

cd /usr/local/src
tar xvf jdk-7u80-linux-i586.tar.gz
mkdir -p /usr/local/java
mv /usr/local/src/jdk1.7.0_80 /usr/local/java/
chown -R root:root /usr/local/java
cd /usr/local/java/


#配置环境变量

vi /etc/profile 

export JAVA_HOME=/usr/local/java/jdk1.7.0_80
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar


#设置生效

source /etc/profile


#测试是否安装成功

[root@server1 ~]# java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) Client VM (build 24.80-b11, mixed mode)

 

# Mycat 安装配置

cd /usr/local/src
tar xvf Mycat-server-1.5.1-RELEASE-20160405120037-linux.tar.gz 
mv /usr/local/src/mycat /usr/local/

groupadd mycat
useradd -g mycat mycat
chown -R mycat:mycat /usr/local/mycat


#添加环境变量

vi /etc/profile


export MYCAT_HOME=/usr/local/mycat


#设置生效

source /etc/profile


#服务器名和IP绑定

vi /etc/hosts
192.168.100.50	server1
127.0.0.1       server1


# 设置 wrapper.java.command 的java 路径(使用默认java其实不用设置)

 

 ( 同时可设置 -Xmx 和 -Xms ,参考: mycat 启动失败 The specified size exceeds the maximum representable size)

vi /usr/local/mycat/conf/wrapper.conf

wrapper.java.command=%JAVA_HOME%/bin/java


#配置 server.xml 和 schema.xml  (本案例配置信息在文章底部)

vi /usr/local/mycat/conf/server.xml
vi /usr/local/mycat/conf/schema.xml


#启动mycat服务 ./mycat { console | start | stop | restart | status | dump }

/usr/local/mycat/bin/mycat console
#mycat 进程
ps -ef | grep mycat

#日子信息
tail -20 /usr/local/mycat/logs/wrapper.log

 

自启动
#vim /etc/rc.local
sh /usr/local/mycat/bin/mycat start

 

 

测试:

#访问 mycat   (凭据参考 /usr/local/mycat/conf/server.xml)

mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB

 

mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   | 
+----------+

mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| item             | 
| item_detail      | 
| users            | 
+------------------+


#在 mycat 中插入数据并查询:

insert into users(name,indate) values('kk',now());
insert into item(id,value,indate) values(1,100,now());
insert into item_detail(value,name,item_id) values('pad',40,1);
insert into item_detail(value,name,item_id) values('phone',50,1);

insert into item(id,value,indate) values(999,100,now());
insert into item_detail(value,name,item_id) values('pad',40,999);
insert into item_detail(value,name,item_id) values('phone',50,999);
mysql> select * from users;
+----+------+---------------------+
| id | name | indate              |
+----+------+---------------------+
|  1 | kk   | 2016-04-13 06:28:00 | 
+----+------+---------------------+

mysql> select * from item;
+-----+-------+---------------------+
| id  | value | indate              |
+-----+-------+---------------------+
| 999 |   100 | 2016-04-13 06:34:12 | 
|   1 |   100 | 2016-04-13 06:32:58 | 
+-----+-------+---------------------+

mysql> select * from item_detail;
+----+-------+------+---------+
| id | value | name | item_id |
+----+-------+------+---------+
|  1 |     0 | 40   |     999 | 
|  2 |     0 | 50   |     999 | 
|  1 |     0 | 40   |       1 | 
|  2 |     0 | 50   |       1 | 
+----+-------+------+---------+

 


#打开另一个终端,使用mysql账号登陆访问查看表情况

 

mysql -uroot -ptest -p


#具体的表数据存储情况:

-----------------------------------------
mysql> select * from db01.users;
+----+------+---------------------+
| id | name | indate              |
+----+------+---------------------+
|  1 | kk   | 2016-04-13 06:28:00 | 
+----+------+---------------------+

mysql> select * from db02.users;

mysql> select * from db03.users;

-----------------------------------------

mysql> select * from db01.item;

mysql> select * from db02.item;
+-----+-------+---------------------+
| id  | value | indate              |
+-----+-------+---------------------+
| 999 |   100 | 2016-04-13 06:34:12 | 
+-----+-------+---------------------+

mysql> select * from db03.item;
+----+-------+---------------------+
| id | value | indate              |
+----+-------+---------------------+
|  1 |   100 | 2016-04-13 06:32:58 | 
+----+-------+---------------------+

-----------------------------------------

mysql> select * from db01.item_detail;

mysql> select * from db02.item_detail;
+----+-------+------+---------+
| id | value | name | item_id |
+----+-------+------+---------+
|  1 |     0 | 40   |     999 | 
|  2 |     0 | 50   |     999 | 
+----+-------+------+---------+

mysql> select * from db03.item_detail;
+----+-------+------+---------+
| id | value | name | item_id |
+----+-------+------+---------+
|  1 |     0 | 40   |       1 | 
|  2 |     0 | 50   |       1 | 
+----+-------+------+---------+

 

自启动
#vim /etc/rc.local
sh /usr/local/bin/mycat start

测试完成!!~数据进行了分库分表!
------------------------------------------------------------------------------------

------------------------------------------------------------------------------------

# server.xml 和 schema.xml 配置情况

# vi /usr/local/mycat/conf/server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
        <system>
			<!-- 
				<property name="processors">32</property>
				<property name="processorExecutor">32</property> 
				<property name="bindIp">0.0.0.0</property> 
				<property name="frontWriteQueueSize">4096</property>
				<property name="idleTimeout">300000</property>
				<property name="mutiNodePatchSize">100</property>
			-->
				<property name="defaultSqlParser">druidparser</property>
				<property name="mutiNodeLimitType">1</property>
				<property name="serverPort">8066</property>
				<property name="managerPort">9066</property> 
        </system>
		<!-- 任意设置登陆 mycat 的用户名,密码,数据库  -->
        <user name="test">
                <property name="password">test</property>
                <property name="schemas">TESTDB</property>
        </user>

        <user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>
        </user>
        <!-- 
        <quarantine> 
           <whitehost>
              <host host="127.0.0.1" user="mycat"/>
              <host host="127.0.0.2" user="mycat"/>
           </whitehost>
       <blacklist check="false"></blacklist>
        </quarantine>
        -->
</mycat:server>

 

# vi /usr/local/mycat/conf/schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

	<!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致  -->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<table name="users" primaryKey="id" type="global" dataNode="node_db01" />

        <table name="item" primaryKey="id" dataNode="node_db02,node_db03" rule="mod-long">
                <childTable name="item_detail" primaryKey="id" joinKey="item_id" parentKey="id" />
        </table>
    </schema>

	<!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->
	<dataNode name="node_db01" dataHost="dataHost01" database="db01" />
    <dataNode name="node_db02" dataHost="dataHost01" database="db02" />
    <dataNode name="node_db03" dataHost="dataHost01" database="db03" />

	<!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->
    <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
            <heartbeat>select user()</heartbeat>
            <writeHost host="server1" url="127.0.0.1:3306" user="root" password="mysql"/>
    </dataHost>
</mycat:schema>

 

 

 

其他参考:

http://www.csdn.net/article/2015-07-16/2825228 (原理及应用)

http://www.songwie.com/articlelist/50(理论和实践 写的好)

http://ly.blog.itpub.net/29733787/viewspace-2049139/(示例)  MyCAT安装使用及简单测试 

http://www.cnblogs.com/ivictor/p/5111495.html(示例)  MyCAT简易入门

http://www.2cto.com/database/201503/385641.html(示例) Mycat水平分表,垂直分表实践(2)

http://www.51testing.com/html/34/369434-3686088.html(示例)使用Mycat 做简单的读写分离(一)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 高可用:mysql+mycat实现数据库分片(分库分表) 的相关文章

  • 哈希 MySQL 数据库架构

    我想对 MySQL 数据库模式 没有数据 进行哈希 签名 以便对其进行校验和 以确保它不被其他人修改 我怎样才能实现它 据我了解您的问题 您需要表校验和 checksum table table 所以 我想 只需对空表进行校验和
  • 如何在 Node.js 中使用 Winston 将日志存储到 mysql 数据库

    我正在使用 winston 为我的应用程序进行日志记录 我已经使用这个完成了文件传输 class LoggerHelper extends BaseHelper constructor cApp super cApp this props
  • ZeroDateTimeBehavior=convertToNull 在使用 hibernate 的 jdbc url 中不起作用

    通过 extern 属性文件 url 指定如下 jdbc mariadb xxxxx 3306 xxxxx zeroDateTimeBehavior convertToNull 连接工作正常并且能够查询数据库 通过休眠 我创建了一个映射到带
  • 重复键错误不会取消/回滚mysql事务

    当在 mysql innodb 事务中时 我希望重复的键错误会导致回滚 它没有 相反 它只是抛出一个错误并继续执行下一个命令 一旦到达 COMMIT 命令 事务将被提交 没有重复键导致命令 这是预期的行为吗 如果是这样 如何设置它以便在发生
  • 选择每组最新的项目[重复]

    这个问题在这里已经有答案了 可能的重复 检索每组中的最后一条记录 https stackoverflow com questions 1313120 retrieving the last record in each group 我有 2
  • 如何查找所有mysql表之间的所有关系?

    如何找到MySQL所有表之间的所有关系 例如 如果我想知道大约有 100 个表的数据库中表的关系 有什么办法知道这个吗 从编程角度来说 更好的方法是从以下位置收集数据 INFORMATION SCHEMA KEY COLUMN USAGE表
  • 级联删除时触发调用

    我在 MySQL 中有表 A 它有一些对其他表 B C D 的级联删除的引用 当从 A 中删除某些内容时 我需要使用触发器 当我直接从 A 删除记录时 此触发器起作用 但它不适用于级联删除 是否存在任何版本的 MySQL 可以让我的触发器与
  • 将我的 Laravel 连接到外部数据库

    如何将 Laravel 连接到外部数据库 示例 我的本地计算机上有一个 Laravel 它在 xampp 上运行 我希望它连接到云服务器数据库 打开 env文件并编辑它 只需设置正确的外部数据库凭据 DB CONNECTION mysql
  • 重用 PDO 语句 var 会使进程崩溃

    我重用一个变量来存储两个不同的 PDO mysql 语句 stmt dbh gt prepare SELECT stmt gt execute stmt dbh gt prepare UPDATE crash here Error in o
  • Chart.js - 使用 mysql 和 php 从数据库获取数据

    我正在尝试将静态数据转换为使用数据库结果 我将使用MySQL and PHP 示例代码 var randomScalingFactor function return Math round Math random 100 var lineC
  • MySQL - 从另一个表插入与常量合并的数据

    我有一个包含一些数据的临时表 products temp 并且我有另一个需要将数据插入其中的表 产品 我需要在新记录上手动设置一些常量 例如vendor id 1等 是否可以在一次请求中插入临时表数据和常量 临时产品 product nam
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF
  • 无法将句子插入数据库

    我有一些句子 我必须选择由 6 个以上单词组成的句子 然后它们将被插入到数据库中
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro
  • Rails 3 按字段排序和最后

    您好 我对 Rails 3 2 和订购有疑问 当想要按字段对集合进行排序时 调用时 last ActiveRecord行为怪异 gt gt User order FIELD id 1 User Load 0 4ms SELECT users
  • 在 PHP 中比较字符串的方式与 MySQL 相同

    我将 varchar 存储在 utf8 MySQL 表中并使用 utf8 general ci 排序规则 我在 varchar 上有一个唯一索引 我想在 PHP 中进行字符串比较 这相当于 MySQL 对索引所做的操作 一个具体的例子是 我
  • mysql_fetch_array while 循环。它是如何工作的?

    我已经阅读了 php net 上的该函数 但这仍然没有回答我的问题 我对 C 语言有一定的了解 并且刚刚开始使用 php 通常在 C 中 如果要执行 while 循环 则需要有一些条件来将循环推进到不再有效的点 如下所示 while x g
  • 在 OS X 10.7 中找不到 Mysql 命令

    我无法让我的 mysql 在 os x 10 7 上启动 它位于 usr local mysql bin mysql 当我输入时 我得到命令未找到mysql version在终端中 我试过这个无法从 mac 命令行访问 mysql http
  • 根据 MySQL 列内容的长度创建索引?

    如何根据值的长度在 MySQL v 5 0 myisam 数据库引擎 中的列上创建索引 它是文本数据类型 最多 7000 个字符 我是否必须添加具有第一列长度的另一列 是的 因为 MySQL 不支持基于函数的索引 例如ADD INDEX m
  • 使用 Hibernate 和 Apache DBCP 的 MySQL 连接池问题

    看来我的应用程序有问题 当应用程序在启动后闲置很长时间 我不确定确切的时间 时 我会在日志中收到以下错误消息 我使用 Spring Hibernate MySQL 和 ApacheDBCP 进行连接池 ERROR org hibernate

随机推荐

  • GPS采集设备命令

    经纬度简介 经度 具体来说就是地球上一个地点距离一根被称为本初子午线的南北方向走线以东或以西的度数 按国际规定英国首都伦敦格林尼治天文台原址的那一条经线定为0 经线 从0 经线算起 向东 向西各分作180 以东的180 属于东经 用 E 作
  • cURL简单使用、libcurl编程, curl_easy_setopt

    更多关于curl的信息可以参考官网http curl haxx se http curl haxx se libcurl c curl easy setopt html CURLcodecurl easy setopt CURL handl
  • Java-集合(LinkedList类)

    简单介绍 1 LinkedList底层实现了双向链表和双端队列特点 2 可以添加任意元素 元素可重复 包括null 3 线程不安全 没有实现同步 底层操作机制 1 LinkedList底层维护了一个双向链表 2 LinkedList中维护了
  • java字符串判空失败

    那你就快放弃使用 equals lkm 或 lkm isEmpty 进行判空吧 最牛逼判空方法 StringUtils isEmpty lkm 判空失败还有一种可能 基本用什么方法判空都会失败 使用String value 进行转换的判空
  • Python调用ImageMagick生成PDF文件缩略图

    使用Python调用ImageMagick生成PDF文件缩略图 Imagemagick使用Ghostscript作为其依赖项之一 以便能够处理和转换PDF相关的图像 准备 安装Ghostscript 网站 安装ImageMagick 网站
  • 计算机上开发和运行应用程序与操作系统无关,计算机期中测验理论部分和答案-C.doc...

    计算机期中测验理论部分和答案 C 一 判断题 共10分 正确填写T 反之填写F 1 Cache和主存储器虽然都是用半导体芯片作为存储介质 但前者使用SRAM 后者使用DRAM 前者比后者的存取速度快 正确答案 T 2 当一个应用程序窗口被最
  • Spring中比较常用的工具类

    清单 1 BeanDefinitionReaderUtils registerBeanDefinition 往spring容器注册一个beanDefinition 2 PropertiesLoaderUtils loadAllPropert
  • timm库(CV利器)的入门教程(1)

    省流 使用timm加载CNN进行图像分类 调整CNN使之更适合你的任务 问 使用timm搭建一个可以使用的CNN或ViT拢共需要几步 答 4步 0 安装 timm 1 import timm 2 创建model 3 运行model 这一节很
  • 二叉搜索树(树状数组)

    计数函数 程序 int lowbit int k return k k 功能 可视为每个节点的编号函数 加和函数 程序 int sum int x int ret 0 while x gt 0 ret c x x lowbit x retu
  • jmeter提取token后只能使用一次的鬼问题

    今天在测试一个内部接口时 需要先登录传入token 按照正常步骤作对应参数化和参数传递 过程略 提取token的方法有很多 这里我是用的是正则表达式 提了就正常用嘛 可发现不管下边添加了多少请求 同一线程组下 永远只有登录请求的下一个可以获
  • linux常用函数和知识点博文合集

    signal SIGCHLD SIG IGN 和signal SIGPIPE SIG IGN 中断产生EINTR错误 linux中sigaction函数详解 标准I O函数库提供了popen函数 它启动另外一个进程去执行一个shell命令行
  • 2023秋招算法题每日学习(4)

    DAY 4 1 AcWing 850 Dijkstra求最短路 ii 考察点 堆优化Dijkstra 求最短路问题 适合于稀疏图 利用邻接表来存储 邻接表不需要对重边做特殊的处理 1 基础知识 时间复杂度分析 堆优化Dijkstra 堆优化
  • JUST技术:利用迁移学习生成新城市的轨迹

    市民的出行轨迹数据无论是对于城市管理 规划 还是商业活动 都是重要的参考信息 然而 获取一个城市的人群轨迹数据却非常困难 在今年4月份召开的国际顶级互联网会议WWW 2020 CCF A类 上 京东城市报告了被会议收录的论文 What is
  • 解决安装强化学习库gymnasium,box2d安装报错的问题

    gymnasium是强化学习的库 比较难安装 一 安装方法 安装Gymnasium 一定要all 这样可以安装所有依赖 pip install gymnasium all pip install gymnasium all 二 报错信息一
  • Docker安装记录

    1 卸载旧版本 yum remove docker docker client docker client latest docker common docker latest docker latest logrotate docker
  • Git版本控制

    Git 版本控制 什么是版本控制 版本控制是一种开发的过程中用于管理我们对文件 目录或工程等内容的修改历史 方便查看更改历史记录 备份以便恢复以前的版本的软件工程技术 实现跨区域多人协同开发 追踪和机载一个或者多个文件的历史记录 组织和保护
  • 成功解决VMware安装操作系统出现分辨率的问题

    文章目录 问题重现 问题原因 问题解决 方法一 拓展 1 电脑分辨率 2 xrandr命令 3 查询后如果没有合适的分辨率解决方案 参考资料 问题重现 如下图 在VMware16上安装ubuntu操作系统的时候 出现分辨率问题 导致底部的按
  • < 面试知识点:什么是 Node.js ?有哪些优缺点?应用场景? >

    文章目录 一 什么是 Node js 二 Node js 有哪些优缺点 三 Node js 能做什么 四 Node js 的 模块系统 五 Node js 应用场景 参考文献 往期内容 一 什么是 Node js Node js 是一个开源
  • 微信小程序如何获取微信昵称和头像

  • MySQL 高可用:mysql+mycat实现数据库分片(分库分表)

    什么是MYCAT 一个彻底开源的 面向企业应用开发的大数据库集群 支持事务 ACID 可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库 用来替代昂贵的Oracle集群 一个融合内存缓存技术 NoSQL技术 HDFS