我们经常需要为自己的OLTP(事务/运营)数据库选择适合的RDBMS(关系型数据库管理系统)。虽然通过编写可移植的SQL可以暂时避免进行这样的选择,但迟早要做出这样的选择,至少需要进行这样的尝试(比如,意识到具体的选择不够明确,因此决定选择跨RDB MS的SQL)。

  

生产环境中选择RDBMS的标准是?

  在发起“到底哪个RDBMS最好”的讨论圣战之前,也许需要首先明确一下对于24x7运行的生产级OLTP RDBMS,到底需要具备哪些必不可少的功能。

一、基于锁,或是基于MVCC

    考虑到并发性,目前几乎所有RDBMS无外乎基于锁的(Lock-Based),或基于MVCC(多版本并发控制)的。从写负载更重的OLTP处理角度来说,我曾经见到过:

  对于读写混合型负载(例如OLTP事务和报表),基于MVCC的RDBMS表现会比基于锁的略好一些。
  如果使用高于Read Uncommitted的隔离级别,效果还会更好,最适合用于读取/报表用途。
  另一方面,OLTP很少会遇到大量并发读取的情况,如果真的遇到这种情况,通常可通过副本
(Replica)执行此类读取,因此不会造成太严重的问题。
对于大部分情况下以写入为主的OLTP(没有太多报表需要创建),基于锁的RDBMS要比基于MVCC的表现略好一些。然而如果能让OLTP工作负载使用INSERT代替UPDATE,此时MVCC的效率更高。
  另外,值得注意的是,如果使用了单一写入连接(Single-write-connection)数据库架构,基于锁和基于MVCC的RDBMS之间的逻辑差异将显得微乎其微(尽管性能略有差别,
但其他方面几乎相同,基于锁的RDBMS通常略微领先一些)。

二、ACID保障

  对于OLTP数据库,我们需要为涉及多行和多表的事务提供ACID保障。

  

  如上所述,对于OLTP数据库,我们需要为事务提供全面的ACID保障。更重要的是,需要保障涉及多行和多表的事务具备ACID特性。虽然这一规则也有例外,但这种例外情况实际上极为罕见。
  这几乎已自动将MySQL+MyISAM用作OLTP数据库的可能性彻底排除在外。但是也要注意,MySQL+ISAM可能是少数应用(例如作为快递追踪系统或系统监视工具的后端)的好选择,但并不适合涉及某类与金钱有关信息的常规OLTP处理。
  此外RDBMS提供的ACID保障差不多等同于意味着需要使用数据库日志,同时也意味着一旦RDBMS崩溃,随后需要通过数据库日志进行自动恢复(并自动前卷Rollforward)。

三、支持24×7运行

  作为联机备份的备选方案,可使用异步主从复制(Replication)我们需要的另一系列功能主要与24×7不间断运行有关(例如游戏服务器,总得全天候运行对吧)。这些功能包括:
  联机备份。无论做什么都肯定需要备份,24x7不间断运行更是少不了联机备份。
  1、通常来说,联机备份意味着需要具备“日志前卷”能力。大部分时候是这样工作的:创建两个数据库,一个作为“主”,一个作为“从”;随后从“主”获取日志文件并发送给“从”,然后在从数据库上进行“前卷"。
此外,有些数据库可以对处于“日志前卷”状态下的“从”数据库执行只读请求(实际上等同于创建了一个只读从副本)。然而其他一些RDBMS不能处理这样的请求(例如需要首先完成“日志前卷”操作才能让从RDBMS能够接受查询操作)。

  2、作为联机备份的备选方案,也可以通过异步主从复制获得近乎完全同步的备份副本(这种做法对MySQL+InnoDB是一种尤为有趣的选项)。
需要注意,这样的副本也许可以或无法支持联机备份+前卷那样的“时点”恢复(具体情况请参阅文档)。虽然只在从一些非常糟糕的情况下恢复时需要“时点”恢复(实际生产环境中我从未遇到需要这种恢复的情况),不过真遇到这种糟糕的情况至少也能助我们一臂之力

  3、“即时”的ADD COLUMN语句。我们可能需要对生产环境的数据库进行扩展,这一点是确定无疑的。大部分时候这是通过ALTER TABLE.…ADD COLUMN语句实现的。面对AD DCOLUMN语句,很多RDBMS会简单地将整个表重写为新格式的行。如果表包含10亿行,这一过程可能需要数小时?(在进行复制的过程中,整个表将完全无法访问,导致数据库在数小时内无法使用?)。让ADD COLUMN能够近乎即时(考虑到表的大小,可能需要几毫秒的时间)执行完成并不需要什么艰深的技术,有些RDBMS也确实能做到这一点,但是也不能忽视,这并不是一种普遍特性。

预算不足时的备选方案是实现无锁ADD COLUMN(以及常规的ALTER TABLE),方法如下:

用新的结构创建“影子”表
通过触发器将对当前表的所有改动写入影子表
将数据从当前表复制到影子表(一定要忽略已存在的行,因为触发器已经在其中写入内容了)用影子表取代当前表
这种“廉价”的ADDCOLUMN方法相当繁琐(全过程会对性能产生极大影响),但如果没有其他更好的方法,这种做法至少可以起到一定的效果。
“即时”ALTER COLUMN(字段拓宽,Widening field)也是个很好的功能,但因为字段拓宽可通过ADD COLUMN模拟,因此显得并不是太重要。

  4、联机表优化。这个功能需要介绍一下。由于RDBMS会不断修改表内容,表的性能会逐渐退化(实际上取决于所用存储引擎,从“行溢出(Overflow row)"到“死行(Deadr ow)",我们会遇到各种不希望出现的情况)。为此有必要进行一定的优化(例如InnoDB的OPTIMIZE TABLE,DB/2的REORG TABLE,Postgres的VACUUM等),并且我们会需要联机完成这些操作(无需让整个数据库彻底停摆,因为对包含数百万行内容的表进行优化通常需要花很长时间)。
大部分时候,此类优化需要创建“影子副本”(由数据库自行创建,这总好过需要我们手工创建),这也意味着需要额外的存储空间。不过至少有一个RDBMS提供了“原地”表优化功能。

  5、容器的重新平衡。虽然不像上文列出的其他问题那么重要,但我始终认为“容器的重新平衡”也是RDBMS需要考虑的一个重要问题。
简单来说,这个问题主要出现在添加存储数据的新硬盘(这种情况时有发生),以及通过将数据分散在所有硬盘上实现提速时。此时可通过下列两种方法之一实现:
(a)使用RAID-10(这样就无需考虑数据库存储数据的方式了)
(b)通过多个RAID-1磁盘使用数据库容器(因为数据库本质上采用了类似RAID-0的工作原理)。
只要无需添加新硬盘(实际上通常在添加时,为了实现冗余往往会成对增加硬盘),所有系统基本上是均等的,然而在添加了一对新硬盘后,我们需要对硬盘进行“重新平衡”,借此实现负载的重新平衡,这一“重新平衡”的工作分别是由RAID或敖据库进行的。RAID级别的重新平衡对服务器性能的影响远大于数据库级别的重新平衡(尤其是有些情况下系统甚至完全无力承担RAID级别重新平衡过程中产生的负荷)。

原文地址:http://www.360doc.com/content/17/0215/16/1044878_629223899.shtml

为0LTP选择RDMBS时,你都需要考虑哪些?的更多相关文章

  1. loadView在App启动时到底都干了些什么?

    loadView在App启动时到底都干了些什么? 查阅苹果官方文档如下: 1. 当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewControlle ...

  2. 安装oracle11数据库时,先决条件都失败怎么处理?

    安装oracle11数据库时,先决条件都失败怎么处理?

  3. Swift基础之实现选择图片时,出现类似于ActionSheet的样式

    之前看到过有APP在选择图片时,调用手机相册时,将手机相册做成了左右滑动选择的效果,这次展示的就是这种样式,用OC语言已经有人实现过类似的代码,在这里写的仅仅是效果展示的代码调用,具体代码,可以自己研 ...

  4. 2017-5-14 湘潭市赛 Partial Sum 给n个数,每次操作选择一个L,一个R,表示区间左右端点,该操作产生的贡献为[L+1,R]的和的绝对值-C。 0<=L<R<=n; 如果选过L,R这两个位置,那么以后选择的L,R都不可以再选择这两个位置。最多操作m次,求可以获得的 最大贡献和。

    Partial Sum Accepted : Submit : Time Limit : MS Memory Limit : KB Partial Sum Bobo has a integer seq ...

  5. 避免git clone和push时每次都需要输入用户名和密码

    有三种方式解决git clone时每次都需要输入用户名和密码, 1. SSH免密方式 使用git bash ssh-keygen或puttygen.exe生成公钥. 2. 配置全局开机存储认证信息 下 ...

  6. ecshop添加商品选择品牌时如何按拼音排序

    ECSHOP后台添加新商品时,有一个选择品牌的下拉框,如果品牌太多,在下拉框里查找起来很不方便. 我想给“下拉框里的品牌列表”按品牌名的拼音排序,比如有“中国水利出版社” “中国人民出版社” 这两个品 ...

  7. [saiku] 登陆/选择cube 时发生了什么

    一 登陆saiku时发生了什么 大致流程 saiku 默认有admin和两个开发人员的身份 登陆saiku时,后台用户认证成功后创建了用户信息session 并在session中存储了随机生成的一个s ...

  8. Git push 时每次都需要密码的疑惑

    2015.1.13更新: 在本地搭建Git服务器时,也是有每次操作需要密码的情况. 是因为每次做推送动作时,Git需要认证你是好人.所以需要密码. 可以在 /home/username/.ssh/au ...

  9. 通过VBA,当在EXCEL单元格中输入任意的日期格式时,都能自动转换为指定的标准格式的日期值

    在日常录入EXCEL表格的单元格里 ,我们输入一些一般性的日期内容,如:2017-10-17 或 2017/10/17时,EXCEL会自动识别为日期并按单元格设计格式显示,单元格中存储的值也是日期格式 ...

随机推荐

  1. web端自动化——selenium3用法详解

    selenium中文学习文档链接:https://selenium-python-zh.readthedocs.io/en/latest/getting-started.html selenium3+ ...

  2. AWS 数据库(七)

    数据库概念 关系型数据库 关系数据库提供了一个通用接口,使用户可以使用使用 编写的命令或查询从数据库读取和写入数据. 关系数据库由一个或多个表格组成,表格由与电子表格相似的列和行组成. 以行列形式存储 ...

  3. nodejs中利用expresss脚手架和bootstrap,数据库mongodb搭建的留言板案例

    ## 1. 先打开编辑器,创建一个项目 ## 2. 再打开cmd命令提示符下载express脚手架 express   项目名   --view=ejs 或express   -e    项目名 ## ...

  4. 图解JavaScript闭包面试题

    由于最近在学习关于闭包相关的知识,并且闭包这个知识点让我有点搞不太清楚其具体的定义,所以在网上也查阅了很多大佬的讲解和对闭包的一个定义. 最后感觉还是MDN上的说法感觉比较好理解一些,对闭包还是不太理 ...

  5. ElasticSearch RestHighLevelClient 通用操作

    项目中使用到ElasticSearch作为搜索引擎.而ES的环境搭建自然是十分简单,且本身就适应于分布式环境,因此这块就不多赘述.而其本身特性和查询语句这篇博文不会介绍,如果有机会会深入介绍. ​ 所 ...

  6. java多线程中篇(三) —— 线程的控制(创建,运行,阻塞,中断,结束)

    简介 线程的控制就是程序对线程的主要管理,最重要的就是状态的切换维护. 每种转态都有不同的引发事件(对应线程的方法),每种状态又有各自不同的处理步骤和过程,整个线程控制主要就是涉及这些内容. 正文 线 ...

  7. python第一天---我要入个门

    """ 一个用户登录的案例 """ # 永远等待,直到用户输入值 # 变量 name_r = input("请输入用户名" ...

  8. 机器学习SVD笔记

    机器学习中SVD总结 矩阵分解的方法 特征值分解. PCA(Principal Component Analysis)分解,作用:降维.压缩. SVD(Singular Value Decomposi ...

  9. 使用Docker搭建svn服务器教程

    svn简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subv ...

  10. Centos 安装PHP-redis扩展

    从https://pecl.php.net/package/redis   里面找到自己安装的Redis对应版本的redis 1.获取已经安装的Redis版本扩展我这边安装的是4.0.1版本 wget ...