JAVA 中间件之 Mycat2

Mycat2应用与实战教程

1.Mycat2概述

1.1 什么是MyCat

官网: http://mycatone.top/

Mycat 是基于 java 语言编写的数据库中间件,是一个实现了 MySQL 协议的服务器,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分库分表和读写分离,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。

MyCat 是基于阿里开源的 Cobar 产品而研发,Cobar 的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得 MyCat 变得非常的强大。

image.png

Mycat对于我们Java程序员来说,就是一个近似等于 MySQL 的数据库服务器,你可以用连接 MySQL 的方式去连接 Mycat(除了端口不同,默认的Mycat 端口是 8066 而非MySQL 的 3306,因此需要在连接字符串上增加端口信息)。

1.2 Mycat的作用

1.2.1 数据分片

数据分片包括里:垂直分片和水平分片,垂直分片包括:垂直分库和垂直分表,水平分片包括: 水平分库和水平分表。

1)垂直分库

  • 数据库中不同的表对应着不同的业务,垂直切分是指按照业务的不同将表进行分类,分布到不同的数据库上面
  • 将数据库部署在不同服务器上,从而达到多个服务器共同分摊压力的效果

image.png

2)垂直分表

表中字段太多且包含大字段的时候,在查询时对数据库的IO、内存会受到影响,同时更新数据时,产生的binlog文件会很大,MySQL在主从同步时也会有延迟的风险。

  • 将一个表按照字段分成多表,每个表存储其中一部分字段。
  • 对职位表进行垂直拆分, 将职位基本信息放在一张表, 将职位描述信息存放在另一张表

image.png

œ垂直拆分带来的一些提升

  • 解决业务层面的耦合,业务清晰
  • 能对不同业务的数据进行分级管理、维护、监控、扩展等
  • 高并发场景下,垂直分库一定程度的提高访问性能
  • 垂直拆分没有彻底解决单表数据量过大的问题

3) 水平分库

  • 将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈.

    image.png

    简单讲就是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面, 例如将订单表 按照id是奇数还是偶数, 分别存储在不同的库中。

4) 水平分表

  • 针对数据量巨大的单张表(比如订单表),按照规则把一张表的数据切分到多张表里面去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。

    image.png

总结

  • 垂直分表: 将一个表按照字段分成多表,每个表存储其中一部分字段。
  • 垂直分库: 根据表的业务不同,分别存放在不同的库中,这些库分别部署在不同的服务器.
  • 水平分库: 把一张表的数据按照一定规则,分配到不同的数据库,每一个库只有这张表的部分数据.
  • 水平分表: 把一张表的数据按照一定规则,分配到同一个数据库的多张表中,每个表只有这个表的部分数据.

1.2.2 读写分离

读写分离指的是:主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。

注意: 读写分离的数据节点中的数据内容是一致,所以要先搭建主从复制架构

image.png

1.2.3 多数据源整合

Java工程里需要同时控制(连接)多个数据源:

  1. 业务需要。比如项目里要实现两个DB的双写/数据迁移,或者微服务边界划分不清使得一个工程直连了多个DB。
  2. 读写分离。大型一点的网站,为了提升DB的吞吐量和性能以及高可用性,数据库一般都会采用集群部署(1个Master+N个Slave模式)。
  3. NoSQL数据库。使用NOSQL数据库存储大量的一次性非业务数据,比如日志类的数据

image.png

1.3 Mycat与ShardingJDBC的区别

  1. mycat是一个中间件的第三方应用,sharding-jdbc是一个jar包
  2. 使用mycat时不需要修改代码,而使用sharding-jdbc时需要修改代码
  3. Mycat 是基于 Proxy,它复写了 MySQL 协议,将 Mycat Server 伪装成一个 MySQL 数据库,而 Sharding-JDBC 是基于 JDBC 的扩展,是以 jar 包的形式提供轻量级服务的。
  • Mycat(proxy中间件层)

    image.png

  • Sharding-jdbc(应用层):

    image.png

1.4 Mycat2新特性

Mycat2的提升:

image.png

新特性总结

  • 多语句,指的是可以批量执行建表语句
  • 支持blob,blob二进制大对象
  • 全局二级索引,用全局二级索引后,能有效减少全表扫描,对于减少连接使用,减少计算节点与存储节点的数据传输有帮助.
  • 支持任意跨库跨表join查询
  • 支持跨库跨表的关联子查询
  • 支持分库同时分表,把分库分表合一,统一规划
  • 存储过程: 存储过程支持多结果集返回、支持接收affectRow
  • 支持逻辑视图
  • 支持批量插入: 支持rewriteInsertBatchedStatementBatch参数(设置为true),用于提高批量插入性能。
  • 支持执行计划管理:Mycat2的执行计划管理主要作用是管理执行计划,加快SQL到执行计划的转换。
  • 路由注释,Mycat2对于路由注释的支持更加快捷方便,减少繁琐的配置
  • 自动hash分片算法: 由1.6版本的手动配置算法,到2.0的自动hash分
  • 支持第三方工具
  • 单表映射物理表,可以直接将单表映射到物理表,更快速的创建数据库表
  • XA事务,首先数据库要支持XA事务
  • 支持MySQL8

2.环境准备

2.1 准备测试环境

1)搭建两台虚拟机,分别部署MySQL和Mycat2

  • 192.168.58.100服务器上的MySQL要部署到docker中,方便后面我们快速搭建MySQL集群, 并且MySQL的版本使用MySQL8。
  • 192.168.58.200服务器,安装Mycat2之前要安装JDK,并且必须选择JDK1.8 避免出现其他问题。

image.png

2.2 Docker基本使用

1)安装docker

# 1、yum 包更新到最新 
yum update

# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 
yum install -y yum-utils device-mapper-persistent-data lvm2

# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 4、 安装docker,出现输入的界面都按 y 
yum install -y docker-ce

# 5、 查看docker版本,验证是否验证成功
docker -v

2)镜像加速方案

默认情况,将从docker hub(https://hub.docker.com/)下载docker镜像太慢,一般都会配置镜像加速器;

建议配置阿里云镜像加速,编辑该文件:

vim /etc/docker/daemon.json  

在该文件中输入如下内容:

{
  "registry-mirrors": ["https://3ad96kxd.mirror.aliyuncs.com"]
}

配置完成记得刷新配置

sudo systemctl daemon-reload
sudo systemctl restart docker

3)镜像相关命令

  • 查看镜像 docker images
  • 搜索镜像 docker search imageName
  • 拉取镜像 docker pull imageName:version
  • 删除镜像 docker rmi imageId rmi–>remove Image

4)查看容器

查看正在运行的容器

docker ps

查看所有容器(查看正在运行的和已经停止运行的)

docker ps –a
docker ps -all

查看最后一次运行的容器

docker ps –l

查看停止的容器

docker ps -f status=exited

5)创建容器命令

docker run 参数 镜像名称:镜像标签 /bin/bash

创建容器常用的参数说明:

-i:表示运行容器,如果不加该参数那么只是通过镜像创建容器,而不启动。

-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端(如果只加it两个参数,创建后就会自动进去容器)。
 
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
 
--name :为创建的容器命名。

-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射,例如:可以将Docker中Tomcat容器的8080端口映射到宿主机上的某一个端口8080,那么以后访问tomcat只需要:http://宿主机的IP:8080/

进入容器之后,初始化执行的命令:/bin/bash;可写可不写

6) 删除指定的容器,正在运行的容器无法删除

#删除容器
docker rm 容器名称(容器ID)
#删除镜像
docker rmi 镜像ID(镜像名称)

2.3 Docker部署单机MySQL

  1. 搜索mysql镜像
docker search mysql
  1. 拉取 mysql8 镜像
 docker pull mysql:8.0.29
  1. 使用docker方式创建MySQL服务器

**注意:**如果此时防火墙是开启的,则先关闭防火墙,并重启docker,否则后续安装的MySQL无法启动

#关闭docker
systemctl stop docker

#关闭防火墙
systemctl stop firewalld

#永久关闭
systemctl disable firewalld 

#启动docker
systemctl start docker

在docker中创建并启动MySQL服务器:端口3310

docker run -d \
-p 3310:3306 \
-v /msb/mysql/conf:/etc/mysql/conf.d \
-v /msb/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name msb-mysql \
mysql:8.0.29

参数说明:

  • -p 3310:3306:表示端口映射,前者是宿主机端口,后者是容器内的映射端口,将容器的 3306 端口映射到宿主机的 3310 端口。
  • -v /msb/mysql/conf:/etc/mysql/conf.d: 配置文件映射,前面是宿主机目录,后面是映射到宿主机上的文件,这样就可以在宿主机上做修改,然后共享到容器上
  • -v /msb/mysql/data:/var/lib/mysql :数据文件目录映射,避免容器出现问题,导致数据丢失。
  • -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
  • –name msb-mysql :容器名称
  • mysql:8.0.29 :镜像名称
  1. 进入容器,操作mysql
docker exec –it msb-mysql /bin/bash
  1. 使用Navicat连接容器中的mysql
    因为我们做了端口映射,所以连接的是192.168.58.100:3310

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/584945.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

灵魂面甲Soulmask免费加速器 灵魂面甲加速器

加入《灵魂面甲》,你将披上炫目的面甲盔甲,手执利刃神兵,运用你的独门技艺去征服这个世界。每一件面甲不仅是防护的象征,更赋予你不同的能力加成,炫酷非凡。无论你是热爱探索新世界的冒险家,是沉浸于作物栽…

线阵相机和面阵相机简介

线阵相机 线阵相机,顾名思义就是所探测的物体要在一个很长的界面上。线阵相机的传感器只有一行感光像素,所以线阵相机一般具有非常高的扫描频率和分辨率。 线阵相机特点 线阵相机使用的线扫描传感器通常只有一行感光单元(少数彩色线阵使用…

boa交叉编译(移植到arm)

参考:CentOS7 boa服务器的搭建和配置-CSDN博客 以下操作在宿主机/编译平台操作: 1. 先执行[参考]1到3、 4.2、4.3、4.4、4.5 2. 修改MakeFile # 由以下: CC gcc CPP gcc -E # 改为: CC arm-linux-gnueabihf-gcc CPP arm-l…

java线上问题排查之磁盘和网络查看分析(二)

一、磁盘&IO df -lh 查看磁盘使用情况 Filesystem:文件系统 Size:容量 Used:已用 Avail:可用 Use%:已用百分比 Mounted on:挂载点 二、网络 查看TCP连接情况 常见问题 tcp队列溢出 netstat -s |e…

java 远程debug

java -agentlib:jdwptransportdt_socket,servery,suspendn,address50050 -Xmx1536m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath./ -jar ${JAR_NAME} >/dev/null 2>&1 &参数说明 -agentlib:jdwptransportdt_socket,servery,suspendn,address50050: 这个参数…

Django-admin单例模式和懒加载

Django-admin单例模式和懒加载 单例模式 class Foo:def __init__(self):self.name "张三"def __new__(cls, *args, **kwargs):empty_object super().__new__(cls)return empty_objectobj1 Foo() obj2 Foo()当我们实例化对象时,就会在内存开一个空间…

深度干货 | 如何兼顾性能与可靠性?一文解析YashanDB主备高可用技术

2024【崖山论”见“】已强势回归!即日起,将不定期把 Meetup 中YashanDB 技术专家的精彩分享整理成文章,方便大家学习回顾。今天带来第一篇主备高可用技术文章。 背景 数据库高可用(High Availability,HA&#xff09…

使用 Docker 自建一款怀旧游戏之 - 扫雷

1)扫雷 简介 扫雷 是一种经典的单人电脑游戏,最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中。游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块,而不触发地雷。每个方块上都标有数字,表示周围 8 个方块中…

LeetCode55:跳跃游戏

题目描述 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 解题思想 每次…

深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作

码到三十五 : 个人主页 OceanBase与MySQL模式下兼容性序 在当今的大数据时代,数据库技术的选择对于企业的信息化发展至关重要。OceanBase作为一种高性能、高可用的分布式关系数据库,在与MySQL模式的兼容性方面展现出了显著的优势&#xff0c…

java语言开发的商城系统有哪些?

最近,有小伙伴问我有没有靠谱的java商城系统,经过我一顿扒拉,终于给大家整理出来了。 目前java语言开发的商城系统主要有shop、javashop、ejavashop、yuanfeng、mall4j、lilishop等。在没有深入了解这些系统前,我们可以从产品推出…

面包屑-文件夹

1.需求: 类似于 百度网盘、阿里云盘的 云文件夹管理功能 2.问题点 1.页面刷新 导致面包屑子级未持久化 2.浏览器的 前进、后退 ;面包屑未能 跳转到指定 子级 3.数据不同步问题 3.解决方法 1.后端提供 根据 id 查询面包屑 text 的 api【这里并没有…

【已解决】如何打开ZIP格式的压缩文件?

压缩文件格式的种类比较多,ZIP是最常见的压缩格式之一。那收到ZIP压缩文件,要如何打开呢?不清楚的小伙伴一起来看看吧! 方法一:使用系统自带的解压缩功能 很多电脑操作系统都内置了解压缩功能,并且支持大…

Matlab|含sop的33节点配电网优化

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序以IEEE33节点为例,分析含sop的配电网优化,包括sop有功约束、无功约束和容量约束,非线性部分通过转换为旋转锥约束进行编程,并且包括33节点配电网潮流及对应…

微信小程序个人中心、我的界面(示例四)

微信小程序个人中心、我的界面,九宫格简单布局(示例四) 微信小程序个人中心、我的界面,超简洁的九宫格界面布局,代码粘贴即用。更多微信小程序界面示例,请进入我的主页哦! 1、js代码 Page({…

《深入解析WIndows操作系统》第9章读书笔记

1、闪存类型:常见的闪存类型有NOR和NAND。NOR闪存在操作上最接近RAM,它的每个字节都可以被独立地寻址,而NAND闪存则被组织成以块为单位,就像磁盘一样。NOR类型的闪存用来设计保存计算机主板上的BIOS,而NAND类型的闪存被…

【哈希】Leetcode 217. 存在重复元素

题目讲解 217. 存在重复元素 算法讲解 使用set集合完成元素的存储,当我们将当前元素插入到集合单中,如果insert的返回值的pair.second等于false说明当前元素已经存在,反之元素在集合中存在 class Solution { public:bool containsDuplica…

【触摸案例-手势解锁案例-九宫格 Objective-C语言】

一、手势解锁案例,九宫格,我们先来分析一下怎么实现: 首先呢,我们先来运行一下, 这一块儿,上面的这九个东西,肯定是要有一个九宫格的一个算法的问题,然后呢,上边的这九个小圆圈儿,这是什么东西,Button,为什么是Button,因为可以点,是吗,就因为这个?实际上,你用…

UE5像素流部署以及多实例部署(兼容ue4)

像素流部署请看我之前的文章就行,今天讲的是多实例部署 在这里可以配置多实例的数量 如果设置800端口 设置两个实例 那么就是800 801端口 我的个人显卡是4060TI,最多开三个

kaggle之皮肤癌数据的深度学习测试

kaggle之皮肤癌数据的深度学习测试 近期一直在肝深度学习 很久之前,曾经上手搞过一段时间的深度学习,似乎是做轮胎花纹的识别,当初用的是TensorFlow,CPU版本的,但已经很长时间都没弄过了 现在因为各种原因&#xff…