一、前言

小编最近公司有个新的需求,数据量比较大,要涉及到分库分表。大概了解了一些主流的中间件,使用和网上资料比较多的是Mycatsharding-jdbc,小编比较倾向于Mycat。原因很简单就是参考的资料比较多,教学比较多,小编经过一天的尝试,终于完成了!这篇主要是实战,一些知识点请自行百度,小编也是没有了解太多,最主要的目的是看一下效果!网上全使用Docker还是不多,而且很迷糊,小编进行补充,让大家少走弯路!!

写在前面:

本次简单的进行分库分表测试,测试分片规则是mod-long,简单的根据id取余分组,实际业务肯定不符合,大家根据业务进行具体规则!!小编的场景是水平的拆分哈,如果不符合你的可以看看使用Docker安装,然后再修改分片策略即可!

小编大部分的命令都是来自于两位大佬的,后面给出链接,大家可以去看一下哈!不过他们省略了一些,我给补充上,能够顺畅的走下去流程!!

二、安装docker网络

因为我们的Mycat和Mysql都是使用docker安装的,容器和容器之间是相互隔离的,这时候需要用到docker网络帮助我们进行两个容器之间的通信!

 docker network create -d bridge --ip-range=192.168.1.0/24 --gateway=192.168.1.1
--subnet=192.168.1.0/24 bridge2

这是用的大佬的创建命令,可以去原文看看:原文地址

我们把Mycat和Mysql都是创建出来在进行统一的测试。

三、安装Mycat

1. 创建新目录并解压Mycat

创建一个存放压缩包的命令

mkdir /usr/local/docker

准备好压缩包

链接:百度云地址

提取码:2n1u

tar -zxvf mycat.tar.gz

2. 复制到docker挂载创建目录

cp -r /usr/local/docker/mycat/conf/ /usr/local/mycat/conf/
cp -r /usr/local/docker/mycat/logs/ /usr/local/mycat/logs/

3. 赋予最高权限

chmod 777 /usr/local/mycat/logs
chmod 777 /usr/local/mycat/conf

4. 创建dockerfile文件

touch Dockerfile
vi Dockerfile

5. Dockerfile内容

FROM openjdk:8
ADD mycat.tar.gz /usr/local/
VOLUME /usr/local/mycat/conf
ENV MYCAT_HOME=/usr/local/mycat
EXPOSE 8066 9066
CMD ["/usr/local/mycat/bin/mycat", "console","&"]





6. 构建Mycat镜像

docker build -t mycat .



7. 运行Mycat镜像

docker run --name mycat -p 8066:8066 -p 9066:9066 -v /usr/local/mycat/conf/:/usr/local/mycat/conf -v /usr/local/mycat/logs:/usr/local/mycat/logs -d --network=bridge2 --ip=192.168.1.8  mycat

四、创建Mysql容器

1. 创建容器内在本地的挂载文件夹

mkdir -p /usr/local/mysql/data /usr/local/mysql/logs /usr/local/mysql/conf
# 给予权限省略了哈

2. 初始化mysql的配置文件*.cnf

touch /usr/local/mysql/conf/my.cnf

3. 启动镜像

docker run -p 3306:3306 --name mysql -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/logs:/var/log/mysql -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d --network=bridge2 --ip=192.168.1.9 mysql:5.7

4. 本地测试连接



5. 新建三个数据库及其表

# 新建三个库
CREATE DATABASE IF NOT EXISTS db1 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
CREATE DATABASE IF NOT EXISTS db2 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
CREATE DATABASE IF NOT EXISTS db3 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
# 每个库下面新建一个表
drop table test_table;
CREATE TABLE `test_table` (
`id` int(6) NOT NULL,
`name` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

五、Mycat和Mysql互ping

1. 进入Mycat容器内部

docker exec -it 256 /bin/bash

2. 更新apt-get

apt-get update

3. 下载Ping命令

apt-get install iputils-ping

输入y即可

4. 互ping成功

ping 192.168.1.8



5. 退出容器,以后台形式运行

Ctrl + P + Q

六、修改Mycat配置文件

1. 重要配置

mycat主要的应该就是配置文件的配置了,主要以下三个需要熟悉。

server.xml是Mycat服务器参数调整和用户授权的配置文件

schema.xml是逻辑库定义和表以及分片定义的配置文件

rule.xml是分片规则的配置文件

2. 修改schema.xml

注意mysql的ip地址写你的docker网络指定的ip

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="test_table" dataNode="dn1,dn2,dn3" rule="mod-long" autoIncrement="true" primaryKey="id"/>
</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>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.1.9:3306" user="root"
password="root">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="192.168.1.9:3306" user="root" password="root" />
</writeHost>
</dataHost> </mycat:schema>

其他的我们按照默认的

3. 重新启动Mycat

4. 本地测试连接

密码:123456(默认)



5. 新增一个表

drop table test_table;
CREATE TABLE `test_table` (
`id` int(6) NOT NULL,
`name` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

七、测试

1. 我们在Mycat上添加9条数据

INSERT INTO test_table(id, name) VALUES (1, '测试1');
INSERT INTO test_table(id, name) VALUES (2, '测试2');
INSERT INTO test_table(id, name) VALUES (3, '测试3');
INSERT INTO test_table(id, name) VALUES (4, '测试4');
INSERT INTO test_table(id, name) VALUES (5, '测试5');
INSERT INTO test_table(id, name) VALUES (6, '测试6');
INSERT INTO test_table(id, name) VALUES (7, '测试7');
INSERT INTO test_table(id, name) VALUES (8, '测试8');
INSERT INTO test_table(id, name) VALUES (9, '测试9');

2. 查询各个库上的数据



八、总结

经过一天的测试和放弃,最终完成了测试,主要是忘记了docker容器之间不能直接通信,卡了半天,还是要感谢两位大佬的文章,让我顺利完成!如果对你有帮助,一键三连走起来哈!谢谢大家!!

docker网络解决参考

mycat测试主流程参考


有缘人才可以看得到的哦!!!

点击访问!小编自己的网站,里面也是有很多好的文章哦!

Docker安装Mycat和Mysql进行水平分库分表实战【图文教学】的更多相关文章

  1. Mycat安装并实现mysql读写分离,分库分表

    Mycat安装并实现mysql读写分离,分库分表 一.安装Mycat 1.1 创建文件夹 1.2 下载 二.mycat具体配置 2.1 server.xml 2.2 schema.xml 2.3 se ...

  2. Docker安装Mycat并实现mysql读写分离,分库分表

    Docker安装Mycat并实现mysql读写分离,分库分表 一.拉取mycat镜像 二.准备挂载的配置文件 2.1 创建文件夹并添加配置文件 2.1.1 server.xml 2.1.2 serve ...

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

    本文引用于http://blog.csdn.net/kk185800961/article/details/51147029 MySQL 高可用:mysql+mycat实现数据库分片(分库分表) 什么 ...

  4. Docker安装MongoDB、MySQL、Jenkins、Gitlab、Nginx

    Docker安装MongoDB.MySQL.Jenkins.Gitlab.Nginx 安装MongoDB 1. 拉取镜像 $ sudo docker pull mongo 2. 运行镜像 $ sudo ...

  5. Mysql中的分库分表

    mysql中的分库分表分库:减少并发问题分表:降低了分布式事务分表 1.垂直分表 把其中的不常用的基础信息提取出来,放到一个表中通过id进行关联.降低表的大小来控制性能,但是这种方式没有解决高数据量带 ...

  6. MySQL纯透明的分库分表技术还没有

    MySQL纯透明的分库分表技术还没有  种树人./oneproxy --proxy-address=:3307 --admin-username=admin --admin-password=D033 ...

  7. mycat+ mysql集群 分库分表

    mycat介绍Mycat数据库分库分表中间件国内最活跃的.性能最好的开源数据库中间件!Mycat关键特性关键特性支持SQL92标准支持MySQL.Oracle.DB2.SQL Server.Postg ...

  8. mycat操作mysql示例之分库

    准备工作: 服务器192.168.96.12,centos7, jdk,mysql5.7,mycat1.6.x,navicat 搭建步骤: 1.在服务器192.168.96.12服务器上安装mysql ...

  9. Docker 安装并使用mysql

    上一篇介绍了Docker在CentOS中的安装,本文介绍如何在Docker中安装并使用mysql 1.拉取最新的mysql镜像 [root]# docker pull mysql 2.查看已有镜像 [ ...

随机推荐

  1. ES6-11学习笔记--箭头函数

    1.this指向定义时所在的对象,而不是调用时所在的对象 2.不可以当做构造函数 3.不可以使用arguments对象   ES5中定义函数的两种方式: function fn1() { consol ...

  2. location中的各个属性

    http://172.16.20.218:8080/m/MGU20201126001-001/index.html?username=admin&password=123#/write   浏 ...

  3. c++对c的拓展_内联函数

    目的:保持处理宏的高效及安全性 解决的问题:1.c中预处理宏有些难以发现的问题 2.c++ 中预处理不能访问类成员,不能作用类的成员函数 作用:无函数调用时开销,又可像普通函数般进行参数.返回值类型安 ...

  4. c++对c的拓展_指针的引用

    套用引用公式:Type & ref =val; 假设:type 类型为int * 由公式得 int * & ref = val; // int * *const ref=&va ...

  5. spring原始注解(value)-03

    本博客依据是是spring原始注解-02的代码 注入普通数据类型:@Value注解的使用 1.添加driver属性,使用value注解 @Service("userService" ...

  6. ansble通过脚本定时清理k8s日志

    环境:环境k8s1.17,ansble通过脚本定时清理k8s日志 [root@tidb-21 delete-k8s-logs]# lsansib-delete.sh delete-logs.sh [r ...

  7. [已解决] npm ERR! code EINVALIDPACKAGENAME Invalid package name "": name cannot start with an underscore;

    打开 cmd 输入 `npm update -g` 等待更新完成即可

  8. JavaScript学习总结6-apply

    JS中的apply方法可以控制this指向 任何JS支持的类型都可以转化为JSON JS对象是键值对型的,JSON是字符串型的 原型对象:__proto__ JS万物皆对象,ES6开始提供了对后端开发 ...

  9. Elasticsearch上手指南

    目录 ElasticStack及Elasticsearch介绍 Elasticsearch安装 Elasticsearch入门 Elasticsearch配置 Elasticsearch REST A ...

  10. 【Vue3+Express实战】项目开发环境搭建

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...