作者:luyaran

www.blog.csdn.net/luyaran/

Mysql的使用非常普遍,跟mysql有关的话题也非常多,如性能优化、高可用性、强一致性、安全、备份、集群、横向扩展、纵向扩展、负载均衡、读写分离等

要想掌握其中的精髓,可得花费不少功力,虽然目前流行的mysql替代方案有很多,可是从最小成本最容易维护的角度而言,mysql还是首选。下面从应用场景的角度切入,对mysql的技术点进行组织,写一份知识图谱,方便进行更深入的学习和总结。

如下图整理,我试着把Mysql的应用场景分为6种,每种场景下需要考虑的重点问题不一样,从而引出不同问题点下需要补齐的知识点,后续继续基于这些知识点进行学习和整理。(期待大家的意见和提供学习材料,谢谢!)

一、单Master

单Master的情况是普遍存在的,对于很多个人站点、初创公司、小型内部系统,考虑到成本、更新频率、系统重要性等问题,系统只依赖一个单例数据库提供服务,基本上已经满足需求。这种场景下我觉得重点应该关注的话题有上图所示的四点。

其中最重要的环节是数据备份,如果是交易量非常低,并且具有非常明确的服务时间段特性的话,简单的mysqldump是可以胜任的。但是这是有缺陷的,数据还原之后注定从备份点到还原点之间的数据会丢失。然而在极多数的情况下,备份的工作是没法马虎的,如下列举的几点小细节,之后将分享更多操作性的文章。

1)冷备:

停机,直接copy物理文件,InnoDB引擎(frm文件、共享表空间文件、独立表空间文件、重做日志文件、my.cnf)。

恢复:把文件copy到对应目录。

2)热备:

Ibbackup或者XtraBackup工具,记录重做日志文件检查点的LSN,copy共享表空间文件以及独立表空间文件(不产生任何阻塞),记录copy后重做日志文件检查点的LSN,copy备份是产生的重做日志。

恢复:恢复表空间文件,应用重做日志文件。

3)温备:

mysqldump,--single-transaction参数进行事务管理保证数据一致性。备份时不能用DDL语句。恢复:直接执行文件,mysql –uroot –p <文件名.sql>

二进制半同步复制,主从服务器增量复制

恢复:mysqlbinlog

二、一主一从

考虑一主一从的多数初衷是系统性能和系统高可用性问题,除了单Master场景中的备份工作需要做好以外,还有性能优化、读写分离、负载均衡三项重点工作需要考虑。

其中性能优化的内容比较多,也是一块大主题,要从系统的服务指标作为依据采取相应的动作,多数系统要求的是3秒内完成请求,总体换算下来,数据库大概可以有1.5秒的总执行时间,能满足这个性能要求就是合理的优化方案。

之后以这样的优先级来分别整理内容:索引优化 -> 表设计优化 ->数据库配置优化 ->硬件优化。

读写分离和负载均衡的实现相对简单些,我目前维护的系统比较落后,没有做读写分离,因为是一套以报表类功能为主的系统,而负载均衡是依赖php代码来做的,从实际运维效果来看,不大理想,而且负载均衡的代码过分嵌入到业务逻辑代码中,给代码维护带来一定噪音。之后计划对各种中间件进行实践和性能测试,到时候把一些测试数据分享出来。

三、一主 n 从

一旦开始考虑一主多从的服务器架构,则证明你的系统对可用性、一致性、性能中一种或者多种的要求比较高。好多系统在开始搭建的时候都会往这个方向看齐,毕竟这样“看起来”系统会健壮很多。

不过其实并不能单单依靠mysql的配置和mysql自带的中间件来解决可用性、一致性方面的问题。

四、横向集群

系统庞大到需要分库分表,其实是一件可喜可贺的事情,但是切记的是要前面提到性能优化工作做到极致之后才好考虑这些会增加系统复杂度的解决方案。横向集群主要是从业务特性的角度对系统进行切分,最彻底就是切分成了各个子系统,子系统之间通过一些数据同步的方案来把一些核心数据进行共享,以避免跨库调用跨库join。扩展:为什么代码规范要求SQL语句不要过多的join?

然后是各种系统接口调用,把大事务拆成小事务,事务之间做好隔离和同步。上图中的三个问题在横向集群的架构体系中应属于很有特色的问题,在实际项目中其实是尽量去避免这些需求的存在的,不过如果确实需要了,也得有解决方案。之后也将针对这些问题进行逐一整理,并测试一下一些号称支持这些功能的中间件。

五、纵向集群

横向集群的切分思路最终是切分子系统,而纵向集群最后遇到的最棘手的问题是扩缩容,我运维的一个系统是提前对数据做了256个切片,256切片中0~127切片和128~255切片分别存在两个一主两从的数据库集群中,系统运维了3年多,目前还没有扩容需求。设计初衷应该是考虑得到,假设有一天数据量非常大,可以把256个切片分4大片,分别存储到4个一主两从的集群中,从而实现扩容。

这个思路的确是可取的,只是我们的分库逻辑当前是php代码实现,也有一定程度上影响了业务代码的逻辑,运维起来有点心惊胆战,还是保持业务代码清爽比较好。

下之后将介绍一些实现了库路由功能的中间件的使用,也根据实际情况把想到的一些扩缩容方案实践一遍,敬请期待实操效果的分享。

六、混合模式

与其说这部分内容讨论上面5种场景的混合,不如说这部分内容是做总结。上面的5种场景中,一共列举了17个问题点,这17个问题点基本上都是叠加式的,越往深入的框架去做就越需要考虑齐这17个问题点。17个问题点考虑全了,混合模式下的问题就不成问题了。

END

Java面试题专栏

【51期】一道阿里面试题:说说你知道的关于BeanFactory和FactoryBean的区别

【52期】记一道简单的Java面试题,但答错率很高!

【53期】面试官:谈一下数据库分库分表之后,你是如何解决事务问题?

【54期】Java序列化三连问,是什么?为什么需要?如何实现?

【55期】面试中经常被问到Java引用类型原理,带你深入剖析

【56期】你说你熟悉并发编程,那么你说说Java锁有哪些种类,以及区别

【57期】面试官问,MySQL建索引需要遵循哪些原则呢?

【58期】盘点那些面试中最常问的MySQL问题,第一弹!

【59期】MySQL索引是如何提高查询效率的呢?(MySQL面试第二弹)

【60期】事务隔离级别中的可重复读能防幻读吗?(MySQL面试第三弹)

我知道你 “在看”

MySQL中的这17个关键问题,一定要弄清楚!相关推荐

  1. mysql中的merge into,SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字)...

    SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字) 语法请参考: 按照语法编写语句 DECLARE @ ...

  2. mysql中以下正确的sql是_总结MySQL中SQL语法的使用

    --where子句操作符: where子句操作符 = 等于 <> 不等于(标准语法) != 不等于(非标准语法,可移植性差) < 小于 <= 小于等于 > 大于 > ...

  3. mysql中删除同一行会经常出现死锁?太可怕了

    之前有一个同事问到我,为什么多个线程同时去做删除同一行数据的操作,老是报死锁,在线上已经出现好多次了,我问了他几个问题: 1. 是不是在一个事务中做了好几件事情? 答:不是,只做一个删除操作,自动提交 ...

  4. MySQL中的备份和恢复

    如何用mysql 命令进行备份和恢复?以test 库为例,创建一个备份,并再用此备份 进行恢复. mysqldump -u root -p test > test.sql mysql -u ro ...

  5. MySQL中SQL优化和架构设计的一些简单想法

    普通MySQL运行,数据量和访问量不大的话,是足够快的,但是当数据量和访问量剧增的时候,那么就会明显发现MySQL很慢,甚至down掉,那么就要考虑优化我们的MySQL了. 优化无非是从三个角度入手: ...

  6. writedouble_从MySQL中的double write问题说开去

    有句话说得好,世上只有两种工具,一种是被人骂的,另一种是没人用的.被骂得越多,侧面反映出关注度越高,使用率越高,越用越成熟,这一点上, MySQL就是一个很不错的例子.而MySQL可支持的存储引擎很多 ...

  7. Flink 获取 Kafka 中的数据,分流存储到 Redis、MySQL 中

    文章目录 案例:实时处理电商订单信息 需求一:统计商城实时订单实收金额 需求二:将上面的最后计算的结果,存储到 Redis 中(Key 为:totalprice) Redis Sink 自定义 Red ...

  8. 浅谈MySQL中utf8和utf8mb4的区别

    一.什么是UTF8MB4? 我们在使用PhpMyAdmin管理面板时,可以在首页看到名为"Server connection collation"(服务器连接排序规则)的选项,用来 ...

  9. mongodb在mysql中怎么用,mongoDB数据库基本操作

    mongoDB中聚集集合(collection/coll)相当于mysql中的表 文档相当于mysql中的每一行数据 常用命令 1.获得帮助命令db.help() db.表名.help() db.表名 ...

最新文章

  1. 《计算机科学导论》一1.1 图灵模型
  2. 两种方法判断一个字符串是否为另外一个字符串旋转之后的字符串。(C语言)...
  3. Django中的反向解析
  4. html5 logo svg,HTML5新特性之用SVG绘制微信logo
  5. GIS创新实践【课堂笔记】
  6. linux ps转为tiff,转换为TIFF,将图像转换为TIFF,在线图像转换为TIFF
  7. Redis 怎么防止数据丢失?面试必问!
  8. Mqtt协议IOS端移植3
  9. 5折交叉验证_交叉验证的方法主要分为哪些?
  10. java线程知识体系
  11. LeetCode 504. Base 7 (C++)
  12. delphi的多线程编程
  13. 洛谷 P4392 Sound 静音问题
  14. Jasper报表导出pdf中文不显示——Font simsun is not available to the JVM. See the Javadoc for more det,已解决
  15. 广东工业大学计算机专业分流,2017年广东工业大学大类招生学生专业分流工作小组...
  16. 情侣生日纪念日倒数提醒的便签
  17. JavaScript 实现音乐播放器
  18. 科普大佬说 | 智能仿生机器鱼
  19. 深度解密 Python 列表的实现原理
  20. 【转载】风控-风控策略逻辑

热门文章

  1. 《诛仙Ⅰ》票房破3亿 QQ阅读《诛仙》小说全平台收入增长11.7倍
  2. 马云今日正式退休!卸任后的他,仍有12个身份...
  3. 继三星之后 华为折叠屏手机Mate X发售日期或将延期至9月
  4. 2018年网络视听付费用户规模惊人 视听消费习惯逐步形成
  5. 程序员高工资是靠汗水和勤奋换来的,想拿高工资入门学习很重要
  6. rm ,rm -rf , rm -f,rm -r 以及rm 命令的其他参数命令
  7. jvm垃圾回收之JVM GC算法
  8. linux和windows下的“回车符”和“换行符”
  9. 一个C++工程CPU占用100%问题的排查
  10. 小女出世,暂停工作,全职照料大人小孩