MySQL主从复制

前言:

在企业应用中,成熟的业务通常数据量都比较大,单台MySQL在安全性、高可用性和高并发方面都无法满足实际的需求,需配置多台主从数据库服务器以实现读写分离。

一.什么叫高可性:

高可用性:
指的是冗余备份包含性能指标(五大负载+内核优化方向)
安全性指标:网络部分安全性、通讯加密,用户登陆、管理权限安全性

二.MySQL设计思路

①MySQL主从复制:让slave服务器中的中继日志同步master二进制日志
②MySQL读写分离:基于主从复制以功能性拆分成读和写,缓解MySQL读写的压力,解决读写比例失恒,单台读写瓶颈的问题。
③MHA高可用:对master服务器做一个冗余备份工作。
三种方式:
①纵向扩展:强化自己服务器(五大资源,内核优化 加数据库内的优化,索引,存储过程,select查询等等
②横向扩展:增加服务器数量
③借助于内存/缓存数据库:Redis,来帮助MySQL缓存一些高热数据,减少MySQL压力
除此之外可以考虑是否需要做一些架构,服务上的改动

三.MySQL主从复制原理

3.1MySQL的复制类型

基于语句的复制(基于SQL语句)
基于行的复制(ROW基于行)
混合类型的复制(MIXED混合模式)

3.2MySQL主从复制默认使用的机制

全同步
半同步
异步(默认)

3.3MySQL主从复制工作过程

主从复制原理核心在于2个日志文件,3个线程(4个线程)
2个日志:二进制日志和中继
三个线程:master上的dump线程,slave上的IO线程和SQL线程
目的:slave上的中继日志趋近实时同步master上的二进制日志
过程:
dump线程会监听二进制日志的更新,如果有更新则会通知slave IO
首先slave上的IO线程向master上申请同步二进制日志的更新内容
dump线程会把同步的sql日志内容与slave服务器,slave的IO线程会把写入自己的中继日志
slave sql线程把日志中的更新语句同步执行到数据库内部,以达到和master数据库趋近一致

##master
二进制日志
线程:dump,用于监听binlog同时通知SLAVE I/O
##slave
relay log
线程1 :I/O
负责向master请求更新的日志内容
将更新的内容同步到本地的relay log
线程2: sql
将本地的relay log中的更新内容(对本地relay log 做监听),同步执行到自己数据库内

四.主从复制配置

虚拟机:
客户端client(测试)                 192.1683.80.1
mysql-master                      192.168.80.2
mysql-slave1                      192.168.80.3
mysql-slave2                      192.168.80.4
Ameoba                            192.168.80.5

4.1主从服务器时间同步

master服务器配置
①安装ntp,修改配置文件

 ntpdate ntp.aliyun.com
 hostnamectl set-hostname master  #将主机名改成master
 su 

同样slave1和slave2也同步阿里云服务器

ntpdate ntp.aliyun.com
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
su 

3台虚拟机设置计划任务

crontab -e 
*/10 * * * * /usr/sbin/ntpdate ntp.aliyun.com

编译安装5.7MySQL,启动MySQL

4.2配置主从同步

(1)master服务器修改配置文件

 vim /etc/my.cnf
19 log_bin=master-bin             #开启二进制日志文件(之后生成的日志名为master-bin)
20 log_slave_updates=true         #开启从服务器日志同步
21 server_id=11                   #主服务器id为11(不可重复)

重启服务

systemctl restart mysqld 

(2)从服务器配置

vim /etc/my.cnf
 17 log_bin=master-bin          #开启二进制日志文件
 18 server_id = 23              #设置 server1 id为22,server2 id为23
 19 relay-log=relay-log-bin     #从服务器上同步日志文件记录到本地
 20 relay-log-index=slave-relay-bin.index   #定义relay-log的位置和名称(index索引)

在这里插入图片描述

4.3配置规则

[root@master mysql]#  mysql -u root -p
mysql> grant replication slave on *.* to 'myslave'@'192.168.80.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
#给从服务器提权,允许使用slave的身份复制master的所有数据库的所有表,并指定密码为123456

mysql> flush privileges;   #刷新权限表
Query OK, 0 rows affected (0.01 sec)
show master status;   查看状态

在这里插入图片描述

mysqlbinlog --no-defaults --base64-output=decode-rows -v master-bin.000001

在这里插入图片描述

开启从服务器功能

change master to master_host='192.168.80.2',master_user='myslave',master_password='123456',
master_log_file='master-bin.000001',master_log_pos=603;

开启从服务器同步

start slave;

查看slave的状态

show slave status\G

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查看主从是否同步的点在于
I/O和SQL的两个yes
当不同步时,需要查看的
1、last_error(全局,sql线程的、I/O线程的)

4.4验证主从同步

master创建表,在从服务器器上依旧可以查看到
在这里插入图片描述
在这里插入图片描述

五.小结

MySQL主从复制与读写分离是密切相关的,介绍了MysQL的主从复制(同步),紧接着下一篇会介MySQL读写分离。

这里简单介绍一下二进制日志:
MysQL的二进制日志是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的SQL语句二进制日志中记录了对MySQL数据库执行更改的所有操作,并且记录了语句发生时间、执行时长、操作数据等其他额外信息,但是它不记录SELECT 、SHOW等不修改数据的SQL语句。
同步失败可使用以下方法尝试解决:
忽略当前的错误执行 下一步同步
先stop slave;
slave 数据库中:

set global sql_slave_skip_counter=1;
start slave;

I/o线程一直处于connecting
第一件事,看laster error,报错项内容是为支点找不到

stop slave;

slave数据库中:

CHANGE MASTER TO MASTER _LOG_FILE= 'mysql-bin.000001',MASTER _LOG_POS=0;

遇到这个是因为binlog位置索引处的问题,生产环境下不要直接reset slave(删除change master操作的) ;

reset slave会将主从同步的文件以及位置恢复到初始状态,一开始没有数据还好,有数据的话,相当于重新开始同步,可能会出现一些问题;
一般做主从同步,都是要求以后的数据实现主从同步,而对于旧的数据完全可以使用数据库同步工具先将数据库同步,完了再进行主从同步;

遇到上面的问题,正确的做法是

1.打开主(master)服务器,进入mysql
2.执行flush logs;  //这时主服务器会重新创建一个binlog文件;
3.在主服务上执行show master slave\G
4.来到从服务器的mysql;
5.stop slave;
6.change master to master_log_file='mysql-bin.000002',master_log_pos=154;
//这里的file和pos都是上面主服务是master显示的。
7.start slave; 
8.show slave status\G;

主从复制产生的两个日志:
二进制日志(bin-log):不可以拿来使用,同步到数据库内部的文件。需要使用工具备份
中继日志(relay-log):可以被sql线程直接引用,同步到数据库内部的

主从原理:
master的dump线程监控二进制,通知slave I/O
slave 的I/O过来之后,会请求读取二进制更新内容,并写入自己的relay—log
slave 的sql线程会读取本地relay—log同步写入到slave的mysql数据库中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值