1 读写分离架构
1.1 介绍
为了减轻数据库的压力,我们脑海里出现最基本的两种方案分别是
-
在应用程序与数据库之间架构一层缓存层,将常用的数据存放在缓存中,应用读取数据时,先到缓存中取,未命中时,才到数据库中取数据。
- 部署两台数据一致的数据库,一台用于写操作【主数据库】,一台用于读操作【从数据库】,实现数据的读写分离。
现在要介绍的是针对读写分离的方案【mysql主从复制】
? 为此,我们要需要达到如下几个要求
-
主从数据库数据必须一致
可采用数据库主从复制机制实现数据的同步
-
写数据操作的是主数据库
在应用程序使用动态数据源将写数据请求对接到主数据库
-
读数据操作的是从数据库
在应用程序使用动态数据源将读数据请求对接到主数据库
2 mysql主从复制部署
2.1 说明
主从复制的原理:
- 主库db的更新事件(update、insert、delete)被写到binlog
- 主库创建一个binlog dump thread,把binlog的内容发送到从库
- 从库启动并发起连接,连接到主库
- 从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
- 从库启动之后,创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db 本次mysql主从复制使用docker容器来实现,需要具备一定的docker操作能力。
? 上述主从复制原理摘抄自【https://blog.csdn.net/zai_xia/article/details/90379016】
2.2 部署主数据库
- 下载percona 5.7.23 镜像
docker pull percona:5.7.23
-
查看镜像
docker images
-
创建宿主机mysql数据卷
mkdir -p /data/mysql/master //自行定义数据卷存放目录,要与启动docker容器宿主机的数据卷一致 cd /data/mysql/master //进入数据卷目录 mkdir conf data //创建两个目录,conf 用于存放mysql的配置文件,data用于存放mysql的数据 chmod 777 * -R //给目录授权
-
创建msyql配置文件
cd /data/mysql/master/conf //进入mysql存放配置文件目录 vim my.cnf //创建mysql配置文件
配置文件【my.conf】的内容
[mysqld] log-bin=mysql-bin #开启二进制日志 server-id=1 #服务id,在集群内不允许重复 sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION‘ #解决mysql5.7 版本以上出现 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and错误
-
创建mysql主数据库容器
docker create --name percona-master -v /data/mysql/master/data:/var/lib/mysql -v /data/mysql/master/conf:/etc/my.cnf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23//创建主数据库容器 docker ps -a //查看是否创建成功
-v 指定宿主机【/data/mysql/master/data】映射容器的【/var/lib/mysql】,【/data/mysql/master/conf】映射容器【/etc/my.cnf.d】
-
启动容器并查看是否启动成功
docker start percona-master //启动mysql-master容器 docker logs -f percona-master //查看mysql-master容器日志
-
使用mysql客户端授权从数据库复制
采用navicat连接主数据库【工具可自行选择】
]
执行创建用户及授权SQL语句
create user ‘pango‘@‘%‘ identified by ‘pango‘;//创建用户
grant replication slave on *.* to ‘pango‘@‘%‘; //授权复制权限给用户
flush privileges;//刷新权限
查看主数据库状态
show master status;
文件mysql-bin.000003 及位置741,从数据库同步主数据库需要用到
查看二进制文件的信息
show global variables like ‘binlog%‘;
2.3 部署从数据库
创建从数据库容器的步骤与创建主数据库容器的步骤大体一样,这里就不做过多的备注
-
创建从数据库在宿主机的数据卷目录
mkdir /data/mysql/slave cd /data/mysql/slave mkdir conf data chmod 777 * -R
-
创建配置文件
cd /data/mysql/slave/conf vim my.cnf
配置文件【my.cnf】内容:
[mysqld] log-bin=mysql-bin #开启二进制日志 server-id=2 #服务id,在集群内不允许重复 sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION‘ #解决mysql5.7 版本以上出现 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and错误
-
创建从数据库容器
docker create --name percona-slave -v /data/mysql/slave/data:/var/lib/mysql -v /data/mysql/slave/conf:/etc/my.cnf.d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
-
启动容器
docker start percona-slave //启动mysql-slave docker logs -f percona-slave //查看mysql-slave
-
使用客户端执行设置主数据库配置sql语句
CHANGE MASTER TO master_host=‘localhost‘, master_user=‘pango‘, master_password=‘pango‘, master_port=3306, master_log_file=‘mysql-bin.000003‘, master_log_pos=741;
-
启动从数据库同步
start slave;
-
查看从数据库状态
show slave status
-
测试
从主数据库中新建库或表,查看从数据库是否存在同样的表和库,如存在,则表示主从复制部署成功