一张思维导图纵观MySQL数据安全体系

《一张思维导图纵观MySQL数据安全体系》要点:
本文介绍了一张思维导图纵观MySQL数据安全体系,希望对您有用。如果有疑问,可以联系我们。

作者介绍 :
杨奇龙,前阿里数据库团队资深DBA,主要负责淘宝业务线,经历多次双十一,有海量业务访问DB架构设计经验.目前就职于有赞科技,负责数据库运维工作,熟悉MySQL性能优化、故障诊断、性能压测.

简介

和团队内部的同事一起沟通,讨论了MySQL数据库系统数据安全性问题,主要针对MySQL丢数据 、主从不一致的场景,还有业务层面使用不得当导致主备库数据结构不一样的情况,本文是基于以上的讨论和总结做的思维导图.

思维导图

一张思维导图纵观MySQL数据安全体系

内容展示

OS

  • BBU:数据库服务器要配置BBU,BBU在电源供应出现问题的时候,为RAID控制器缓存提供电源.当电源断电时,BBU电力可以使控制器内缓存中的数据可以保存一定时间(根据BBU的型号而决定).用户只需要在BBU电力耗尽之前恢复正常供电,缓存中的数据即可被完整的写回RAID中,避免断电导致数据丢失
  • 防止OS异常断电导致数据无法正常落盘
  • 磁盘禁用cache,MySQL的 O_DIRECT 方式可以跳过pagecache写数据

单机

(1)redo log

innodb_flush_log_at_timeout

< 5.6.6: 每隔一秒将redo log buffer中的数据刷新到磁盘

>= 5.6.6:每隔innodb_flush_log_at_timeout秒将数据刷新到磁盘中去

一张思维导图纵观MySQL数据安全体系

(2)binlog

sync_binlog  =1

(3)innodb buffer data

不同的flush mathod刷数据的图形展示.图片来自hatemysql.com.

一张思维导图纵观MySQL数据安全体系

(4)InnoDB 落盘

MySQL数据落盘的路径,图片来自李春hatemysql.com.

一张思维导图纵观MySQL数据安全体系

主从不一致

  • 主库insert之后再回滚,主备库自增主键不一致
  • 使用replace into操作,导致主备库自增主键不一致
  • set session sql_log_bin=0

业务架构

常见的双写

“丢”数据的场景

(1)slave_skip_counter 不合理

slave_skip_counter =1
slave_skip_counter >1

(2)DB Crash,OS正常

innodb_flush_log_at_trx_commit=0
事务提交时,不刷新缓存,系统刷新的频率是1s,故会丢失1s的数据.

innodb_flush_log_at_trx_commit=1
事务提交时,会刷新到磁盘,保证事务落盘,故不丢数据.

innodb_flush_log_at_trx_commit=2
事务提交时,刷新到os cache,系统没有crash,数据无丢失.

(3)DB正常,OS Crash

带有 BBU

innodb_flush_log_at_trx_commit=0
事务提交时,数据无丢失.

(4)slave非实时写redo和binlog丢失数据

在slave机器上会存在三个文件来保证事件的正确重放:relay log、 relay log info、 master info.

(5)异步模式

  • 事务T1写入binlog buffer;
  • dumper线程通知slave有新的事务T1;
  • binlog buffer进行checkpoint;
  • slave因为网络不稳定,一直没有收到t1;master挂掉,slave提升为新的master,t1丢失.

(6)semi sysnc

after_commit

比如主库操作update t1 set val=1 where id=10将val从5修改为1 .

  1. 会话session1在主库提交update t1 set val=1 where id=10 ;commit;
  2. 主库根据二阶段提交将数据持久化到innodb和提交日志binlog;
  3. 同步日志到slave,并等待slave 返回ack信息,等待的实际时间以 rpl_semi_sync_master_timeout 为准,超过该设置时间则超时,主库返回给客户端成功写入信息.
  4. 接收到来自slave的ack信息,返回成功给OK客户端.

分析:

  • 第四步之前,master还未收到slave的ack信息,此时由于事务已经提交,除了session1,其他会话是可以看到 val=1.
  • 主库服务器down或者主库实例crash,此时发生HA切换.
  • 主库未接收到slave的ack信息,slave接收到日志并落盘,应用binlog更新.t1.val=1,此时业务切换到slave上能获取到一致的数据.
  • 如果在slave还未接收到binlog并且主库挂了,因为主库已经提交,此时主库t1.val是1而从库t1.val是5,主备不一致.

    after_sync

    比如主库操作update t1 set val=1 where id=10将val从5修改为1.

    1. 会话session1在主库提交 :update t1 set val=1 where id=10;commit;
    2. 主库将事务写入binlog.
    3. 将binlog同步给slave,不提交.
    4. 等待slave返回ack信息,等待的实际时间以rpl_semi_sync_master_timeout为准,如果超时master改为异步模式.
    5. 接收到来自slave的ack信息,主库进行提交并且返回成功给OK客户端.

    分析:

    • 如果在第3步等待slave ack的过程中,主库发生crash(此时t1.val=5),HA 切换到slave,应用查询slave .如果slave接收到binlog并发送ack给master,则t1.val=1.
    • 如果slave响应主库,但是主库crash,此时因为主库还没提交t1.val=1,slave t1.val=5,但是主库启动恢复之后t1.val会变成5,主备还是一致的.
    • 如果slave未接收到事务和响应主库,此时t1.val=5,无论哪种状态,对于所有客户端数据库都是一致,事务都没有丢失.

      知识点:两阶段提交

      第一阶段是先prepare、再同步写redo log,第二阶段同步写binlog、再commit,如果在写入commit标志时崩溃,则恢复时,会重新对commit标志进行写入.

      HA切换

      (6)主从

      binlog_format

      ROW(最安全)
      MIXED(不推荐)
      STATEMENT(不推荐)

      sync_binlog

      =0:由os系统的刷新机制来控制,刷新数据到磁盘的频率
      =1:每次commit刷新到磁盘
      >1:每N次提交刷新到磁盘

      innodb_support_xa

      版本要打开,保证binlog提交的顺序,否则乱序的binlog在恢复或者slave应用的时候会有问题,及以后废弃,始终支持两阶段提交.

      crash safe

      crash-safe就是将relay-info.log的信息保存在InnoDB的事务表中,这时执行relay log中的事务和写relay info在一个事务中,就能得到原子性保证.从而避免已执行的binlog位点和写入relay log info的位点信息不一致的情况发生.

      IO thread

      master-info-repository=TABLE
      sync_master_info=N:每N个event刷新一次表

      SQL thread

      relay-log-info-repository=TABLE
      sync_relay_info=N:每N个event刷新一次表

      relay-log-recovery

      当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性.

      relay_log_info_repository = TABLE
      relay_log_recovery = 1

      http://mysqlserverteam.com/relay-log-recovery-when-sql-threads-position-is-unavailable/

      semi_sync

      • after commit:master把每一个事务写到二进制日志并保存到磁盘上,并且提交(commit)事务,再把事务发送给从库,开始等待slave的应答.响应后master返回结果给客户端,客户端才可继续.
      • after sync:master把每一个事务写到二进制日志并保存磁盘上,并且把事务发送给从库,开始等待slave的应答.确认slave响应后,再提交(commit)事务到存储引擎,并返回结果给客户端,客户端才可继续.

      GTID

      相比位点复制,能减少不一致的概率

      参考资料

      • MySQL数据丢失讨论http://hatemysql.com/?p=395
      • 细看InnoDB数据落盘http://hatemysql.com/?p=503
      • MySQL5.7 深度解析:Loss-Less半同步复制技术
      • MySQL 5.7 Replication相关新功能说明

      原文来自微信公众号:DBAplus社群

      版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


每个HTTP请求和响应都会带有相应的头部信息。默认情况下,在发送XHR请求的同时,还会发送下列头部信息: Accept:浏览器能够处理的内容类型 Accept-Charset:浏览器能够显示的字符集
&quot;Markdown自动生成目录&quot; &quot;使用npm语法生成&quot; &quot;1、安装npm&quot; &quot;2、安装doctoc插件&quot; &quot;
当我们从客户端向服务器发送请求时&#160;服务器向我们返回状态码&#160;状态码就是告诉我们服务器响应的状态&#160;通过它,我们就可以知道当前请求是成功了还是出现了什么问题&#160;状态码是
原理 介绍 哈希表(Hash table,也叫散列表), 是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映
一 共享秘钥 1.1 概念 共享秘钥和我们生活中同一把锁的钥匙概念类似,对同一把锁来说,加锁时使用什么钥匙,解锁也必须使用同样的钥匙。 1.2 共享秘钥在HTTP传输中的缺点 以共享密钥方式加密时必须
正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器这个代理服务器呢,他能访问那个我不能访问的网站于是我先连上代
如果你是网站的开发者或维护者,就不得不重视盗链的问题了。如果你刚刚开发完一个没有防盗链的带有文件下载功能的网站,挂上internet,然后上传几个时下非常热门的软件或电影并在网站内公布下载地址,让MS
select,poll,epoll区别总结 select,poll,epoll都是I/O多路复用。I/O多路复用就是通过一种机制,可以监测多个描述符,一旦某个描述就绪(一般是读或者写),能够通知程序进
PS: https就是http和TCP之间有一层SSL层,这一层的实际作用是防止钓鱼和加密。防止钓鱼通过网站的证书,网站必须有CA证书,证书类似于一个解密的签名。另外是加密,加密需要一个密钥交换算法,
一、什么是http协议 HTTP是一个应用层协议,无状态的,端口号为80。主要的版本有1.0/1.1/2.0. HTTP/1.* 一次请求-响应,建立一个连接,用完关闭; HTTP/1.1 串行化单线
host文件的工作原理及应用 Hosts文件是一个用于存储计算机网络中节点信息的文件,它可以将主机名映射到相应的IP地址,实现DNS的功能,它可以由计算机的用户进行控制。 一、Hosts文件基本介绍
HTTP 2.0是在SPDY(An experimental protocol for a faster web, The Chromium Projects)基础上形成的下一代互联网通信协议。HTT
虚拟地址和物理地址 第一层理解 1、每个进程都有自己独立的4g内存空间,每个进程的内存空间都具有类似的结构。 2、一个新进程建立的时候,将会建立自己的内存空间,此进程的数据,代码等数据从磁盘拷贝到自己
0x00 前言 发现自己学习python已经有半个月了,也开发了自己的一些渗透的小脚本,但觉得还是不够,我个人觉得工具和脚本还有框架是个本质上的区别。脚本的话,不会考虑到其他的一些因素,例如报错和交互
0x00 前言 由于昨天520,今天又是521,我被朋友圈和qq空间给刷屏了,都在秀对象。一气之下决定把我上次写的nc拿出来使用类进行重构,多实例化几个对象,这下子我也有对象了。 0x01 一些小插曲
upload labs通关 0x00 前言 这段时间一直在忙,没时间来更新文章,这里就写篇upload labs的通关手册吧,现在包括网上也有很多upload通关手册,但是在这里还是想自己去写一篇,来
0x00 前言 介于这段时间比较忙,所以博客的更新也比较慢。本来想前几天就发这个mssql数据库的,但是因为mssql的结构比较复杂,利用方式也比较多,所以又去深入研究了一下mssql的数据库结构和各
0x00 了解数据库 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据库是以一定方式储存在一起、能与多个用户共享、
0x00 前言 现在access的站,比较少,有的话也是小型网站在用,因为access的性能比较差,多人访问都能卡死,所以很多网站都很少会采用access的数据库搭建。但是该学的我们还是得学。 0x0
记一次某企业实战 0x00 前言 近段时间来也没怎么更新过博客,在这里就来水篇文章吧。 前段时间一直在做项目,也来分享并且记录一下自己的一些成果,和一些小思路。 0x01 信息收集 渗透的第一步肯定是