主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。当系统访问量大时,单数据库可能无法保证系统的性能,需要配置多台数据库来提高系统性能进行读写分离,把访问量分担,同时主从复制也起到了一个数据备份的功能。
文章目录
主从复制的作用
- 主数据库出现问题,可以切换到从数据库。
- 可以进行数据库层面的读写分离。
- 可以在从数据库上进行日常备份。
MySQL主从复制解决的问题
- 数据分布:随意开始或停止复制,并在不同地理位置分布数据备份
- 负载均衡:降低单个服务器的压力
- 高可用和故障切换:帮助应用程序避免单点失败
- 升级测试:可以用更高版本的MySQL作为从库
MySQL主从复制工作原理
简单通俗说,主机把改变操作记录保存到一个日志文件中,从机获取到这个日志文件,在自己的机器上运行
- 在主库上把数据更新记录到二进制日志
- 从库将主库的日志复制到自己的中继日志
- 从库读取中继日志的事件,将其重放到从库数据中
基本原理流程,3个线程以及之间的关联
主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;
从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进自己的relay log中;
从:sql执行线程——执行relay log中的语句;
复制过程
Binary log:主数据库的二进制日志
Relay log:从服务器的中继日志
第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中。
第二步:salve开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是binlog dump process。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中。
第三步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。
一主一从主从复制实战
环境准备
准备两台装有mysql数据库的机器,在此笔者使用了两台虚拟机系统是ubuntu18.04,在一台机器安装好mysql数据库之后克隆就行了(通过这种方法会有一个坑后面再说),保证这两台虚拟机可上网可以相互ping通。
主机配置
修改数据库配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf, 注意:这个文件根据安装mysql方式不同路径不同,需要找到自己mysql的配置文件 在[mysqld]节点中配置如下:
配置说明:
- server-id:指定master服务id,必须
- log-bin=mysql-bin:需要打开日志文件,必须,这里有些人会指定一个目录,但是笔者指定一个目录之后发现mysql就启动不起来了,这里直接设置为 mysql-bin 就可以,生成的文件过后是可以使用命令查看的
- 错误日志文件归集路径,可选
- read-only=0 数据库读写模式 因为主机一般都是可读可写的,也可以使用默认值这项可选, 0为可读可写,1为只读
- binlog_do_db :这项可选所以没有配置,意思 要复制哪些数据库
- binlog_ignore_db 这项可选所以没有配置,意思 忽略复制哪些数据库
这里就完成了主机数据库配置文件的修改,保存之后重启mysql服务。
从机配置
从机数据库配置相对简单点,也是修改数据库配置文件(如上路径),只需要在【mysqld】节点中配置server-id即可:
server-id不能和主机重复了,read-only这里理论上从机只做读操作,所以设置为1,但是这里有坑下文再说
从机的配置配置一个server-id就可以了保存退出,重启服务,这里我们就配置好了一台主机和从机 主机:192.168.192.133 从机:192.168.192.132
查看log-bin文件的生成位置
- 首先登录到数据库中 mysql -u root -p 根据提示输入密码
- 输入命令:show variables like ‘%log_bin%’;
在图中我们可以看到log_bin 的value是ON说明是打开了二进制文件配置,log_bin_basenaem 的value 就是文件的保存地址,去到目录查看
这里的mysql-bin.000001就是生成的二进制文件了
主机给从机链接授权
1.mysql -u root -p 根据提示输入密码
2. 使用命令:grant REPLICATION SLAVE ON *.* to 'ayou'@'192.168.192.132' identified by '123456';
3. 命令解析grant: 是数据库的授权命令
ayou:被授权的账号
REPLICATION SLAVE:复制权限
‘192.168.192.132’:被授权登录的从机ip
‘123456’:被授权账号的密码
执行命令后,再执行刷新权限表命令:
FLUSH PRIVILEGES;
查看某个账号被分配权限的命令:如
show grants for ‘ayou’@‘192.168.192.132’
使用命令查看master状态
show master status
- file:二进制文件,从机要复制主机的哪一个二进制文件
- position:磁道,就是从机要从哪一个节点开始复制主机的内容
- binlog_Do_DB:要复制的哪一个数据库(这一项可在上文配置文件配置)
- Binlog_Igore_DB:要排斥复制的哪个数据库,(这一项可在上文配置文件配置)
从机连接主机配置
在上文中在主机中为从机账号授权了,现在要通过这个账号来连接主机,步骤如下:
1.登录数据库mysql -u root -p
2.登录成功后输入命令:change master to master_host='192.168.192.133',master_user='ayou',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=10756;
命令详解:
master_host:主机ip地址
master_user:master授权账号
master_password:master授权的密码
master_log_file:对应的二进制文件,如上图所示的FIle
master_log_pos=:对应的是master上的磁道(通俗将就是你要从二进制文件的哪个地方开始做复制)
3.输入成功后执行如下命令启动slave,:
start slave;
4.执行如下命令查看slave状态:
show slave status\G;
slave_Io_State:状态必须显示为 Waiting for master to send event
Slave_IO_Running:YES 状态必须显示为 YES
Slave_SQL_Running:YES 状态必须显示为 YES
以上三项条件必须满足才证明主从之间的通道打开。
更新主机数据库,在从机看是否同步成功
如上所示我们在主机数据库创建了test数据库,在test数据库中创建了test数据表,在表中插入了一条记录,按理说主从连接通道已经建立好此时去从机查看就会和主机数据一致,我们查看从机数据库。
再试一次,在主机上插入数据
insert into test values(1,‘234789’);
返回从机查看,
发现数据同步是成功的,说明我们的主从复制是生效的.
这里补充一下,如果在生产过程中,你的从库是后面再搭建的而主库已经有一些数据库表和数据了, 从库数据的复制是从主从架构搭建之后的,所以搭建之前的主库的数据需要手动导入到从库后建立主从复制机制。
要把主数据库和从数据库的责任分担明确
上文操作中我们已经把主从复制搭建好了,但是“主从复制”这四个字常常伴随着“读写分离”四个字,在开发中我们为了避免主从数据库数据冲突,需要给主数据库可读可写的权限,从数据库拥有读的权限就可。写数据的时候都往主数据库写,而读数据时则可以通过java或其他程序来规定读取哪个数据库。
本文小结
本文详细分析了mysql数据库的主从复制,但是在实际的操作过程中可能会遇到不少问题。