DevOps实践系列文章,请参见连接。
概述:
在所有的软件系统中都有数据持久化的需求。而平常我们在软件系统中使用最多的方式就是数据库。所以,就需要对数据库的可靠性做一些必要的设计。以保证之后在项目上线运营过程中发生不可修复的问题,以此来整体提高软件系统的整体可靠性。
随着软件行业的不断发展,行业中也对软件各个层面上的解决方案都提供了高性能、靠可靠的解决方案。现在在数据存储层面也形成了很多解决方案。如:RDBMS的分库分片技术、NoSql的CAP解决方案、NewSQL技术、BigTable技术等。虽然数据存储层也有着层出不穷的存储技术,就像作者之前说的一样。每项技术都有它所擅长的方向,都有它的问题解决域。所以,不是每一项技术都可以应用到所有的场景下。
针对业务系统中的结构化数据存储领域,仍然是RDBMS占有着很大的优势。就算是RDBMS型的数据库也可以再划分为很多种类型。鉴于本文关系的是数据库的存储(物理)结构,从数据库的存储结构上将数据库分为:内存式、文件系统、物理机。基本上一个比较成熟的数据库都是支持这些模式。
内存式 | 文件系统 | 物理机 | |
---|---|---|---|
Oracle | TimesTen | 本身支持 | 本身支持 |
Postgresql | 不支持,支持表空间 | 本身支持 | 不支持 |
Mysql | MEMORY存储引擎 | 本身支持 | InnoDB存储引擎 |
Sqlite3 | 本身支持 | 本身支持 | 不支持 |
数据库使用过程中需要发挥RDBMS的特点。在满足业务上的需求的同时,还需要满足技术上的、运维上的很多需求。所以接下来就从数据库设计开始一步一步的深入数据库可靠性设计的方方面面。
数据库驱动开发:
现在业界有一种不成文的规定:在项目没有发展到一定阶段时,开发模型都会直接使用数据库驱动开发。然后在到达一定阶段之后,再进行重构。
这里对数据库驱动开发的软件过程或思维模式的指导下,简单的对项目的实施过程进行一下阐述:
- 根据业务分析出数据库逻辑结构;
$\color{#FF00FF}{设计数据库的运维方法}$;
- 规划数据库容量,并发量
- 设计数据库物理存储结构
- 设计容灾与备份方案
- 等
- 开发、测试、部署之后即可交付。
数据库驱动开发模式是对软件无知状态下的一种探索。它忽略了前期、中期、后期的很多分析与度量的内容。并且省略了上面的第二条。而且根据作者在之后会介绍[仓库系统及知识库]()架构模式中的指导:可以将数据库作为以一个知识库。也不会进行提前的风险评估。知识库是用来在不同的业务或者服务间共享知识与数据。所以,这里并不是推荐这种开发模式,并请尽量不要使用数据库驱动开发模式。
数据库设计:
数据库设计一般可以分为:概念结构设计、逻辑结构设计、物理结构设计。概念结构设计是将业务转化为数据库中结构的一个过程。逻辑结构设计是根据概念结构设计中的E-R图,具体的将实体关系,数据格式定义出来。物理结构设计是确定逻辑层的数据存储在什么样的硬件上,怎样存储在硬件上。
我们这里更关心物理结构设计。第一步是需要知道业务中的非功能需求。非功能需求可以评估出数据库的容量,并发量,数据类型等等信息。然后根据这些信息在进行下一步的设计工作。设计工作中要考虑的内容有:
- 数据库的存储容量是否能够容纳,是否需要进行分库,分表操作。
- 是读频繁型,还是写频繁型,还是都频繁型?
- 数据库对数据写入到查询出的时延要求?
- 是否允许进行读写分离设计?
- 数据库是否允许冷备,还是只可以进行热备或者变形方案?
- 数据库可以接受的备份方式:全量备份,增量备份(日志备份,差异备份),不备份?
- 数据库恢复时允许丢失的数据的要求?
- 数据库运维监控、容量监控、负载监控、热数据加速、死锁检测。
- 数据库恢复设计。恢复时间要求?恢复到的环境的要求?
在设计过程中还需要考虑数据库中存储的数据的价值以及对于维护数据库可用、可靠的投入之间的投入产出比。因为一个完备的数据库设计可能成本会非常高。而对于一个小型的网页应用来看,不必要做的很完善。
并且因为数据库的备份工作一般情况下还是需要人员参与的,所以也需要制定一套完善的数据库操作规范。以防止在人为参与的情况下造成数据的丢失与不一致。并且需要设计一套完整的自动化数据库运维过程。
备份设计:
数据库的备份需要从下图中的几个方面进行考虑。但在每个产品/项目中数据库的使用设计都是不尽兴同的,所以,对数据库的备份方面的设计还是要与使用设计相结合。这里只介绍备份设计中需要考虑的内容。
下面逐层介绍需要注意的内容:
逻辑结构层:
- 逻辑结构中是否可以进行读写分离时的部分表的备份,即是否有外键关系,表中的数据是否可以进行单独的导入导出操作。
- 数据索引是否与具体的存储结构和索引方式有关。如果有关需要将这些元数据一并保存。
- 数据库中的存储过程,触发器是否与表空间、逻辑数据库有关。
- 数据备份时使用锁表,还是停机的方式进行备份?
中间件
- 中间件中的分片策略是否与具体的数据库有关,是否可以在中间上替换数据库实例?
- 向中间件中新添加数据库实例时,分片策略是否需要变更?
内存
- 表数据怎样被加载到内存中?
- 是否有内存表的创建?内存表是否需要进行备份?
计算
- 计算是在磁盘上的数据中进行的还是在内存上的数据中进行的?
- 是否有预处理、预计算结果保存表,每次备份重新计算还是直接保存预计算结果?
裸设备
- 裸设备上的数据是否有工具可以备份成文件形式?并有工具可以恢复回去
- 裸设备导出与导入的速度?
自动化
- 尽量的减少人工操作的内容,减少因为人工带入的错误。
规范流程
- 数据迁移工具的使用规范
- 数据备份过程规范
- 数据备份存储规范
- 数据备份恢复规范
参照:
关于开发方法可以参照:TDD,ATDD,BDD,DDD,MDSD。