评论

收藏

[MySQL] 没有宫廷内斗,数据库界的延禧攻略

数据库 数据库 发布于:2021-06-26 11:16 | 阅读数:452 | 评论:0

  各位老铁们,你们有没有想老张,最近老张的才华被工作的繁忙所限制了,所以一直没时间更博,今儿个时隔数日我们终于再次见面啦(很开心)!最近有部特别火的宫廷戏,不知道大家有没有看,剧名叫做《延禧攻略》,讲述得是一个宫女,一路过关斩将,最后成为皇上最宠爱的令贵妃的故事。加上我本人巨爱这类题材,所以痴迷得不得了。(好像暴露了自己没有更博的真正原因哈哈)。宫廷类的剧,都是后宫嫔妃之间的尔虞吾诈,勾心斗角,有你没我,有我没你的残酷事实。胜者为王,败者为寇这种思想好像从古代就一直延续到今日。非要分出个胜负,分出个谁好,谁坏才罢休。
  在数据库领域也会有此类问题,老张我混迹开源数据库圈多年。MySQL数据库占领着开源数据库的头把交椅,MongoDB占领着NoSQL数据库的第一位。我们来看下数据库的整体排名情况;

DSC0000.png
第一部分:数据库概述

  我们先来了解一下MySQL这个数据库;

DSC0001.png
  MySQL了解完,同理我们来了解MongoDB及其特点的介绍;

DSC0002.png
  学习完第一部分之后,我们对两者数据库都有了一定的认识;接下来去从运维的角度来检验两者的不同;

第二部分:日常运维管理维度

1. 术语和概念的差异

DSC0003.png
  结论可以看出,关系型数据库中的表,在MongoDB中叫做集合。行在MongoDB中叫做文档。所以经常管MongoDB叫做文档型数据库。

2.存储数据结构的差异

DSC0004.png
4.增删改查操作的差异

DSC0005.png
  但随着MongoDB 4.0的问世,它将支持多文档事务,届时MongoDB将成为唯一能够同时支持速度,灵活性,JSON文档模型优势 和ACID数据完整性保证的数据库。
  所谓的多文档事务,可以理解为关系型数据库的多行事务。在关系型的事务支持中,大家几乎无一例外支持同一事务内操作的原子性,即要么全部提交,要么全部回滚。这个同一事务内可以有多个操作,针对于多个表,或者是同一个表内的多行数据。
  总结:随着事务支持的增加,MongoDB功能上更接近于关系型数据库,但是和关系型还是有本质上的区别:MySQL是基于关系模型的数据库,对各种数据多变的场景如物联网或社交化并没有MongoDB支持得好。MongoDB的JSON模型则具有动态灵活,数据库无须下线就可以进行模式变迁升级,在这种场景下面,选择MongoDB会特别合适。

6.备份上的差异

  MySQL备份方式:

DSC0006.png
  MySQL复制种类总结;
  异步复制:
  通常没说明指的都是异步,即主库执行完Commit后,在主库写入Binlog日志后即可成功返回客户端,无需等Binlog日志传送给从库,一旦主库宕机,有可能会丢失日志。
  半同步复制:MySQL5.5版本之后引入了半同步复制功能,主从服务器必须同时安装半同步复制插件,才能开启该复制功能。在该功能下,确保从库接收完主库传递过来的binlog内容已经写入到自己的relay log里面了,才会通知主库上面的等待线程,该操作完毕。如果等待超时,超过rpl_semi_sync_master_timeout参数设置的时间,则关闭半同步复制,并自动转换为异步复制模式,直到至少有一台从库通知主库已经接收到binlog信息了为止。
  多源复制:
  所谓多源复制,就是把多台主库的数据同步到一台从库服务器上,从库会创建通往每个主库的管道。在MySQL5.7之前的版本中,只能实现一主一从、一主多从或者多主多从的复制架构,如果想要实现多主一从的复制,只能使用MariaDB。MySQL 5.7版本已经可以实现多主一从的复制。
  并行复制:
  使用MySQL5.7的并行复制功能。在5.6版本中就有了并行的概念,但其中的并行复制是基于库级别的,即slave_parallel_type=database。但在这种模式下,只是基于多库少表的情况,并不适用于真实的生产环境下。在MySQL 5.7版本中,真正实现了基于组提交的并行复制,简单说就是主库并行执行SQL语句,从库也可以通过多个workers线程并发执行relay log中主库提交的事务。想要开启MySQL5.7的并行复制可以在从库设置参数slave_parallel_workers>0,并把5.7版本中新添加的slave_parallel_type参数设置为LOGICAL_CLOCK。该参数有DATABASE和 LOGICAL_CLOCK两个值。MySQL5.6默认是database。
MySQL高可用集群架构分类图;
DSC0007.png
  MHA的目的在于维持MySQL Replication中master库的高可用性,其最大特点是可以修复多个slave之间的差异日志,最终使所有slave保持数据一致,然后从中选择一个充当新的master,并将其他slave指向它。当master出现故障时,可以通过对比slave之间I/O thread 读取主库binlog的position号,选取最接近的slave作为备选主库(备胎)。其他的从库可以通过与备选主库对比生成差异的中继日志。在备选主库上应用从原来master保存的binlog,同时将备选主库提升为master。最后在其他slave上应用相应的差异中继日志并从新的master开始复制。
双主+keepalived
DSC0008.png
  PXC是基于Galera协议的MySQL高可用集群架构。Galera产品是以Galera Cluster方式为MySQL提供高可用集群解决方案的。Galera Cluster就是集成了Galera插件的MySQL集群。Galera replication是Codership提供的MySQL数据同步方案,具有高可用性,方便扩展,并且可以实现多个MySQL节点间的数据同步复制与读写,可保障数据库的服务高可用及数据强一致性。
MGR架构:
DSC0009.png
  三副本架构是最基础的复制集的架构,一主两备模式。主节点接受外界的读写请求,向备节点进行数据同步。当主节点宕掉,会自动切换到备节点,不影响线上业务,防止单点故障。
MongoDB复制集自动切换
DSC00010.png
  read preference 决定MongoDB客户端从哪个节点上读取数据。
  默认情况下,应用程序将其读取操作指向副本集中的primary节点。
  指定read preference 选项时要注意:因为使用异步复制,复制延迟会导致secondary上的数据可能不是最新的。
  默认情况下,复制集的所有读请求都发到Primary,Driver可通过设置Read Preference来将读请求路由到其他的节点。
  primary: 默认规则,所有读请求发到Primary
  primaryPreferred: Primary优先,如果Primary不可达,请求Secondary
  secondary: 所有的读请求都发到secondary
  secondaryPreferred:Secondary优先,当所有Secondary不可达时,请求Primary
  nearest:读请求发送到最近的可达节点上(通过ping探测得出最近的节点)
MongoDB分片架构
关注下面的标签,发现更多相似文章