MyCAT2 入门到实战(三)


6. 【熟悉】MySQL主从搭建

因为MyCAT只能路由、分发,不能把多个数据库里面的数据进行同步,所以要数据同步必须还要使用MySQL的读写分离,主从复制。

img

6.1 概述主从介绍

MySQL主从又叫Replication、AB复制。简单讲就是A与B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,实现数据实时同步。有这样几个关键点:

1)MySQL主从是基于binlog,主上需开启binlog才能进行主从;

2)主从过程大概有3个步骤;

3)主将更改操作记录到binlog里;

4)从将主的binlog事件(SQL语句) 同步本机上并记录在relaylog里;

5)从根据relaylog里面的SQL语句按顺序执行。

6.2 主从作用

主从作用有:实时灾备,用于故障切换;读写分离,提供查询服务;备份,避免影响业务。

主从形式有:

img

1)一主一从

2)主主复制

3)一主多从:扩展系统读取的性能,因为读是在从库读取的。

4)多主一从:5.7版本开始支持

5)联级复制

6.3 主从复制原理

img

6.4 主从复制步骤

主库将所有的写操作记录在binlog日志中,并生成log dump线程,将binlog日志传给从库的I/O线程

从库生成两个线程,一个是I/O线程,另一个是SQL线程I/O线程去请求主库的binlog日志,并将binlog日志中的文件写入relay log(中继日志)中SQL线程会读取relay loy中的内容,并解析成具体的操作,来实现主从的操作一致,达到最终数据一致的目的。

6.5 主从复制配置步骤

1)确保从数据库与主数据库里的数据一致

2)在主数据库里创建一个同步账户授权给从数据库使用

3)配置主数据库(修改配置文件)

4)配置从数据库(修改配置文件)

5)需求

6)搭建两台MySQL服务器,一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器进行读操作

6.6 环境说明

名称 Ip Port
M1 192.168.8.100 3306
M1S1 192.168.8.101 3306

6.7 修改配置文件

6.7.1 主机的配置my.cnf

主机里面要记录SQL 语句,以后从机会把该SQL 语句偷过去

img

server-id=1
log-bin=master.bin

6.7.2 从机的配置my.cnf

img

server-id=2

6.7.3 测试连接

测试连接:

img

6.8 执行SQL语句

6.8.1 进入主机里面执行相关配置

mysql -uroot -proot123

创建用户:

create user 'rep'@'%' identified by 'root123';

img

给该用户授予权限:

grant replication slave on *.* to 'rep'@'%';

img

刷新权限:

flush privileges;

img

至此,M1 里面已经创建了一个用户:rep root123 拥有所有库,所有表replication slave。

接下来,我们尝试使用M1 里面的rep 用户登录:

img

6.8.2 进入从机里面执行相关配置

mysql -u root -proot123

img

change master to master_host="192.168.8.100",master_port=3306,master_user="rep",master_password="root123",master_log_file="master.000001",master_log_pos=745;

其中,master_log_file:该文件具体叫什么名称,需要从主机里面去看看。进入M1 里面使用root 用户登录M1,执行下面的SQL:show master status;

img

修改上面的SQL执行:

img

启动主从:(在M1S1里面执行):start slave ;

img

查询主从的状态(M1S1):show slave status \G;

img

成功的标志:

img

6.9 搭建失败的原因

6.9.1 第一个不是yes,是connecting

是因为从机使用你配置的主机信息没有登陆到主机里面!修改(从机里面)

bash stop slave; change master to master_host="192.168.8.100",master_port=3306,master_user="rep",master_password="root123",master_log_file="master.000001",master_log_pos=745; start slave;

6.9.2 第二个不是yes,是no

原因是主机和从机里的数据不一致:

img

从机会复制主机里面的SQL语句,来自己执行!实验时先把从机里面的db3 删除—>再把主机里面的db3 删除->从机里面复制该删除的命令->从机执行删除的命令(db3),事务无法提交,将一直阻塞!

img

现在从机里面要删除db3 ,但是没有db3,导致一直阻塞,以后的主从复制不会进行了。解决:在从机新建一个db3,然后停止主从,启动主从:

img

6.9.3 第一个不是yes,是no

就是你的server-id 没有配置成功的原因,需要重新修改配置文件,复制配置文件到容器里面,然后重启就ok

6.9.4 MySQL主从的操作规范

1)只能在主机里面执行DML 语句,不能在从机里面执行DML语句(会破坏主从)

2)在从机里面可以执行查询语句

3)主机只有一台,但是从机可以有多台

6.10 测试

在M1 里面创建数据库,看M1S1 有没有复制过去

img

7. 【掌握】MyCAT2的主从配置

前提,先搭建好MySQL的主从配置,登录MyCAT 2在MyCAT2里面操作,也就是连接8066这个端口。

7.1 创建数据源

-- 重置配置
/*+ mycat:resetConfig{} */

-- 添加读写的数据源 
/*+ mycat:createDataSource
{
    "dbType": "mysql",
    "idleTimeout": 60000,
    "initSqls": [],
    "initSqlsGetConnection": true,
    "instanceType": "READ_WRITE",
    "maxCon": 1000,
    "maxConnectTimeout": 3000,
    "maxRetryCount": 5,
    "minCon": 1,
    "name": "m1",
    "password": "root123",
    "type": "JDBC",
    "url": "jdbc:mysql://192.168.8.100:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
    "user": "root",
    "weight": 0
}
*/

-- 更多操作添加读的数据源

/*+ mycat:createDataSource
{
    "dbType": "mysql",
    "idleTimeout": 60000,
    "initSqls": [],
    "initSqlsGetConnection": true,
    "instanceType": "READ",
    "maxCon": 1000,
    "maxConnectTimeout": 3000,
    "maxRetryCount": 5,
    "minCon": 1,
    "name": "m1s1",
    "password": "root123",
    "type": "JDBC",
    "url": "jdbc:mysql://192.168.8.101:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
    "user": "root",
    "weight": 0
}
*/

7.2 查询数据源

/*+ mycat:showDataSources{} */

7.3 创建集群

/*! mycat:createCluster{
  "clusterType":"MASTER_SLAVE",
  "heartbeat":{
    "heartbeatTimeout":1000,
    "maxRetry":3,
    "minSwitchTimeInterval":300,
    "slaveThreshold":0
  },
  "masters":[
    "m1"
  ],
  "maxCon":2000,
  "name":"prototype",
  "readBalanceType":"BALANCE_ALL",
  "replicas":[
    "m1s1"
  ],
  "switchType":"SWITCH"
} */

7.4 查询集群

/*! mycat:showClusters{} */

7.5 创建逻辑库

CREATE DATABASE db1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

7.6 修改逻辑库的数据源

修改 conf/schemas/db1.schema.json

vim /usr/local/mycat/conf/schemas/db1.schema.json
## 在里面添加集群的名称,作用是让该集群生成并管理这个库的物理库
"targetName":"prototype",

7.7 查看集群的配置文件

我们查看集群配置的结果,发现文件里面自动帮我们添加了。

7.8 测试读写分离是否成功(在MyCAT里面测试)

重启MyCAT:

img

1)在MyCAT里面创建一个sys_user表:

CREATE TABLE SYS_USER(  ID BIGINT PRIMARY KEY,  USERNAME VARCHAR(200) NOT NULL,  ADDRESS  VARCHAR(500))

2)通过注释生成物理库和物理表:

如果物理表不存在,在 MyCAT2 能正常启动的情况下,根据当前配置自动创建分片表,全局表和物理表:

/*+ mycat:repairPhysicalTable{} */;

3)查看后端物理库:发现物理库和物理表都生成了。

4)在MyCAT里面向sys_user表添加一条数据:

INSERT INTO SYS_USER(ID,USERNAME,ADDRESS) VALUES(1,"XIAOMING","WUHAN");

5)修改MySQL里面的让数据不一样:

img

img

6)在MyCAT里面查询数据,会发现每次查询的结果不一样:

img

到此,我们使用MyCAT2主从搭建就完成了。

8. 【掌握】MySQL的集群搭建(双主双从)

8.1 集群搭建概述

8.1.1 是什么

集群(Cluster)是一种较新的技术,通过集群技术,可以在付出较低成本的情况下,获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。

MySQL集群技术在分布式系统中为MySQL数据提供了冗余特性,增强了安全性,使得单个MySQL服务器故障不会对系统产生巨大的负面效应,系统的稳定性得到保障。

8.1.2 优点

主要有以下两个优点。

1)高可伸缩性:服务器集群具有很强的可伸缩性,随着需求和负荷的增长,可以向集群系统添加更多的服务器,在这样的配置中,可以有多台服务器执行相同的应用和数据库操作。

2)高可用性:在不需要操作者干预的情况下,防止系统发生故障或从故障中自动恢复的能力。通过把故障服务器上的应用程序转移到备份服务器上运行,集群系统能够把正常运行时间提高到大于99.9%,大大减少服务器和应用程序的停机时间。

8.1.3 缺点

我们知道,集群中的应用只在一台服务器上运行,如果这个应用出现故障,其他的某台服务器会重新启动这个应用,接管位于共享磁盘柜上的数据区,进而使应用重新正常运转。

而整个应用的接管过程大体需要三个步骤:侦测并确认故障、后备服务器重新启动该应用、接管共享的数据区。因此在切换的过程中需要花费一定的时间,原则上根据应用的大小不同切换的时间也会不同,越大的应用切换的时间越长。

8.2 搭建思路图

img

8.3 搭建准备工作

8.3.1 启动5台MySQL(至少要5台)

名称 Ip Port
M1 192.168.8.100 3306
M1S1 192.168.8.101 3306
M1S2 192.168.8.102 3306
M2 192.168.8.103 3306
M2S1 192.168.8.104 3306

前面主从已启动了两个,所以只用启动三个主机就够了

8.3.2 配置文件的修改

先准备5 个配置文件 ,分别修改。

1)因为在上面的主从里面已有两个配置文件,所以只用创建三个就够了:m1s2.cnf、m2.cnf、m2s1.cnf

2)M2 需要添加一个配置项(具体配置看下面截图)

3)M2 会从M1 复制数据,但是M2 从M1复制的数据,不会记录下来,则M2S1 里面没有数据!

4)我们需要打开M2的级联复制功能,让M2 也能记录从M1 里面复制的数据。

最后结果如下:

img

配置文件修改好了后,复制到主机里面,并且重启服务!

8.3.3 测试连接

img

8.4 进入执行SQL

在搭建MySQL的集群时,先清空所有机器里面的数据。

现在有数据的是:M1 M1S1,只需要清空M1的数据,就都没有了。

将之前新建的db1删除就ok。

img

4.1,M1修改

因为前面搭建好了,所有不用修改

4.2,M1S1修改

同理上面的4.1

4.3,M1S2修改(从机)

给它设置一个主机就ok

mysql -uroot -proot123

img

关联主机:

change master to master_host="192.168.8.100",master_port=3306,master_user="rep",master_password="root123",master_log_file="master.000001",master_log_pos=3574;

启动主从:start slave ;

查看状态:show slave status \G;

img

4.4,M2修改

进入M2使用Root登录

mysql -uroot -proot123

1)新建用户:create user 'rep1'@'%' identified by 'root123';

2)给用户授权:grant replication slave on . to 'rep1'@'%';

3)刷新权限:flush privileges;

4)使用新的用户尝试登录:

img

M2 作为M1的从机需要执行的SQL:(登录M2时要使用root用户)

change master to master_host="192.168.8.100",master_port=3306,master_user="rep",master_password="root123",master_log_file="master.000001",master_log_pos=3574;

start slave ;
show slave status \G;

img

4.5,M2S1修改

mysql -uroot -proot123

img

M2S1 是M2的从机,执行的SQL

进入M2查看pos:show master status;

img

在M2S1里面执行下面的命令:

change master to master_host="192.168.8.103",master_port=3306,master_user="rep1",master_password="root123",master_log_file="master.000001",master_log_pos=747;

启动主从:start slave ;

img

show slave status \G;

img

8.5 证集群是否成功

使用工具连接上所有的MySQL

img

1)往M1 写数据,看 M2S1

2)在M1 新建数据库

3)观察M2S1

4)往M1 写数据,看M1S1

img

9. 【掌握】MyCAT2操作双主双从

目地:在MyCAT中集群配置实现双主双从。

9.1 角色说明

M1 主机

M1S1 是M1的从机

M1S2 是M1的从机

M2 主机

M2S1 是M2的从机

9.2 添加数据源

-- 添加M1S2读的数据源
/*+ mycat:createDataSource
{
    "dbType": "mysql",
    "idleTimeout": 60000,
    "initSqls": [],
    "initSqlsGetConnection": true,
    "instanceType": "READ",
    "maxCon": 1000,
    "maxConnectTimeout": 3000,
    "maxRetryCount": 5,
    "minCon": 1,
    "name": "m1s2",
    "password": "root123",
    "type": "JDBC",
    "url": "jdbc:mysql://192.168.8.102:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
    "user": "root",
    "weight": 0
}*/;

-- 添加M2的数据源
/*+ mycat:createDataSource
{
    "dbType": "mysql",
    "idleTimeout": 60000,
    "initSqls": [],
    "initSqlsGetConnection": true,
    "instanceType": "READ_WRITE",
    "maxCon": 1000,
    "maxConnectTimeout": 3000,
    "maxRetryCount": 5,
    "minCon": 1,
    "name": "m2",
    "password": "root123",
    "type": "JDBC",
    "url": "jdbc:mysql://192.168.8.103:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
    "user": "root",
    "weight": 0
}*/;

-- 添加M2S1的数据源
/*+ mycat:createDataSource
{
    "dbType": "mysql",
    "idleTimeout": 60000,
    "initSqls": [],
    "initSqlsGetConnection": true,
    "instanceType": "READ",
    "maxCon": 1000,
    "maxConnectTimeout": 3000,
    "maxRetryCount": 5,
    "minCon": 1,
    "name": "m2s1",
    "password": "root123",
    "type": "JDBC",
    "url": "jdbc:mysql://192.168.8.104:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
    "user": "root",
    "weight": 0
}
*/;

9.3 修改配置集群

因为我们现在后端的MySQL集群结构发生了变化,现在修改集群的配置【只是修改】

{
    "clusterType": "MASTER_SLAVE",
    "heartbeat": {
        "heartbeatTimeout": 1000,
        "maxRetryCount": 0,
        "minSwitchTimeInterval": 300,
        "showLog": true,
        "slaveThreshold": 0.0
    },
    "masters": [
        "m1",
        "m2"
    ],
    "maxCon": 2000,
    "name": "prototype",
    "readBalanceType": "BALANCE_ALL",
    "replicas": [
        "m1s1",
        "m1s2",
        "m2s1"
    ],
    "switchType": "SWITCH",
    "timer":{
        "initialDelay":5,
        "period":3,
        "timeUnit":"SECONDS"
    }
}
### 设置主备切换
"switchType": "SWITCH", // 表示允切换

initialDelay: 设置为5秒,表示定时器启动后会等待5秒才执行第一次检查任务。
period: 设置为3秒,表示每3秒执行一次检查任务。
timeUnit: 设置为"SECONDS",表示时间单位为秒。

9.4 重启MyCAT测试

9.4.1 重启MyCAT

cd /usr/local/mycat/bin
./mycat restart

重启成功如下:

img

9.4.2 开始测试

1)在MyCAT创建db1库:

CREATE DATABASE db1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

2)在MyCAT创建表:

create table sys_user(  id bigint primary key,  username varchar(200) not null,  address  varchar(500)) 

3)刷新逻辑表到物理库

/*+ mycat:repairPhysicalTable{} */;

刷新完成之后我们可以在后台的MySQL里面看到数据表已创建完成。

4)在MyCAT里面添加数据:

insert INTO sys_user(id,username,address) values(1,"xiaofang","wuhan");

完成之后刷新后端MySQL物理库,我们发现有数据了。

5)在MyCAT里查询测试:

修改上面5个MySQL数据库中db1库中sys_user表里面的数据,让它不一样,再在MyCAT里面执行查询 结果如下:

img