高级篇:Mycat的理解

…衆ロ難τιáo~ 提交于 2020-02-11 17:15:36

目录

一、问题导入

1.1高并发Mysql的速度问题怎么解决?

Mysql的速度,最大基本上就千的级别, 2000/s ,那淘宝,jd 那么大的并发量怎么做的?

1.2Mysql 挂了怎么办?

我们现在是单机版本的Mysql ,Mysql 挂了怎么解决?

1.3 Mysql 超过500W的数据

二、Mycat 的简介

Mycat 是一个数据库的中间件!
在这里插入图片描述
在这里插入图片描述

Mycat 是我们中国人开发的!LeaderUs 提出的,LeaderUs 是武汉的人!

2.1 Mycat 解决Mysql 的并发压力的思路

2.1.1 分库

数据库的切分
在这里插入图片描述

2.1.2 分表

将一个大表分成好几个小表
在这里插入图片描述

2.1.3 好处或者面试

有500w条数据,怎么优化查询的速度?
1 添加索引->B+Tree ,查询速度和树的深度相关(以后面试讲)
500w 查询一个添加索引后,可能就是10s
2 分库分表
10s->5s
把一个表的数据分成2 个表,使用多线程同时查询!
5->2.5
一个表->4 个,使用4个线程同时查询

2.1.4 Mycat 额外的好处

最开始,Mysql 有容量的问题,Mysql 表里面只能存储500w 条数据,那现在的软件用户量都是亿级别的,那它的用户表怎么搞的?
在这里插入图片描述
好处就是通过分表解决了Mysql的容量问题

2.2 Mycat的安装

2.2.1 Mycat 是Java 语言写的,安装Mycat 必须先安装JDK

Mycat 对服务器有性能要求,必须为2G以上的内存!

  1. 新建文件夹
    Cd /usr/local
    Mkdir java
  2. 下载jdk的压缩包
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie"
 "https://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-linux-x64.tar.gz"

Wget: 下载命令,若你没有该命令:
yum -y install wget
在这里插入图片描述

  1. 解压JDK

tar -zxvf xxx.gz

  1. 配置环境变量

vi /etc/profile
在最后追加:
在这里插入图片描述
5 source 刷新文件
在这里插入图片描述

2.2.2 Mycat的安装

  1. 新建文件夹/usr/local
    在这里插入图片描述
  2. 下载Mycat的压缩包

地址:http://dl.mycat.io/1.6.6/Mycat-server-1.6.6.1-test-20180709095126-linux.tar.gz

wget http://dl.mycat.io/1.6.6/Mycat-server-1.6.6.1-test-20180709095126-linux.tar.gz
在这里插入图片描述
在这里插入图片描述

  1. 解压压缩包
    在这里插入图片描述

  2. 认识Mycat的目录

在这里插入图片描述

  1. 启动Mycat

./mycat start

./mycat start|stop|status|restart
在这里插入图片描述

  1. 查看Mycat 是否启动成功

1 ./mycat status
在这里插入图片描述

2: jps
在这里插入图片描述

  1. 查看启动的日志:
    在这里插入图片描述
    在这里插入图片描述
    我们发现Mycat 启动时,需要在它的目录的logs 文件夹里面写一个pid的文件,但是此时没有logs这个文件夹
    解决方案:新建logs文件夹
    在这里插入图片描述
    再次启动:
    在这里插入图片描述

  2. 尝试连接Mycat

可以使用SqlYog 来连接Mycat

Sqlyog的地址:http://forspeed.onlinedown.net/down/Webyog-SQLyog-Ultimate12.0.8.0.zip

Mycat 运行在8066 端口上面!
在这里插入图片描述
要确保8066 被放行:

在这里插入图片描述
在这里插入图片描述

三、Mycat的名词解释

3.1 虚拟库

不真实存在的库,对于mysql 里面的数据库,mysql 的库被称为物理库
物理库:有磁盘文件对应

3.2 虚拟表

不真实存在的库,对于mysql 里面的数据库的表,mysql 的表被称为物理表
物理表:有磁盘文件对应

3.3 数据节点(**)

由一个真实的物理库 + 物理的表构成
在这里插入图片描述

3.4 数据库服务器

数据库和数据库服务器不同

Mysql:它是一个数据库的服务器,并不是数据库
一个数据库服务器里面可以有很多的数据库!

四、Mycat的配置文件(mycat的核心

在这里插入图片描述

学习Mycat 就是要学会mycat 配置文件的写法
它里面的一切都是配置文件

4.1 schema.xml

4.1.1 schema (一个虚拟的库)节点

在这里插入图片描述

属性的名称 属性的值 属性的说明
Name 虚拟库的名称 数据库的名称
checkSQLschema false/true Mycat 是否校验你发的sql
SqlMaxLimit Mycat 最大查询的数据 Mycat 或自动追加分页

4.1.2 table 标签

属性的名称 属性的值 属性的说明
Name 虚拟表的名称 表的名称
DataNode 数据节点的名称,多个使用,分割 虚拟表不能存储数据,实际数据的存储在数据节点里面
Rule 路由规则 决定数据进入那个数据的节点里面
PrimaryKey 主键 表的主键
AutoIncrement True/false 主键是否增长

4.1.3 dataNode数据节点

虚拟表的数据都位于数据的节点里面

属性的名称 属性的值 属性的说明
Name 数据节点的名称 数据节点的名称,不能重复
dataHost 数据库服务器的值 具体的数据库服务器
database 数据库服务器里面的那个数据库 数据库的名称

DataNode = 数据库 + 物理表吗?
Mycat 认为我的数据存储在不同的库里面,但是表的名称和虚拟表的保持一致!所有我们可以直接省略它,Mycat 是这样规定的
dataHost:数据库的服务器
表->数据库->数据库服务器里面

4.1.4 DataHost:数据库的服务器

Mycat 认为的数据库服务器必须高可用,高并发!
如果我们只有一台Mysql ,根本做不到高并发和高可用!
Mycat 认为这里面需要填一个数据库的主从架构

4.2 rule.xml(路由的规则)

在这里插入图片描述
在table 里面使用规则,但是规则具体在rule.xml 文件里面

4.2.1 tableRule的节点

在这里插入图片描述
Name: 规则的名称,rule代表具体的规则
Columns:列,我们的路由算法,使用你的那列数据做计算
Algorithm:具体使用哪种算法来计算。写的是算法的名称

4.2.2 function 节点

在这里插入图片描述
Name:代表算法的名称
Class:是具体的那个算法的实现类
Prop:这个算法里面的配置的一些值

4.3 server.xml

节点多,但是我们只需要会这几个就可以了

4.3.1 用户的配置

在这里插入图片描述
Name:用户名
defaultAccount:是否为默认的用户
Password:用户的密码
Schemas:该用户能操作那些数据库
当然,也可以设置更细粒度的权限控制
在这里插入图片描述

4.3.2 主键增长的节点

在这里插入图片描述
主键增长的配置:具体我们在主键增长的时间讲解

五、实战mycat的配置文件

5.1 写一个schema.xml 文件

配置虚拟库,虚拟表,数据节点,数据库服务器。。

骨架的结构

<schema name="carrent">
   <table name="t_user" datanode="dn1,dn2,dn3,dn4" primaryKey="id" rule="rule1" />
</schema>
<datanode name="dn1" datahost="localhost1" database="db1" />
<datanode name="dn2" datahost="localhost1" database="db2" />
<datanode name="dn3" datahost="localhost1" database="db3" />
<datanode name="dn4" datahost="localhost1" database="db4" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
	 writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100" maxRetryCount="4">
	<heartbeat>select user()</heartbeat>
		
	<writeHost host="hostM1" url="localhost:3306" user="root" password="123">
		
	<readHost host="hostS2" url="localhost:3306" user="root" password="123" />
	</writeHost>
	<writeHost host="hostS1" url="localhost:3306" user="root" password="123" />
	
	</dataHost>

具体的schema文件文件为:

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

    <schema name="carrent" checkSQLschema="false" sqlMaxLimit="100">

      <table name="t_user" dataNode="dn1,dn2,dn3,dn4" primaryKey="id" rule="rule1" />
    </schema>

    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost1" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />
    <dataNode name="dn4" dataHost="localhost1" database="db4" />

    
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100" maxRetryCount="4">
        <heartbeat>select user()</heartbeat>
        
        <writeHost host="hostM1" url="localhost:3306" user="root"
                   password="123">
        
            <readHost host="hostS2" url="localhost:3306" user="root" password="123" />
        </writeHost>
        <writeHost host="hostS1" url="localhost:3306" user="root"
                   password="123" />
    
    </dataHost>
    
</mycat:schema>

5.2 rule.xml 文件(我们没有使用别的规则,它里面自动rule1)

5.3 server.xml

user的节点:
在这里插入图片描述
此时,我们的虚拟库名称不是TESTDB->carrent
在这里插入图片描述

5.4 覆盖默认的mycat 里面的配置文件

在这里插入图片描述
在这里插入图片描述
把修改好的文件覆盖到Mycat 里面

5.5 重启Mycat

在这里插入图片描述

再次使用Mycat 测试:
在这里插入图片描述

六、Mysql的主从架构

6.1 架构图

在这里插入图片描述

6.2 机器的规划

机器编号 Ip 端口 角色
1 120.26.80.180 3306 主机
2 120.26.80.180 3308 从机
3 120.26.80.180 3309 从机

6.3 开始搭建

6.3.1 使用三个mysql容器来模拟三台mysql的服务器

docker run --name m1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

docker run --name m1s1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

docker run --name m1s2 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

6.3.2 修改配置文件

(容器的/etc/mysql/conf.d/docker.conf)
在这里插入图片描述
无论从机和主机,配置文件一开始都是相同的
在这里插入图片描述
主机的配置文件:(M1)
在这里插入图片描述
server-id=1 服务器的标识
log-bin=master.bin 打开日志文件的记录,master.bin代表日志文件的名称

从机的配置文件:(m1s1 和m1s2)
m1s1.cnf
在这里插入图片描述
m1s2.cnf
在这里插入图片描述
Server-id 是服务器的标识,从机的值必须大于于主机的值

6.3.3 复制配置文件到各自的容器里面并且重启

在这里插入图片描述
在这里插入图片描述

6.4 执行sql 语句

我们从机要从主机里面去复制数据,我们必须在主机里面新建一个用户,告诉从机,让它使用该用户去主机里面复制数据!

  1. 我们必须在主机里面新建用户!
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
create user ‘rep’@’%’ identified by ‘123456’;
grant replication slave on . to ‘rep’@’%’;
flush privileges;

  1. 我们必须告诉从机该用户,让从机使用该用户去主机复制数据!
change master to master_host="",master_port=3306,master_user="rep",master_password="123456",master_log_file="",master_log_pos=;

实例:

change master to master_host=“172.16.184.109”,master_port=3306,master_user=“rep”,master_password=“123456”,master_log_filelog_file=“master.000001”,master_log_pos=745;

主机的ip 地址:使用局域网的地址
主机的日志文件的名称:master_log_file,,master_log_pos 我们必须去主机查询出来:
在这里插入图片描述

  1. 在从机里面开启主从,查看状态
    在这里插入图片描述
  2. 查询主从复制的状态
    在这里插入图片描述
    在这里插入图片描述

6.5 对m1s2 和m1s1 是一样的

6.6 测试主从

我们在主机里面新建一个数据库,查询从机里面是否有该数据库
在m1 里面新建数据库:
在这里插入图片描述
从机有没有复制过去:
在这里插入图片描述

七、复习主从的搭建过程

7.1 (复习)主机里面的配置

server-id=
log-bin=xxx

7.2 主机里面的sql 语句

  1. 创建用户(create user ‘rep’@’%’ identified by ‘123456’)
  2. 授予用户主从复制的权力 (grant replication slave on . to ‘rep’@’%’)
  3. 刷新(flush privileges)

7.3 从机里面的配置文件

server-id=xx(必须大于主机的id)

7.4 从机里面的sql 语句

  1. 配置要复制主机的信息
    change master to msater_host=””,master_port=,master_username=””,master_password=””,master_log_file=””,master_log_pos=,
  2. 开启主从
    start slave ;
  3. 查看状态
    show slave status \G;
    有2 个yes 代表成功了

七、m1s2 去m1 复制数据

7.1 m1 保持不动

在搭建m1s2 时,我们应该清除m1 上面的数据,就是删除之前测试新建的db1 ,db2 数据库

7.2 m1s2的操作

7.2.1 配置文件(之前已经ok了)

7.2.2 sql 语句的运行

在这里插入图片描述
在这里插入图片描述

Master_log_file = “” 是我们第一次查询到的主机里面的信息
Master_log_pos=”” ,也是我们第一次查询到的主机信息

在这里插入图片描述
在这里插入图片描述

7.3 测试

在这里插入图片描述
测试时:切记不用在从机里面操作!
一切的操作都在主机里面进行!

7.3.1 在主机里面新建数据库

在这里插入图片描述

7.3.2 查看2从机里面的数据库

M1S1:
在这里插入图片描述

M1S2:
在这里插入图片描述

八、Mysql 的主从有什么作用?

8.1 读写分离(图自己要画出来)

在这里插入图片描述

8.2 高可用(图自己要画出来)

Mysql 的高可用的架构实现
在这里插入图片描述

8.3 实际上实现读写分离和高可以都必须依赖Mycat

8.3.1 使用Mycat 解决mysql 读写分离的问题?

主要的功能:
分离sql 语句(将客户端发送的sql 语句分离出来)
路由sql 语句 (将读的sql 语句路由到从机里面,将写的sql 语句路由的主机里面)
在这里插入图片描述

8.3.2 使用Mycat 解决Mysql 高可用的问题

  1. Mycat 怎么知道M1 挂了

  2. Mycat 怎么把写的主机切换到M2 上面
    在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!