技术开发 频道

开源数据库:何为NoSQL生态系统?

  数据可靠性

  最理想的状态是,数据库会把所有写操作立刻写到持久化存储的设备,同时复制多个副本到不同地理位置的不同节点上,以防止数据丢失。但这种对数据安全性的要求对性能是有影响的,所以不同的 NoSQL 系统在自身性能的考虑下,在数据安全上采取了不太一样的策略。

  单机可靠性

  单机可靠性理解起来非常简单,它的定义是写操作不会由于机器重启或者断电而丢失。通常单机可靠性的保证是通过把数据写到磁盘来完成的,而这通常会造成磁盘I/O成为整个系统的瓶颈。下面我们谈谈一些在单机可靠性的保证下提高性能的方法。

  控制 fsync 的调用频率

  Redis 提供了几种对 fsync 调用频率的控制方法。应用开发者可以配置 Redis 在每次更新操作后都执行一次 fsync,这样会比较安全,当然也就比较慢。Redis 也可以设置成N秒种调用一次 fsync,这样性能会更好一点。但这样的后果就是一旦出现故障,最多可能导致N秒内的数据丢失。而对一些可靠性要求不太高的场合(比如仅仅把 Redis 当 Cache 用的时候),应用开发者甚至可以直接关掉 fsync 的调用:让操作系统来决定什么时候需要把数据 flush 到磁盘(译者注:这只是 Redis append only file 的机制,Redis 是可以关闭 aof 日志的,另外,Redis 本身支持将内存中数据 dump 成 rdb 文件的机制,和上面说的不是一回事)。

  使用日志型的数据结构

  Cassandra、HBase、Redis 和 Riak 都会把写操作顺序的写入到一个日志文件中。相对于存储系统中的其他数据结构,上面说到的日志文件可以频繁地进行 fsync 操作,这样就把对磁盘的随机写变成顺序写了。

  通过合并写操作提高吞吐性能

  Cassandra 有一个机制,它会把一小段时间内的几个并发的写操作放在一起进行一次 fsync 调用,这种做法叫 group commit。

  多机可靠性

  由于硬件层面有时会造成无法恢复的损坏,单机可靠性的保证在这时就鞭长莫及了。对于一些重要数据,跨机器做备份保存是必备的安全措施。一些 NoSQL 系统提供了多机可靠性的支持。

  Redis 采用传统的主从数据同步的方式。

  MongoDB 提供了一种叫 Replica Sets 高可用架构。

  Riak、Cassandra 和 Voldemort 提供了一些更灵活的可配置策略,并提供一个可配置的参数N,代表每一个数据会被备份的份数。为了应对整个数据中心出现故障的情况,需要实现跨数据中心的多机备份功能。

  横向扩展带来性能提升

  横向扩展的目标是达到线性的效果,即如果你增加一倍的机器,那么负载能力应该也能相应的增加一倍。其主要需要解决的问题是如何让数据在多台机器间分布,这里面涉及到分片技术。

  分片的意思,就是没有任何一台机器可以处理所有写请求,也没有任何一台机器可以处理对所有数据的读请求。下面我们将会对 hash 分片和范围分片两种分片方式进行描述。

  如非必要,请勿分片

  分片会导致系统复杂程度大增,所以,如果没有必要,请不要使用分片。普通情况下,我们可以使用读写分离和构建缓存的方式来缓解我们的数据读压力。但如果写操作达到单点无法承担的程度,那我们可能就真的需要进行分片了。

  通过协调器进行数据分片

  一种分片策略是通过引入一个中间代理层来实现,该代理层记录数据在各个节点的分布状况,所有读写请求都通过代理层来做路由。比如与 CouchDB 的两个项目:Lounge 和 BigCouch。类似的,Twitter 自己也实现了一个叫 Gizzard 的协调器,可以实现数据分片和备份功能。

0
相关文章