目录
- 一、问题导入
- 二、Mycat 的简介
- 三、Mycat的名词解释
- 四、Mycat的配置文件(*mycat的核心*)
- 五、实战mycat的配置文件
- 5.1 写一个schema.xml 文件
- 5.2 rule.xml 文件(我们没有使用别的规则,它里面自动rule1)
- 5.3 server.xml
- 5.4 覆盖默认的mycat 里面的配置文件
- 5.5 重启Mycat
- 六、Mysql的主从架构
- 七、复习主从的搭建过程
- 七、m1s2 去m1 复制数据
- 八、Mysql 的主从有什么作用?
一、问题导入
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以上的内存!
- 新建文件夹
Cd /usr/local
Mkdir java - 下载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
- 解压JDK
tar -zxvf xxx.gz
- 配置环境变量
vi /etc/profile
在最后追加:
5 source 刷新文件
2.2.2 Mycat的安装
- 新建文件夹/usr/local
- 下载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
-
解压压缩包
-
认识Mycat的目录
- 启动Mycat
./mycat start
./mycat start|stop|status|restart
- 查看Mycat 是否启动成功
1 ./mycat status
2: jps
-
查看启动的日志:
我们发现Mycat 启动时,需要在它的目录的logs 文件夹里面写一个pid的文件,但是此时没有logs这个文件夹
解决方案:新建logs文件夹
再次启动: -
尝试连接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 语句
我们从机要从主机里面去复制数据,我们必须在主机里面新建一个用户,告诉从机,让它使用该用户去主机里面复制数据!
- 我们必须在主机里面新建用户!
create user ‘rep’@’%’ identified by ‘123456’;
grant replication slave on . to ‘rep’@’%’;
flush privileges;
- 我们必须告诉从机该用户,让从机使用该用户去主机复制数据!
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 我们必须去主机查询出来:
- 在从机里面开启主从,查看状态
- 查询主从复制的状态
6.5 对m1s2 和m1s1 是一样的
6.6 测试主从
我们在主机里面新建一个数据库,查询从机里面是否有该数据库
在m1 里面新建数据库:
从机有没有复制过去:
七、复习主从的搭建过程
7.1 (复习)主机里面的配置
server-id=
log-bin=xxx
7.2 主机里面的sql 语句
- 创建用户(create user ‘rep’@’%’ identified by ‘123456’)
- 授予用户主从复制的权力 (grant replication slave on . to ‘rep’@’%’)
- 刷新(flush privileges)
7.3 从机里面的配置文件
server-id=xx(必须大于主机的id)
7.4 从机里面的sql 语句
- 配置要复制主机的信息
change master to msater_host=””,master_port=,master_username=””,master_password=””,master_log_file=””,master_log_pos=, - 开启主从
start slave ; - 查看状态
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 高可用的问题
-
Mycat 怎么知道M1 挂了
-
Mycat 怎么把写的主机切换到M2 上面
来源:CSDN
作者:213之父
链接:https://blog.csdn.net/qq_43623447/article/details/104261918