tech share
  • tech-share
  • Engineering
    • 登录鉴权
    • SSR 页面路由
    • npm 版本号
    • 缓存
    • 数据库容灾
    • 动态效果导出 gif
    • Chrome-devtools
    • C 端 H5 性能优化
    • Docker
    • Monorepo 最佳实践
    • 技术架构演化
    • 项目规范最佳实践
    • snowpack
    • 静态资源重试
    • 前端页面渲染分析
    • Git
    • 前端重构
    • 微前端
    • 项目依赖分析
    • 前端监控原理
    • webpack
    • BS 架构与 CS 架构
    • HTTPS
    • package-lock.json 生成逻辑
    • SVN(Subversion)
    • 数据库分类
    • gulp
    • 前端架构
    • Bundle & Bundless
    • 控制反转 IoC
  • JavaScript
    • Javascript 性能
    • JavaScript 原型(2) - 原型与原型链
    • JavaScript 原型(1) - 构造函数
    • JavaScript - Promise
    • ES6 解构赋值
    • 前端离线化
    • Proxy
    • Object.defineProperty()简介
    • TypeScript
  • MachineLearning
    • GAN生成对抗网络
    • 虚拟对抗训练
    • 深度度量学习
    • 原型网络
    • PyTorch优化器
    • 隐马尔可夫模型2
    • Shapley Value 算法
    • Embarassingly Autoencoder算法
    • AutoRec算法及其后续发展
    • 深度学习常用激活函数
    • 序列预测ConvTran算法
    • 联邦学习
    • 深度学习推荐系统算法整理
    • 隐马尔可夫模型
    • 黎曼优化方法
    • FM算法
    • 机器学习常见评价指标
    • VAE算法
    • Adam优化器详解
    • Transformer算法
    • Self-attention 推荐算法
    • CNN 卷积神经网络
    • 图嵌入
    • 集成学习算法
    • RecBole开源框架
    • NCE-PLRec
    • 深度学习初始化方法
    • RNN循环神经网络
    • PyTorch数据处理
    • PyTorch安装和基本操作
    • XGBoost算法
    • NCF算法与简单MF的对比
    • 计算最佳传输
  • CSS
    • 什么是BFC
    • 纯CSS实现可拖动布局
    • 滚动穿透解决方案
  • React
    • React 生命周期
    • React Ref
    • React Hooks
    • SWR
    • React 数据流
    • React 函数式组件和类组件的区别
  • 可视化
    • OffscreenCanvas
    • Echarts 平滑曲线端点为什么不平滑
    • 颜色空间
    • 词云布局解析
    • 3D 数学基础
    • Canvas 图片处理
    • GLGL ES
    • WebGL 中绘制直线
    • Graphics API
    • 现代计算机图形学基础
    • Canvas 灰度
  • Vue
    • Vue2.x全局挂载整理
    • Vue2.6.x源码阅读
      • Vue2.6.x源码阅读 - 2.目录结构分析
      • Vue2.6.x源码阅读 - 4.源码阅读-platform
      • Vue2.6.x源码阅读 - 1.准备工作
      • Vue2.6.x源码阅读 - 5.源码阅读-core-Vue构造函数
      • Vue2.6.x源码阅读 - 7.源码阅读-core-响应式原理
      • Vue2.6.x源码阅读 - 3.源码阅读-shared
      • Vue2.6.x源码阅读 - 6.源码阅读-core-组件挂载
    • Vue + TypeScript Web应用实践
    • Vue2.x指令
    • nextTick()的使用
    • vue-cli2.x 的使用与项目结构分析
    • Vue响应式原理及总结
    • VueX的使用
    • Electron-Vue + Python 桌面应用实践
    • Vite
    • Vue组件通信整理
    • 记录一个问题的探索过程
  • Linux
    • memcg
  • GameDev
    • 游戏中的几种投影视图
    • 从零开始写软渲染器06
    • 从零开始写软渲染器05
    • 从零开始写软渲染器04
    • 从零开始写软渲染器03
    • 从零开始写软渲染器02
    • 从零开始写软渲染器01
    • 从零开始写软渲染器00
    • 现代游戏常用的几种寻路方案(一)
  • Node
    • NPM Dependency
    • Node 优势
    • Node Stream
    • Node 模块系统
  • HTML
    • html5语义与结构元素
  • 跨端
    • Flutter 介绍
  • Golang
    • Golang 基础
  • AR
    • SceneKit
由 GitBook 提供支持
在本页
  • 高可用数据库
  • 高可用数据库有很多优点
  • 业界典型高可用数据库架构
  • 共享存储共享存储指若干
  • 操作系统实时数据块复制
  • 数据库主从复制
  • 数据库高可用集群

这有帮助吗?

  1. Engineering

数据库容灾

一个系统可能包含很多模块,如数据库、前端、缓存、搜索、消息队列等,每个模块都需要做到高可用,才能保证整个系统的高可用。 对于数据库服务而言,高可用的实现可能更加复杂,对用户的服务可用,不仅仅是能访问,还需要有正确性保证,因此讨论数据库的高可用方案时,在容灾之外,还要同时考虑方案中数据一致性问题。

高可用数据库

高可用数据库是由一系列数据库构成的总体系统,在任何时刻,至少有一个节点可以接受用户的请求并提供数据库服务。 大多数数据库架构中,有一个主节点处理主要请求,还有若干备用节点用于容灾切换,当主节点不能提供服务时,备用节点成为主节点继续提供服务,用以保证整个系统的可用和稳定。

高可用数据库有很多优点

  • 方便读写分离

数据库请求当中,一般读操作的请求次数远大于写操作,高可用数据库可以通过将写操作放在主数据库节点上进行,将读操作分担到若干从库上,来提升读操作吞吐量,进而提升读写效率;

  • 变更不停服

当整个高可用数据库架构或者主节点升级时,可以让高可用数据库先进行主库切换,让备用节点替换原主节点提供数据库服务,当主节点升级完毕后,再将主从库服务切换回来,这样能有效避免系统升级或变更时对用户服务质量产生影响

  • 备份不影响服务性能

高可用数据库架构包含多个从库,在不影响主节点服务性能的情况下,能非常方便地实现数据的容灾备份。

一般,高可用数据库地架构设计时,也需要考虑三个问题:

  1. 如何同步各数据库之间的节点数据

同步需要保证切换后的数据库是最新数据,以及在切换过程中数据不会丢失,同时还要考虑同步过程对主库和备库的影响。

  1. 高可用数据库的容灾切换如何进行

架构不同容灾切换的复杂度也不一样,且切换以后需要保证主、从库数据的一致性,这可能需要开发者在设计之初就尽量优化和简化容灾切换逻辑。

  1. 如何提高高可用的运维效率

业界典型高可用数据库架构

按照数据同步方式,我们可以将业界主流的高可用架构划分成四种,每一种数据同步方式可以衍生出不同的架构。

  • 共享存储方案

  • 操作系统实时数据块复制

  • 数据库级别的主从复制

  • 高可用数据库集群

共享存储共享存储指若干

DB 服务使用同一份存储,一个为主 DB,其他的为备用 DB,若主服务崩溃,则系统启动备用 DB,成为新的主 DB,继续提供服务。一般共享存储采用比较多的是 SAN/NAS 方案。这种方案的优点是没有数据同步的问题,但也有一些限制,如对于共享存储的实时性和网络性能有较高要求。因为共享存储一般是通过网络来访问存储当中的数据,在网络性能较差的情况下,数据库的性能也无法达到令人满意的效果。不过,随着硬件性能的不断提升,将计算存储分离、和 DB 深度结合的共享存储亦是高可用数据库未来发展的趋势之一。

操作系统实时数据块复制

这个方案的典型场景是 DRBD,可以把它理解为远程的 RAID1,一侧数据库写入数据以后立即同步到另一侧的存储设备当中。如果写入边数据库崩溃,系统可以直接激活另一侧的数据库存储设备,启动新的数据库服务,实现容灾切换。这个方案同样有一些问题,如系统只能有一个数据副本提供服务,无法实现读写分离;另外,如果系统崩溃,主库进程中断,容灾切换后需要在挂掉的数据库上做数据库崩溃恢复,系统需要的容灾恢复时间较长。

数据库主从复制

这种方案我认为是最经典的数据同步模式,系统采用一个主库和多个从库方式,其实现原理主要是基于日志的主从复制,主库操作以日志的形式发送给各个从库,从库接收到日志后进行数据备份。这种方式的好处是一个主库可以连接多个从库,能很方便地实现读写分离,同时,因为每个备库都在运行中,所以备库里面的数据基本上都是热数据,容灾切换也非常快。不过,这个方案也并非完美无缺,如容灾切换时,从库一定要同步完最新数据以后才能升级为主库,否则极有可能发生数据丢失的情况。针对传统主从架构的一些问题,业界也逐渐研发出对应的改进技术。

  1. 双主架构问题

经典主从架构里面,原主库崩溃恢复的过程中,新的数据无法及时同步到该数据库当中,原主库恢复后,需要重新设置为从库,并将容灾过程中的数据重新同步进行。改进措施:为了保证容灾后的数据一致性,业界对这种架构做了一些改进,其中一种改进措施就叫双主架构,双主架构一般会选择两个 DB 做一对主库,这两个 DB 之间互相为对方的从库,无论往哪个 DB 写入数据,另一个都会自动同步。容灾时系统只需要把流量从左边切换到右边,容灾后数据同步依旧自动进行,这样,就保证了容灾后原主库的数据一致性。

  1. 日志自动寻址问题

容灾备份时,当某一从库提升为主库后,其他备库需要自动定位新主库的日志同步点,同步新主库的日志。早期数据库日志中,MySQL 是通过文件名加上文件的偏移量进行寻址,因此,主库的自动定位并不好实现。改进措施:为了解决此问题,MySQL 提供了一种叫做 GTID 的全局事务标志技术,一个事务对应一个 ID,所有的日志都带有唯一的标识符,主从库切换后,其余从库只要根据新主库的日志 ID,就可以辨别新的日志同步点,然后根据这个日志同步数据,这对于搭建一主库多从库的架构来说寻址非常便捷。

  1. 异步复制改进问题

默认情况下,MySQL 的复制是异步的,主库将新生成的日志发送给各从库后,无需等待从库的 ack 回复(从库将接收到的日志写进 relay log 后,才会回复 ack),直接就认为这次 DDL/DML 成功了。但在极端情况下,如主库刚提交日志,其他从库还没有接收到相关日志时,数据库发生故障,此时,该日志的内容就会全部丢失。改进措施:半同步复制机制。半同步复制是指主库在将新生成的日志发送给各从库前,需发送日志到一个(默认)从库,等待从库返回 ack 信息后,主库再提交日志发送给各从库,这就防止了上述情况下的数据丢失。半同步复制是一种提升数据一致性的有效方式,也是比较关键的技术。

数据库高可用集群

前面三种方案主要是通过日志的复制模式实现高可用,第四种方案则是基于一致性算法来做数据的同步,数据库提供多节点一致性同步机制,利用该机制构建多节点同步集群。这种方式比较经典的案例包括 MGR(MySQL Group Replication)和 Galera 等,最近业内也有一些类似的尝试,如使用一致性协议算法,自研高可用数据库的架构等。节点之间是构建成了一个一致性的同步集群,客户端可以读写其中的任何一个节点,任意一节点写入,其他节点都能够将数据进行同步,因此,理论上每个节点都可以进行读写操作。这种方式的容灾实现也比较简单,假设第二个节点出现故障,系统只需要断开客户端对第二个节点的访问路径,其他节点照常访问就可以了,这也是业界近年来比较流行的高可用集群方案。

上一页缓存下一页动态效果导出 gif

最后更新于4年前

这有帮助吗?