redis 和 mysql 的主从复制
1. mysql主从复制
(1) 为什么要做主从复制?
1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
2、做数据的热备
3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
(2) 什么是mysql的主从复制
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
(3) 主从复制原理
1. master服务器将数据的改变记录在二进制binlog日志上,当master上的数据发生改变时,将其写入二进制文件中;
2. slave服务器会在一定时间间隔内对master二进制日志进行探测是否发生改变,如果发生改变,则开始一个I/O Thread请求master二进制事件
3. 同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制时间,并保存至 从节点 本地的中继日志中,从节点 将启动sql线程从中继日志中读取二进制日志,在本地释放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
简单说:
- 从库会生成两个线程,一个I/O线程,一个SQL线程;
- 主库会生成一个log dump线程,用来给从库I/O线程传binlog;
- I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
- SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;
(4) 需要注意的事
1) Master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能,通常为了数据安全考虑,salve也开启binlog功能)
2) Slave开始俩个线程:IO线程和sql线程,其中:IO线程负责读取master的binlog内容到中继日志relay log里,sql线程负责从中继日志里读取binlog内容,并更新到slave的数据库,这样就能保持slave数据和master数据保持一致了
3) 至少有俩个Mysql的服务
4) 最好确保master和slave服务器上的Mysql版本相同,或者主服务器小于子服务器
5) Master和slave 俩节点时间需同步
(5) 主从复制延迟问题
原因:
mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生的日志写进binlog,由于binlog是顺序写,所以效率很高,
slave的sql thread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作是随机的,不是顺序,所以成本要高很多,
另一方面,由于sql thread也是单线程的,当主库的并发较高时,产生的DML数量超过slave的SQL thread所能处理的速度,
或者当slave中有大型query语句产生了锁等待,那么延时就产生了。
解决方案:
1.业务的持久化层的实现采用分库架构,mysql服务可平行扩展,分散压力。
2.单个库读写分离,一主多从,主写从读,分散压力。这样从库压力比主库高,保护主库。
3.服务的基础架构在业务和mysql之间加入memcache或者redis的cache层。降低mysql的读压力。
4.不同业务的mysql物理上放在不同机器,分散压力。
5.使用比主库更好的硬件设备作为slave,mysql压力小,延迟自然会变小。
6.使用更加强劲的硬件设备。
注: MySQL5.7之后使用MTS并行复制技术,永久解决复制延时问题。
redis的主从复制
流程
1.全量复制
发生节点: 在slave 从服务器初始化阶段,需要将master主服务器上的所有数据都复制一份,流程如下:
从服务器连接主服务器,并发送sycn命令
主服务器接收到sycn命令后,执行bgsave命令生成RDB文件,并且在缓冲区中记录之后所有的操作记录
master执行完bgsave后,master将RDB文件发送给slave,并在此阶段内继续在缓冲区内写操作
slave在接收到RDB文件前 ,会将自身的数据全部丢弃,载入RDB
master发送完毕,会向slave 的缓冲区发 写入执行命令
slave 完成对RDB的载入,开始接受命令请求,并执行缓冲区的命令
2.增量复制
发生节点: 在slave完成初始化且开始正常工作后,master发生的写操作会同步到slave上
redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
操作
slave 执行以下命令
SLAVEOF 127.0.0.1 6379 【ip port】 使slave成为master 的从节点
特点
采用异步复制
一个master可以有多个slave,且一个slave下也可以有slave
在主从复制的过程中,master是非阻塞的,一直对外提供读写服务,slave只能对外提供读服务(可配置),不支持事务
当master宕机之后,整个服务停掉,只能提供读服务
当slave宕机重启之后,会向master发送sync指令进行全量同步,当有多个从服务器重启,会导致master IO剧增宕机
全量复制代价很大,所以尽力只在第一次初始化的时候做一次,在redis 2.8之后引入了部分复制
部分复制
部分复制是Redis 2.8以后出现的,用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发丢失数据给从节点。因为补发的数据远远小于全量数据,可以有效避免全量复制的过高开销,需要注意的是,如果网络中断时间过长,造成主节点没有能够完整地保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制

过程:
如果网络抖动(连接断开 connection lost)
主机master 还是会写 repl_back_buffer(复制缓冲区)
从机slave 会继续尝试连接主机
从机slave 会把自己当前 run_id 和偏移量传输给主机 master,并且执行 pysnc 命令同步
如果master发现你的偏移量是在缓冲区的范围内,就会返回 continue命令
同步了offset的部分数据,所以部分复制的基础就是偏移量 offset。
转自:https://www.jianshu.com/p/4aa9591c3153
redis 和 mysql 的主从复制的更多相关文章
- 使用HAProxy、PHP、Redis和MySQL支撑每周10亿请求
在公司的发展中,保证服务器的可扩展性对于扩大企业的市场需要具有重要作用,因此,这对架构师提出了一定的要求.Octivi联合创始人兼软件架构师Antoni Orfin将向你介绍一个非常简单的架构,使用H ...
- 使用 HAProxy, PHP, Redis 和 MySQL 轻松构建每周上亿请求Web站点
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- mysql的主从复制是如何实现的
前言 MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为 ...
- mysql数据库主从复制部署笔记
主从复制是mysql中数据库实时同步的一个常用做法了,今天我来给各位介绍一下关于mysql数据库主从复制部署一个过程,希望此例子对各位同学参考参考. 数据库主从复制原理: 数据库的主从复制就是从mas ...
- mongodb,redis,mysql 简要对比
本篇内容大部分不是原创,转载的会贴有链接. 准备学习下数据库,想对目前的主流数据库做一个简单的了解分析,就搜集了资料整理到了一块. 当下主流的要数NoSql数据库了,拥有强大的高并发能力. mongo ...
- redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)
一.redis简介Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录 ...
- Redis与MySQL的结合
Redis与MySQL的结合 目前大部分互联网公司使用MySQL作为数据的主要持久化存储,那么如何让Redis与MySQL很好的结合在一起呢?我们主要使用了一种基于MySQL作为主库,Redis作为高 ...
- 利用redis协助mysql数据库搬迁
最近公司新项目上线,需要数据库搬迁,但新版本和老版本数据库差距比较大,关系也比较复杂.如果用传统办法,需要撰写很多mysql脚本,工程量虽然不大,但对于没有dba的公司来说,稍微有点难度.本人就勉为其 ...
- mysql之主从复制
原理--> 在数据库层面,复制语句或者行,因为在数据库层面,故只有主服务器生成,并放到二进制日志里面,才能复制给从服务器. 原理--> mysql的主从复制基于异步,主要有三个进程执行,分 ...
随机推荐
- HMS Toolkit助力开发者高效集成HMS Core
当你的应用想集成华为HMS Core服务和上线华为应用市场,或当你已经开发了一个Android应用并集成了第三方移动服务,需要迁移使用HMS Core服务和上线华为应用市场的时候,如何快速.便捷.高效 ...
- 使用Leaflet创建地图模块
背景 最近需要为某单位开发地图展示系统,因此开始涉略和使用Leaflet这个轻量级地图库. 创建基础地图需要以下几步 引入相关js和css文件,创建基础地图 <div id="map& ...
- 1. Intellij IDEA导入,主题修改,布局界面+部分工具栏菜单介绍
Project 和module 的区别 module 相当与eclispe的项目project 相当与eclpise的工作空间 主题的修改 Setting的快捷键:Ctrl+shift+S
- 今日浅谈循环 for与while
昨天写的条件分支结构与今日写的循环是编程两个最基本的也非常重要的个结构 for循环 for循环可以从一个元组(tuple),列表(list),字典(dict),集合(set),字符串(string') ...
- 本地使用apache设置绑定多个域名
Apache开启了使用虚拟主机的功能: 打开Apache安装目录下conf/httpd.conf文件,找到 #LoadModule vhost_alias_module modules/mod_vho ...
- 技术面试问题汇总第005篇:猎豹移动反病毒工程师part5
这是我当初接受面试的最后两个问题,当时,那位面试官问我对漏洞了解多少时,我说一点都不懂,问我懂不懂系统内核时,我同样只能说不知道.后来他跟我说,面试的考查重点不在于我所掌握的知识的广度,而是深度.这也 ...
- 病毒木马查杀实战第011篇:QQ盗号木马之专杀工具的编写
前言 由于我已经在<病毒木马查杀第004篇:熊猫烧香之专杀工具的编写>中编写了一个比较通用的专杀工具的框架,而这个框架对于本病毒来说,经过简单修改也是基本适用的,所以本文就不讨论那些重叠的 ...
- POJ 1961 KMP(当前重复次数)
题意: 前缀重复次数,举个例子,aaa 2的位置2个a,3的位置3个a abcabcabc 6的位置两个abcabc,9的位置三个abcabc.... 思路: KMP基础题目之一 ...
- Docker安装和helloworld
0.基本简介(想直接实操,直接跳过去看1就好) Docker 在容器的基础上,进行了进一步的封装,从文件系统.网络互联到进程隔离等等,极大的简化了容器的创建和维护.使得 Docker 技术比虚拟机技术 ...
- WDK 标准数据类型
刚刚看到vs2012可以完美支持wdk开发,心中窃喜,正要下载,竟然看到xp不在其支持范围内, 这让刚刚从win7换过来的我真是DT,算了,还是和学习资料保持一致,反正学习的重点不是方便 正题: 为了 ...