前言
在这篇文章中荔枝会梳理MySQL中有关主从复制和读写分离的相关知识点,主要包括基本的概念、配置搭建、命令和模式选择等几个方面。MySQL主从复制和读写分离属于MySQL数据库学习中的高阶内容了,大家要和荔枝一起加油学习噢~~~希望能帮助到需要的小伙伴。
文章目录
前言
一、主从复制
1.1 基本概念
1.2 原理理解
1.3 主从复制配置
1.3.1 主库配置
1.3.2 从库配置
二、读写分离
2.1 基本概念及原理
2.2 基于mycat实现一主一从的读写分离
2.3 基于mycat实现双主双从的读写分离
2.3.1 架构图
2.3.2 双主双从结构搭建
2.3.3 双主双从读写分离
总结
一、主从复制
1.1 基本概念
主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫日志重做),从而使得从库和主库的数据保持同步。MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。
优点
- 主库出现问题,可以快速切换到从库提供服务。
- 实现读写分离,降低主库的访问压力。
- 可以在从库中执行备份,以避免备份期间影响主库服务。
1.2 原理理解
首先我们先来看看一张MySQL主从复制的图:
主从复制过程
Master主库在事务提交时,会把数据变更记录(DDL和DML语句)在二进制日志文件Binlog中。从库读取主库的二进制日志文件Binlog并写入到从库的中继日志Relay Log,接着从库slave重做中继日志中的事件,这就保证了Master和Slave中的数据一致性,实现了主从复制的过程。
注意:MySQL的主从复制是基于二进制日志binlog实现的。
1.3 主从复制配置
首先应该开放两台MySQL服务器防火墙中的端口
//打开防火墙的指定端口
firewall-cmd--zone=public --add-port=3306/tcp -permanent
firewall-cmd -reload
//也可以直接关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
1.3.1 主库配置
修改配置文件 /etc/my.cnf
#mysql服务1D,保证整个集群环境中唯一,取值范围:1-2^32-1,默认为1
server-id=1
#是否只读,1代表只读,0代表读写
read-only=0
#同步时需要忽略的数据库
#binlog-ignore-db=mysql
#指定同步的数据库
#binlog-do-db=db01
重启MySQL主库
systemctl restart mysqld
登录mysql,创建远程连接的站好并授予主从复制权限
#创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
CREATE USER '用户名'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
#为'itcast'@'%'用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO '用户名'@'%';
查看二进制日志的坐标
show master status;
字段含义说明:
- file:从哪个日志文件开始推送日志文件
- position:从哪个位置开始推送日志
- binlog_ignore_db:指定不需要同步的数据库
1.3.2 从库配置
修改从库中的配置文件 /etc/my.cnf
#ysql服务D,保证整个集群环境中唯一,取值范围:1-2^32-1,和主库不一样即可
server-id=2
#是否只读,1代表只读,0代表读写 --这里指的是普通用户的读写权限
read-only=1
#配置超级管理员的读写权限 --这一步可能不需要
#super-read-only=1
重启从库Mysql服务
systemctl restart mysqld
登录MySQL并在从库中设置主库的配置
CHANGE REPLICATION SOURCE TO SOURCE_HOST='主库IP地址',SOURCE_USER='连接主库的用户名',SOURCE_PASSWORD='密码',SOURCE_LOG_FILE='binlog日志文件名',SOURCE_LOG_POS=binlog日志文件坐标;
//8.0.23版本前
CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx',MASTER_USER='xxx',MASTER_PASSWORD='xxx',MASTER_LOG_FILE='xxx',MASTER_LOG_POS=xxx;
开启主从复制
start replica; //8.0.22版本后
start slave;
查看从库主从复制开启状态
show replica status\G;
需要注意的是,当前的主从复制是从二进制文件的坐标position之后开始同步的,如果要同步之前的数据,则需要将主库的数据导出一个SQL脚本并到从库中执行以完成数据库的初始化。
二、读写分离
2.1 基本概念及原理
读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。通过MyCat即可轻易实现上述功能,不仅可以支持MVSOL,也可以支持Oracle和SOL Server。
2.2 基于mycat实现一主一从的读写分离
配置
MyCat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制。
balance取值的含义
- 0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
- 1:全部的readHost与备用的writeHost都参与select语句的负载均衡(主要针对于双主双从模式)
- 2:所有的读写操作都随机在writeHost,readHost.上分发
- 3:所有的读请求随机分发到writeHost>对应的readHost.上执行,writeHost?不负担读压力
读写分离仅需要配置balance的属性值为1或者是3即可。
一主一从的模式下如果出现主节点Master宕机的情况,整个业务系统就只能执行读操作而不能执行写操作,这并不满足高可用的要求。
2.3 基于mycat实现双主双从的读写分离
一个主机Master:1用于处理所有写请求,它的从机Slave:1和另一台主机Master2还有它的从机Slave2负责所有读请求。当Master1主机宕机后,Master2主机负责写请求,Master.1、Master2互为备机。
2.3.1 架构图
2.3.2 双主双从结构搭建
主库配置
修改配置文件
ysql服务D,保证整个集群环境中唯一,取值范围:1-232-1,默认为1,不同主库之间的server-id需要不同
server-id=1
#指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
#在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
重启MySQL服务器
systemctl restart mysqld
在两台主库种创建账户并授权,这一步跟之前的一主一从的环境搭建是一样
#创建tcst用户,并设置密码,该用户可在任意主机连接该MySQL服务
CREATE USER '用户名'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
#为'itcast'@'%'用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO '用户名'@'%';
查看二进制日志坐标
show master status
从库配置
修改配置文件 /etc/my.cnf
server-id=2
重启mysql服务器
systemctl restart mysqld
在从库中配置器锁关联的主库
CHANGE REPLICATION SOURCE TO SOURCE_HOST='主库IP地址',SOURCE_USER='连接主库的用户名',SOURCE_PASSWORD='密码',SOURCE_LOG_FILE='binlog日志文件名',SOURCE_LOG_POS=binlog日志文件坐标;
//需要注意两个从库需要分别执行连接上对应的主机
启动两台从库的主从复制并查看从库的状态
start slave;
show slave status\G
设置两个主库之间相互复制
跟从库复制主库的指令是一样的,也就是分别把Master1和Master2看作是对方的从库并进行主从复制操作,启动两台服务器的主从复制并查看从库的状态。
2.3.3 双主双从读写分离
MyCat配置
这里相比于一主一从在dataHost中多了两个配置:writrType和switchType,同时在双主双从模式下需要将balance=“1”。
writeType
- 0:写操作都转发到第1台writeHost,当writeHost1宕机,会切换到writeHost.2上:
- 1:所有的写操作都随机地发送到配置的writeHost.上;
switchType
- -1:不自动切换
- 1:自动切换
总结
荔枝要补充一下MyCat,MyCat是一个数据库中间件,主要是在MySQL执行分库分表操作中使用到的,用来支持读写分离的操作。后续荔枝也会梳理相关的文章进行介绍和知识归纳。在最后分享一点小感悟吧,荔枝觉得我们在学习的时候不要太过于陷于命令操作,而要花更多的时间去理解整个模式为什么这样设计以及底层实现的原理,多去思考这个技术到底是如何演进的,这个技术解决了什么问题有什么应用场景,以及这个技术还存在的问题是什么,有什么辅助的中间件可以一起搭配使用的?荔枝也正在努力往这种学习状态去改变,这样至少会留下比较完整的体系吧,不会导致知识一过脑,啥都没留下的情况哈哈哈哈,废话属实是有一点多哈哈哈哈,但是荔枝也希望能与大家共勉,一起成长进步!!!
今朝已然成为过去,明日依然向往未来!我是小荔枝,在技术成长的路上与你相伴,码文不易,麻烦举起小爪爪点个赞吧哈哈哈~~~ 比心心♥~~~