Mysql主从同步从原理到实践

为什么要进行主从同步配置

随着数据的增多,单机的数据库往往支撑不住快速发展的业务,所以就需要读写分离的数据集群方式。集群的方式也可以有很多种,如一主一丛,一主多从,多主一丛等等。

而读写分离的实现方式就是通过主从配置,在主库上进行写操作,在从库上进行读操作;主库会同步数据到从库保证数据的一致性。

大部分的业务都是读操作远远大于写,所以当数据库遇到瓶颈的时候,还可以通过增加从库达到水平拓展,增加性能的目的。

读写分离原理图

主从同步的原理

主从同步的原理是master将写的操作按顺序记录下来,传给slave,然后slave根据操作日志,同步数据。

可以分别从master上slave查看对应的操作。

从master上看

1:当master上的数据发生变化时,按照顺序将该事件写入到bin-log中。

2:假如有slave链接到master,为slave开启binlog dump线程。

3:当binlog发生改变后,bin-log dump线程通知slave,将对应的binlog内容发送给slave。

从slave上看

1:开启主从同步后,首先创建两个线程,I/O线程和Sql线程。

2:I/O线程连接到master,master上的bin-log dump线程会将内容发送给该I/O线程,接收到内容后,将内容写入到本地的relay log中。

3:sql线程读取对应的relay log,根据里面的内容对slave数据库做相应的操作。

主从同步架构

主从同步延迟及解决方案

从主从同步原理分析可知,数据的通过是通过master记录操作日志,slave再根据操作日志进行数据通过的,所以两者之间肯定存在延迟现象。

主从同步延迟的主要原因:

1:主库只针对写操作,顺序写binlog,效率很高。

2:从库的I/O线程到主库取日志,效率也比较搞。

3:从库的Sql线程是单线程,同时DML和DDL的IO操作也是随机的,不是有序的,也还有可能会和从库上的其它查询产生lock争用。

4:主库Tps较大,需要同步的数据超过从库一个sql线程所能承受的范围

所以综合来看,主要原因可能是数据库在业务上读写压力太大,CPU计算负荷大,网卡负荷大,硬盘随机IO太高;次要原因:读写binlog带来的性能影响,网络传输延迟。

那么既然有延迟,应该如何解决呢?

主从同步延迟解决方案

1:架构方面

  • 业务持久层采用分库架构,mysql服务平行拓展,分散压力。
  • 单库读写分离,一主多从,读写分离,分散压力。
  • 在业务层和mysql之间加入cache,降低mysql读压力。
  • 不同业务的mysql放在不同机器,分散压力。
  • 读库采用比主库更好的硬件设备

2:硬件方面

  • 使用较好的服务器
  • 加强服务器的I/O性能

3:mysql服务配置方面

主要是对从数据库进行一些配置,加快从数据库对数据的同步。

  • 关闭binlog日志binlog sync_binlog=0
  • 不主动触发在提交事务后写入磁盘innodb_flush_log_at_trx_commit=0
主从同步实践

主从同步的原理清楚了,那么就开始真正的实践一下主从同步。

1.环境清单

  • 两台linux服务器,能相互ping通
  • 在服务器上分别装有mysql,开启远程连接

准备的两台虚拟服务器分别为192.168.145.129,192.168.145.131,下文用129和131代替。其中131作为主库,129作为从库。

2.主库配置

1.修改msyql的my.cnf(默认路径/etc/my.cnf)添加如下:

log-bin=mysql-bin   #[必须]启用二进制日志
server-id=1  #[必须]服务器唯一ID,默认是1,一般取IP最后一段
bind-address = 0.0.0.0       #这样表示允许所有网段连接,可根据实际情况指定网段

2.进入mysql终端,设置读取账号

-- 进入终端
mysql -uroot -p123djs;

-- 创建读取账号
-- 账号 backup 密码 backup123
CREATE USER 'backup'@'%' IDENTIFIED BY 'backup123';
-- 分配授权
GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%';


-- 刷新权限表
flush privileges;

-- 退出mysql终端,重启mysql
service mysql restart;

3.使用原有读写账号查看master状态

show master status;

master状态

3.从库配置

1.修改msyql的my.cnf(默认路径/etc/my.cnf)添加如下:

#[可选]启用二进制日志,一般不启用
#log-bin=mysql-bin   
#此ID需和master不一致
server-id=2    

-- 退出mysql终端,重启mysql
service mysql restart;

2.登录mysql终端后,关联master的binlog

-- 进入终端
mysql -uroot -p123djs;

-- 其中log_file和log_pos要和之前master中的binglog文件名和日志位置一致。
change master to master_host='192.168.145.131',
master_user='backup',
master_password='backup123',
master_log_file='mysql-bin.000001',
master_log_pos=154;

3.启动从库,查看从库

-- 启动从库
start slave;

-- 查看从库
show slave status\G;

4.查看是否成功

需要Slave_IO_Running线程和Slave_SQL_Running同时为成功时才代表成功。

主从配置成功

4.测试

主库上

-- 进入MySQL终端执行
create database test_slave;

从库上

-- 进入MySQL终端查看是否有test_slave
show databases;

主从同步测试结果


至此,基本的mysql主从配置已经完成,实际应用时仍然要根据具体的场景,选择相应的主从方式,例如一主多从,主从级联等架构;同时,主从同步的优化也需要根据实际场景进行处理。


参考文章

1:Mysql主从基本原理,主要形式以及主从同步延迟原理 (读写分离)导致主库从库数据不一致问题的及解决方案

2:面试官:谈谈你对Mysql数据库读写分离的了解,并且有哪些注意事项?

3:MySQL 主从复制简单搭建配置(简单,绝对能用)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值