海量数据存储与查询 MyCat(未完成)(一)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 海量数据存储与查询 MyCat(未完成)(一)

一、MyCat概述

1.1 什么是Mycat

Mycat是数据库中间件,所谓中间件数据库中间件是连接Java应用程序和数据库中间的软件。

1.2 为什么要用Mycat

      我们现在普遍的Java应用程序都是直接连接了MySQL软件进行读写操作,也就是我们在Java中的配置文件等定义了mysql的数据源,直接连接到了我们的mysql软件,但是当某些情况下我们可能需要用到了多个数据库,这个时候我们可能就需要配多个数据源去连接我们的多个数据库,这个时候我们进行sql操作的时候就会很麻烦,因为Java与数据库有了一个紧密的耦合度,但是如果我们在Java应用程序与mysql中间使用了mycat,我们只需要访问mycat就可以了,至于数据源等问题,mycat会直接帮我们搞定。

       再来说一下高访问量高并发,我们都知道mysql数据库实际上在数据查询上是有一个瓶颈的,当我们的数据太多的时候,已经互联网上有高并发的请求的时候,这个时候对我们mysql的压力是非常大的,当访问量一大,就可能会出现查不出数据,响应的时间太长等,这个时候我们可能需要有多个服务器对数据库进行读写分离,以及对数据库进行集群,这个时候我们的sql语句要进行分类,哪个sql语句要访问哪个数据库,这个时候只要交给mycat就可以了。

遇到问题:

  • Java与数据库的紧耦合
  • 高访问量高并发对数据库的压力
  • 读写请求数据不一致

1.3 Mycat与其他数据库中间件的区别

目前的数据库中间件有很多,并从各个维度将其与 Mycat进行对比。

Mycat优势

性能可靠稳定

基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用 案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。

强大的技术团队

MyCat现在由一支强大的技术团队维护 , 吸引和聚集了一大批业内大数据和云计算方面的资深工程师、架构师、DBA,优秀的团队保障了MyCat的稳定高效运行。而且MyCat不依托于任何商业公司,而 且得到大批开源爱好者的支持。

体系完善

MyCat已经形成了一系列的周边产品,比较有名的是 Mycat-web、Mycat-NIO、Mycat-Balance 等,已经形成了一个比较完整的解决方案,而不仅仅是一个中间件。

1.4 应用场景

Mycat还形成了一系列周边产品,比较有名的是 Mycat-web、Mycat-NIO、Mycat-Balance等,已成为一个比较完整的数据处理解决方案,而不仅仅是中间件。

高可用性与MySQL读写分离

  • 高可用:利用MyCat可以轻松实现热备份,当一台服务器停机时,可以由集群中的另一台服务器自动接 管业务,无需人工干预,从而保证高可用。
  • 读写分离:通过MySQL数据库的binlog日志完成主从复制,并可以通过MyCat轻松实现读写分离,实 现insert、update、delete走主库,而在select时走从库,从而缓解单台服务器的访问压力。

注意:

Mycat 的读写分离及自动切换都依赖于数据库产品的主从数据同步功能。主从复制不是mycat的功能,是mysql自己的功能。

百亿大表水平分表、集群并行计算

数据切分是Mycat的核心功能,是指通过某种特定的条件,将存放在同一个数据库中的数据分散存放在多个数据库(主机)中,以达到分散单台设备负载的效果。

数据切分有两种切分模式

  • 按照不同的表将数据切分到不同的数据库中,这种切分可以叫作数据的垂直切分。
  • 根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多个数据库中,这种切分叫作数据的水平切分。当数据量超过800万行且需要做分片时,可以利用Mycat实现数据切分。

数据库路由器

Mycat基于MySQL 实例的连接池复用机制,可以让每个应用最大程度地共享一个MySQL实例的所有连接池,让数据库的并发访问能力大大提升。

整合多种数据源

当一个项目需要用到多种数据源如Oracle、MySQL、SQL Server、PostgreSQL时,可以利用Mycat进行整合,只需访问Mycat 这一个数据源就行。

1.5 核心概念

分片

简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库 (主机)上面,以达到分散单台设备负载的效果。 数据的切分(Sharding)根据其切分规则的类 型,可以分为两种切分模式。 1). 一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切分可以称之为 数据的垂直(纵向)切分。

逻辑库schema

业务开发人员通常在实际应用中并不需要知道中间件的存在,只需要关注数据库,所以数据库中间件可以被当作一个或多个数据库集群构成的逻辑库。

注意:

逻辑库,与MySQL中的Database(数据库)对应,⼀个逻辑库中定义了所包括的Table。

逻辑表table

既然有逻辑库,就会有逻辑表。在分布式数据库中,对于应用来说,读写数据的表就是逻辑表。逻辑表可以分布在一个或多个分片库中,也可以不分片。

注意:

Table:表,即物理数据库中存储的某⼀张表,与传统数据库不同,这⾥的表格需要声明其所存储的逻辑数据节点DataNode。

分片节点 DataNode

逻辑概念,将数据切分后,每个分片节点不一定会独占一台机器,同一台机器上可以有多个分片数据库,这样一个或多个分片节点所在的机器就是节点主机。为了规避单节点主机并发数量的限制,尽量将读写压力高的分片节点均匀地放在不同的节点主机上。

DN1、DN2、DN3分别是MySQL的连接实例

数据库主机(节点主机)DataHost

数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。

分片规则

用户

MyCat的用户(类似于MySQL的用户,支持多用户)

1.6 Mycat原理

Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL 语句。

流程:

首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离 分析、缓存分析等,然后将此 SQL 发 往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

  1. 解析SQL语句涉及的表。
  2. 查看表的定义,如果表存在分片规则,则获取SQL语句的分片字段。
  3. 将SQL语句发送到相应的分片去执行。
  4. 最后处理所有分片返回的数据并返回给客户端。

二、Mycat部署安装

2.1 MySQL主从复制概述

为什么要主从复制

MySQL是现在普遍使用的数据库,但是如果宕机了必然会造成数据丢失。为了保证MySQL数据库的可靠性。就要会一些提高可靠性的技术,即主从复制。

如何解决性能问题

生活中有很形象的例子,比如你在自助咖啡厅买咖啡(如果只有一台咖啡机)

如果有多台咖啡机,很明显大家买咖啡的效率就上去了:

MySQL主从复制原理

主从复制的原理则是采用binlog文件进行复制,我们都知道MySQL的数据库会产生一个二进制日志,就是binlog,该日志文件记录了数据的任何修改(增删改),所以我们的从机Slave会启动一个Thread从主机读取二进制的binlog日志到本机的I/O thread中,然后写入一个Relay log文件中,从机开启一个SQL thread 定时检查Realy log 文件,如果发现有更新立即把更新的内容在本地的数据库上执行。

biglog 日志的三种格式

  • Statement:每一条会修改数据的sql语句都会记录在binlog中
  • Row: 仅保存哪条记录被修改
  • Mixed: 以上两种的混合使用,一般的语句修改用statement,全表更新使用Row,但是无法使用@@host name。

查看二进制日志位置

查看二进制日志格式

mysql> show variables like '%format%';

查看当前使用的二进制日志文件

mysql> show master status;

2.2 Linux上搭建MySQL主从复制_安装日志带时间

环境准备

准备两台mysql服务器分别为master和slave

#下载mysql8的YUM源
wget  http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
#安装MySQL的YUM源库
rpm -ivh mysql57-community-release-el7-10.noarch.rpm
#安装MySQL
yum -y install mysql-community-server
#启动MySQL
[root@localhost /]# systemctl restart mysqld
#日志文件中找出密码
grep "password" /var/log/mysqld.log
#登录MySQL
mysql -uroot -p
#修改密码策略
set global validate_password_policy=0;
set global validate_password_policy=LOW;
set global validate_password_length=6;
#修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
#开启远程连接
use mysql;
update user set host ="%" where user = "root";
#刷新配置信息
flush privileges;

开启主节点和从节点的bin-log日志

#进入主节点配置文件
vim /etc/my.cnf
#配置主节点的id,不重复即可
server-id=1
#启用二进制日志
log-bin=mysql-bin
#进入从节点配置文件
vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
log-bin=mysql-bin

重启两台服务器的mysql

systemctl restart mysqld.service

在主节点服务器上建立帐户并授权slave

#修改密码策略
set global validate_password_policy=0;
set global validate_password_policy=LOW;
set global validate_password_length=6;
#授权
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456';

注意:

一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

查询Master的状态

mysql>show master status;

注意:

执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化。

从服务器Slave中配置主节点的信息

mysql>change master to master_host='192.168.66.100',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=430;

启动从服务器复制功能

mysql>start slave;

检查从服务器复制功能状态

mysql> show slave status \G;

注意:

Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。看看防火墙是否关闭。

主从服务器测试

主服务器Mysql,建立数据库,并在这个库中建表插入一条数据

#主节点创建数据库
mysql> create database hi_db;
#选择该数据库
mysql> use hi_db;
#创建表
create table hi_tb(id int(3),name char(10));
#插入数据
insert into hi_tb values(001,'zj');

从服务器Mysql查询

mysql>show databases;
mysql>use hi_db
mysql>select * from hi_tb;

2.3 基于Docker搭建MySQL主从复制

首先拉取Docker镜像

docker pull mysql:5.7

启动两个容器

#启动Master
docker run -p 3350:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
#启动Slave
docker run -p 3340:3306 --name slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

注意:

  • --name:为容器指定名称,这里是master
  • -p:将容器的指定端口映射到主机的指定端口,这里是将容器的3306端口映射到主机的3306端口
  • -e:设置环境变量,这里是指定root账号的密码为root
  • -d:后台运行容器,并返回容器ID

查看已经创建好的docker容器

docker ps

注意:

是UP状态,表示正在运行中。

进入docker容器

#进入master容器
[root@localhost /]# docker exec -it master /bin/bash
#进入slave容器
[root@localhost /]# docker exec -it slave /bin/bash

在xshell中可以复制会话来分别操作matser和slave较为方便。

安装vim

注意:

vi my.cnf对my.cnf进行编辑。此时会报出bash: vi: command not found,需要我们在docker容器内部自行安装vim。使用apt-get install vim命令安装vim

如果报错:

Reading package lists... Done Building dependency tree

Reading state information... Done E: Unable to locate package vim

更新apt-get

apt-get update

安装vim

apt-get install vim

进入master容器

#进入配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
#在配置文件的外面的[mysqld]后面添加如下配置
# 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
## 同一局域网内注意要唯一
server-id=100

注意:slave容器也是相同的操作,只是server-id变了。配置完成后也需要重启mysql服务和docker容器,操作和配置Master(主)一致。

重启mysql服务

#重启MySQL服务
service mysql restart
#启动master容器
docker start master
#启动slave容器
docker start slave

在Master数据库创建数据同步用户slave

#进入master容器
[root@localhost /]# docker exec -it master  /bin/bash
#进入mysql
root@b8974d3aa0f2:/# mysql -uroot -p123456
#创建slave账户
mysql>  GRANT replication SLAVE ON *.* TO 'slave' @'%' IDENTIFIED BY '123456';

连接接Master(主)和Slave(从)

在Master进入mysql

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      438 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

在Slave 中进入 mysql 配置主节点的信息

mysql>change master to master_host='172.17.0.3',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=438;

参数:

  • master_host: Master 的IP地址(可以先退出容器使用docker inspect master查看master节点的IPAddress)
  • master_user: 在 Master 中授权的用于数据同步的用户
  • master_password: 同步数据的用户的密码
  • master_port: Master 的数据库的端口号
  • master_log_file: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
  • master_log_pos: 从哪个 Position 开始读,即上文中提到的 Position 字段的值
  • master_connect_retry: 当重新建立主从连接时,如果连接失败,重试的时间间隔,单位是秒,默认是60秒。

在Slave中开启主从复制

mysql> start slave;

在 Slave 的 MySQL 终端执行查看主从同步状态

mysql> show slave status \G;

2.4 Mycat安装以及管理命令详解

下载解压Mycat安装包

MyCAT 有提供编译好的安装包,支持 windows、Linux、Mac、Solaris 等系统上安装与运行。

下载地址: Index of /1.6.7.6/20201104174609/ (mycat.org.cn)

tar -zxvf  Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz -C /usr/local

将MyCat配置到环境变量中

#进入环境变量
vim /etc/profile
#添加如下配置
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
#使环境变量生效
source /etc/profile

注意,mycat是Java语言编写的因此需要jdk环境。配置完环境变量后相关命令可以直接执行不需要到特定的文件夹下执行。

MyCat常用操作命令

mycat start      #启动MyCat
mycat stop       #停止MyCat
mycat console     #前台运行MyCat带控制台输出
mycat restart     #重启MyCat
mycat pause      #暂停MyCat
mycat status      #查看启动状态

使用MySQL命令进行MyCat的连接

Mycat 提供类似数据库的管理监控方式,可以通过MySQL命令行登录管理端口(9066)执行相应的SQL语句进行管理,也可以通过JDBC方式进行远程连接管理。

管理端口

9066用于查看MyCat的运行状态

mysql -uroot -p123456 -h 192.168.1.125 -P9066 -DTESTDB

参数:

  • -h:后面是主机。 即当前Mycat安装的主机IP地址。
  • -u:Mycat server.xml中配置逻辑库的用户。
  • -p:Mycat server.xml中配置逻辑库的密码。不是MySQL的用户名和密码
  • -P:后面是管理端口号。注意P是大写。
  • -d:Mycat server.xml中配置逻辑库。

数据端口

8066用于进行数据的CRUD操作

mysql -uroot -p123456 -h 192.168.1.125 -P8066 -DTESTDB

MyCat的连接用户名相关信息在配置文件/usr/local/mycat/conf/server.xml中查看编辑

<user name="root">
    <property name="password">123456</property>
    <property name="schemas">TESTDB</property>
</user>

Show命令

-- 查看所有的可用命令
show @@help; 
-- 查看所有的逻辑数据库
show @@database;
-- 查看所有的数据节点
show @@datanode;
-- 查看所有的数据源
show @@datasource;

2.5 Mycat目录和配置文件

目录结构

说明:

  • bin:可执行命令
  • conf:配置文件
  • lib:存放jar包
  • logs:日志信息
  • tmlogs:临时日志
  • version.txt:版本信息

三个配置文件

  • schema.xml:定义逻辑库,表、分片节点等内容
  • rule.xml:定义分片规则
  • server.xml:定义用户以及系统相关变量,如端口等


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9月前
|
存储 关系型数据库 MySQL
海量数据存储与查询 MyCat(未完成)(二)
海量数据存储与查询 MyCat(未完成)(二)
|
2天前
|
分布式计算 Java 关系型数据库
|
4月前
|
存储 NoSQL 数据挖掘
请解释一下列存储数据库的工作原理,并提供一个使用列存储数据库的实际应用场景。
请解释一下列存储数据库的工作原理,并提供一个使用列存储数据库的实际应用场景。
57 0
|
5月前
|
存储 关系型数据库 MySQL
史上最全MySQL剖析:优化+存储+查询+索引+复制+可扩展+高可用
在互联网行业,MySQL数据库毫无疑问已经是最常用的数据库,LAMP (Linux +Apache + MySQL + PHP)甚至已经成为专有名词,也是很多中小网站建站的首选技术架构。
|
10月前
|
数据库 UED 索引
索引创建原则:提升数据库性能与查询效率的关键
在现代软件系统中,数据库是一个关键的组成部分,而索引作为提高数据库性能和查询效率的重要手段之一,其设计和创建的合理性直接影响着整个系统的稳定性和响应速度。本文将介绍索引的基本概念和原则,并详细探讨索引创建的几个关键原则,帮助读者了解如何为数据库中的表创建最优的索引,以提升系统性能。
104 0
|
9月前
|
存储 SQL 算法
海量数据存储与查询 MyCat(未完成)(三)
海量数据存储与查询 MyCat(未完成)(三)
|
10月前
|
SQL 关系型数据库 MySQL
【项目实现典型案例】12.数据库数据类型不一致导致查询慢
【项目实现典型案例】12.数据库数据类型不一致导致查询慢
|
缓存 监控 关系型数据库
MySql缓存查询原理与缓存监控 And 索引监控
MySql缓存查询原理与缓存监控 And 索引监控
128 0
|
存储 SQL 关系型数据库
如何用Mysql的储存过程,新增100W条数据
存储过程的英文是 Stored Procedure,它的思想很简单,就是 SQL 语句的封装; 一旦存储过程被创建出来,使用它就像使用函数一样简单;
190 0
|
数据库
LeetCode(数据库)- 求关注者的数量
LeetCode(数据库)- 求关注者的数量
82 0