Mycat基本介绍(二)

mysql主从复制和mycat读写分离

下面我们说说mysql的主从复制和mycat读写分离

主从复制:
概念:把一台主机的数据复制到其他一台或多台主机上

原理:主从复制过程中主服务器有一个工作线程I/O dump thread,从服务器有两个工作线程I/O thread和SQL thread。
主库把外界接收的SQL请求记录到自己的binlog日志中,从库的I/O thread去请求主库的binlog日志,并将binlog日志写到中继日志中,然后从库重做中继日志的SQL语句。主库通过I/O dump thread给从库I/O thread传送binlog日志
在这里插入图片描述
docker下面我们来运行两个mysql容器
常规操作,我们进行挂载,方便修改,第一步启动mysql

docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 a4fdfd462add

第二步挂载:

docker cp 8ffea940fe35:/etc/mysql/mysql.conf.d/ /home/mysql1/
docker cp 8ffea940fe35:/var/log /home/mysql1/

我们把mysql1复制一份放到home下面,命名为mysql2
在这里插入图片描述
我们启动两个mysql容器:

docker run -p 3307:3306 --name master   -d  -v /home/mysql1/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql1/log/:/var/log  -e MYSQL_ROOT_PASSWORD=123456  a4fdfd462add

docker run -p 3308:3306 --name slave   -d  -v /home/mysql2/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql2/log/:/var/log -e MYSQL_ROOT_PASSWORD=123456  a4fdfd462add

启动后,我们可以用navicate连接测试下
在这里插入图片描述
在这里插入图片描述
docker自定义网络模式
注意:我们在使用Docker容器时候,每次启动容器,容器分配到的虚拟IP经常变动,比如我们现在使用Mycat + Mysql,我们是需要配置Mysql服务IP地址的,这个IP是Docker分配的虚拟IP,假如老是变,那我们还得老是修改配置,那就很麻烦了;所以我们需要固定手工分配容器IP;

Docker默认使用的是bridge 桥接网络模式
我们可以查看下

 docker network ls 

在这里插入图片描述
我们创建自定义网络模式;

docker network create --subnet=172.20.0.0/16 extnetwork

在这里插入图片描述
创建容器并指定IP命令

--net extnetwork --ip 172.20.0.2

上面的两个启动mysql容器我们可以做以下修改

docker run -p 3307:3306 --name master   -d  -v /home/mysql1/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql1/log/:/var/log --net extnetwork --ip 172.20.0.2  -e MYSQL_ROOT_PASSWORD=123456  a4fdfd462add 

 docker run -p 3308:3306 --name slave   -d  -v /home/mysql2/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql2/log/:/var/log --net extnetwork --ip 172.20.0.3 -e MYSQL_ROOT_PASSWORD=123456  a4fdfd462add 

注意:这里必须用172.20.0.2开始分配,因为172.20.0.1是网关;

docker network rm extnetwork #删除网络

修改成功后我们检查下即可

主从复制配置:
现在 Mysql主服务器 172.20.0.2 从服务器 172.20.0.3

首先主机mysql配置,打开mysqld.cnf,添加如下配置:

# 主服务器ID 必须唯一
server-id=2
# 开启及设置二进制日志文件名称
log_bin=mysql-bin
# 要同步的数据库
binlog-do-db =db_cpxtt
# 不需要同步的数据库
binlog-ignore-db=mysql    
binlog_ignore_db=information_schema
binlog_ignore_db=performation_schema
binlog_ignore_db=sys
# 设置logbin格式
binlog_format= MIXED # binlog日志格式,mysql默认采用statement,建议使用mixed

从服务器:打开mysqld.cnf:

server-id=3
relay-log=mysql-relay 

主服务器创建从机访问用户以及授权:

CREATE USER 'slave'@'172.20.0.3' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'172.20.0.3';
FLUSH PRIVILEGES;

查看主服务器状态;

SHOW MASTER STATUS

在这里插入图片描述
从机创建连接主服务器的IP,用户,密码以及日志文件和位置;

CHANGE MASTER TO MASTER_HOST='172.20.0.2', MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=504;

启动主从复制

START SLAVE;

查看从机状态

SHOW SLAVE STATUS

在这里插入图片描述
有两个yes才算配置成功假如有 No 或者 Connecting,请看日志或者找到Mysql日志文件查看具体问题;

binlog_format详解
mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。对应的,binlog的格式也有三种:STATEMENT,ROW,MIXED。

① STATEMENT模式(SBR)
每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致(sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)

② ROW模式(RBR)
不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。

MIXED模式(MBR)
以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。

测试的话我们在主库里面进行建库建表看从库有没有改变即可
主从复制常用命令介绍

START SLAVE:不带任何参数,表示同时启动I/O 线程和SQL线程,I/O线程从主库读取bin log,并存储到relay log中继日志文件中,SQL线程读取中继日志,解析后,在从库重放。
STOP SLAVE: 完成停止I/O 线程和SQL线程的操作。
SHOW MASTER STATUS: 查看主服务器状态
SHOW SLAVE STATUS: 查看从服务器状态
RESET MASTER: 删除所有index file 中记录的所有binlog 文件,将日志索引文件清空,创建一个新的日志文件,这个命令通常仅仅用于第一次用于搭建主从关系的时的主库

读写分离
基于前面的Mysql主从复制,我们通过Mycat,能够实现读写分离,即master主服务器实现写操作(insert,update,delete等),salve从服务器实现读操作(select等),

主服务器一旦有写入操作,从服务器通过读取binlog,来实现数据同步;Mycat也时时发送心跳包来检测mysql服务器是否可用;
在这里插入图片描述
Mycat读写分离核心配置在 schema.xml文件,我们来看下其内容
schema.xml有几个标签,分别是:mycat:schema schema主配置标签, schema逻辑库配置标签,dataNode数据节点配置标签,dataHost数据库主机配置标签;

在这里插入图片描述
一个逻辑库,对应多个逻辑表,每个逻辑表如上图,可以水平分片(我们后面会细讲),分成一个或者多个数据分片节点,每个数据分片节点对应一个dataHost(数据库主机),dataHost里可以通过writeHost和readHost配置写主机和读主机;

schema标签属性介绍:(定义逻辑数据库)
在这里插入图片描述
在这里插入图片描述
dataNode标签属性:(定义数据分片节点)
在这里插入图片描述
在这里插入图片描述
dataHost标签属性:(定义后端的数据库主机)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
heartbeat子标签属性(心跳执行SQL)
writeHost子标签属性(写主机配置)

readHost子标签属性(读主机配置)
在这里插入图片描述
读写分离测试
为了能看到读写分离效果,我们把mysql主从复制的一个配置文件改下:binlog_format= MIXED 改成 STATEMENT
这样同步的时候 同步的是SQL,我们一些函数的一定特定,能分辨出哪个主机行了 写请求,哪个主机执行了 读请求;

我们在mycat中 执行

 insert into test values(null,@@hostname) 
插入主机名称;@@hostname

我们发现 执行 insert into test values(null,@@hostname) 插入 master主机 然后同步到从机,我们mycat读取从从机读取;
注意因为我们修改了mysql主从复制中主机的配置需要重新执行上面的连接操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值