MySql 主从复制、读写分离、中间件

原理

主从复制:slave 通过一个 I/O 线程与 master 保持通信,并监控 master 的二进制日志文件的变化,如 maste r二进制文件发生变化,则会把变化复制到自己的日志中,然后 SQL 线程会把相关的数据库操作事件执行到自己的数据库中,依次实现从数据库和主数据库的一致性,也就是实现了主从复制
读写分离:insert/update/delete 语句操作一台服务器,select 操作另一个服务器
中间件:MyCat、Atlas…
在这里插入图片描述

主从复制流程(这里采用 docker 方式)

准备: MySql8.0 镜像、系统 Ubuntu18

拉取 Mysql 镜像
在这里插入图片描述
创建 mysql 容器映射目录
在这里插入图片描述
编辑 master/slave 配置文件

[mysqld]
# 每个 mysql 服务 id 不同即可
server-id = 100
# binlog 日志位置及名称
log-bin = /var/lib/mysql/master
# 当前 binlog 日志的具体位置
log_bin_index=/var/lib/mysql/master

在这里插入图片描述
启动 master 数据库:

docker run -d -p 3307:3306 -v /home/mysql/conf.d/master:/etc/mysql/conf.d -v  /home/mysql/data/master:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:8.0

设置 master 数据库:

// 进入 mysql 容器
docker exec -it mysql /bin/bash
// 创建 slave 用户用于从库访问
create user 'slave'@'%' identified by 'slave';
// 授权
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
// 查看 master 状态
show master status\G

在这里插入图片描述
启动 slave 数据库:

# slave1 从库
docker run -d -p 3308:3306 -v /home/mysql/conf.d/slave1:/etc/mysql/conf.d -v  /home/mysql/data/slave1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql1 mysql:8.0
# slave2 从库
docker run -d -p 3309:3306 -v /home/mysql/conf.d/slave2:/etc/mysql/conf.d -v  /home/mysql/data/slave2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql2 mysql:8.0

在这里插入图片描述
设置 slave1/slave2 从库:

// 进入 mysql1/mysql2  容器
docker exec -it mysql1 /bin/bash
// 配置链接 master 数据库
// master_ip 是 master 主库数据库 ip(容器内部ip),master.000001 是 master 当前 binlog 日志文件名称,691 是 position
change master to master_host='172.17.0.2', master_user='slave', master_password='slave', master_port=3306, master_log_file='master.000001', master_log_pos=691;
// 启动 slave 库
start slave;
// 查看状态
show slave status\G

在这里插入图片描述

// 如不成功,请注意的 mysql 8.0 的加密规则, 修改规则:http://www.likekeep.me/post/474240fa.html
SELECT Host, User, plugin from user

在这里插入图片描述
测试 master 创建测试库 slave 同步:
在这里插入图片描述
在这里插入图片描述

双主热备

实现高可用,防止一台 master 挂掉影响业务,实现双主热备,即可以实现互为主从状态
在这里插入图片描述
双主分别对应一从架构(这里只实现互为主从,主对应的 slave 请参照上面的一主一从配置即可):
在这里插入图片描述

配置上面原先是 master/slave 的 binlog 日志配置,实现即是从库又是主库

[mysqld]
# 每个 mysql 服务id不同即可
server-id = 101
# binlog 日志位置及名称
log-bin = /var/lib/mysql/master
# 当前 binlog 日志的具体位置
log_bin_index=/var/lib/mysql/master
# 双主热备 开启从库 binlog 日志
binlog_format = mixed
log_slave_updates = 1

进入原 slave 容器

// 进入 mysql 容器
docker exec -it mysql1 /bin/bash
// 创建 slave 用户用于从库访问
create user 'slave'@'%' identified by 'slave';
// 授权
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
// 查看 master 状态
show master status\G

在这里插入图片描述
进入原 master 容器

// 进入 mysql  容器
docker exec -it mysql /bin/bash
// 配置链接 master 数据库
// master_ip 是 master 主库数据库 ip(容器内部ip),master.000004是 master 当前 binlog 日志文件名称,1281 是 position
change master to master_host='172.17.0.3', master_user='slave', master_password='slave', master_port=3306, master_log_file='master.000004', master_log_pos=1281;
// 启动 slave 库
start slave;
// 查看状态
show slave status\G

在这里插入图片描述
测试 master/slave 互为主从:
在这里插入图片描述
在这里插入图片描述

数据库中间件 (这里只介绍了 MyCat )

MyCat:应用程序与数据库之间的一层代理,一个啊里开源产品,官网 www.mycat.org.cn
Atlas: 由 Qihoo 360 公司 Web 平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目,官网https://github.com/Qihoo360/Atlas/tree/master

MyCat

在这里插入图片描述
下载 MCat 稳定版:

# 下载
sudo wget http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
# 解压
tar -xvzf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz

在这里插入图片描述
配置 MyCat 的 server.xml、schema.xml 文件:

server.xml
在这里插入图片描述
schema.xml
在这里插入图片描述
启动 mycat 服务:

# 启动
bin/mycat start
# 状态
bin/mycat status

在这里插入图片描述
具体参数详解可参考官方: 权威指南

测试:
在这里插入图片描述

mycat 读写分离:

编辑 schema.xml
在这里插入图片描述
重启 mycat 后测试:
在这里插入图片描述
查看 mycat 日志,是从库查询的(插入数据自行测试):
在这里插入图片描述

mycat 数据分片处理:

对 user_info 进行分库处理(假设一个 user_info 表庞大,需进行分库)
在这里插入图片描述

schema.xml
在这里插入图片描述

server.xml
在这里插入图片描述

mycat - 插入数据测试:
在这里插入图片描述

再插入几条,发现分别存放在 3 个库中( user3 暂时没有分配到)
在这里插入图片描述

以上所有 mysql、和 mycat 都在一台虚拟主机上实现,采用 docker 容器
后面项目代码就可直接连接 MyCat ,当然哈希 id 可以通过代码生成唯一 id 即可

发布了37 篇原创文章 · 获赞 2 · 访问量 3085

猜你喜欢

转载自blog.csdn.net/weixin_41406041/article/details/101077770