我们经常需要为自己的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. [ kvm ] 学习笔记 6:virsh 命令及功能详解

    1. 虚拟机管理操作 attach-device 从XML文件附加设备 attach-disk 附加磁盘设备 attach-interface 连接网络接口 autostart 自动启动一个域 blk ...

  2. jquery 单击选中 再次选中取消选中

    html: <div id="full" class='weui-popup__container' style="background: #fff"&g ...

  3. vue-router parmas与query的区别

    $router是路由对象,是一个只写的对象 $route是当前路由的信息对象,是一个只读的对象 带参数路由跳转 1 query参数,这个是作为字符串拼接在url的后面,跟路由没有关系,demo:lis ...

  4. 【sql server inject】使用动态查询执行sql语句实例

    应某少年要求授权测试一个存在报错注入点的站点,可读取数据库名,但是sqlmap执行–os-shell选项就会莫名当掉: 分步骤测试了几次,发现xp_cmdshell是开启状态,但用sqlmap注入却无 ...

  5. C# .NET 杀进程

    procName 是进程名,不带.exe . private bool IsAppKill(String procName) { try { ; System.Diagnostics.Process[ ...

  6. eNSP模拟器OSPF单区域配置

    实验拓扑图如下 下一步对终端设备与路由器的端口进行基本的ip设置 配置完成后要注意检查是否有小错误,不然会对后面的测试带来麻烦.在进行基础配置的时候一定要细心细心细心. 下一步我们就要进行OSPF的配 ...

  7. .net core中关于System.Text.Json的使用

    在.Net Framework的时候序列化经常使用Newtonsoft.Json插件来使用,而在.Net Core中自带了System.Text.Json,号称性能更好,今天抽空就来捣鼓一下. 使用起 ...

  8. LocalDate LocalTime LocalDateTime Instant的操作与使用

    一.简介 LocalDate表示当前(或指定)日期,格式为:yyyy-MM-dd LocalTime表示当前(或指定)时间,格式为:HH:mm:ss SSS LocalDateTime表示当前(或指定 ...

  9. (7)Spring Boot web开发 --- servlet容器

    文章目录 配置嵌入式 Servlet 容器 注册 三大组件 使用其他 servlet 容器 使用外置的 `Servlet` 容器 配置嵌入式 Servlet 容器 Spirng Boot 默认使用自带 ...

  10. Visual Studio 设置为 UTF-8 保存格式

    1. 步骤 Visual Studio 提供高级保存选项功能,它能指定特定代码文件的编码规范和行尾所使用的换行符. 在 VS 中,该命令没有默认显示在「文件」菜单中.用户需要手工设置,才能显示该命令. ...