NoSQL 数据库产品学习总结(一)
NoSQL 数据库产品学习总结(一)
本篇文章共分为四个章节,会陆续整理下 Memcached、Redis、tair、mongodb、hbase、SequoiaDB、 Cassandra的相关知识。 本文为第一个章节,先简单介绍下memcached、reids,有理解不到位的地方,请指教。
Memcached
1.简单介绍
Memcached 是暂时性建值存储的NoSQL产品(官网:memcached.org), 能够用它搭建一套快速的分布式缓冲系统。数据採用LRU算法存储在内存中,数据不会持久化到磁盘,即当内存掉电或内存空间不够。数据会所有释放或LRU部分释放。常被用来做像Mysql这类产品的前面的加速缓冲系统。产品由Danga Interactive公司研发,服务端部分是C写的,client部分仅仅要实现Memcached的网络协议。理论上不论什么语言都能够。
2.数据存储
(1) memcached的内存单元,它的相应关系是:一个Slabclass包括多个slab,一个slab包括多个大小相等的chunk,真正存放memcached数据的最小单元item就放在chunk中。
Memcached 内存结构图:
參考:http://brionas.github.io/2014/01/06/memcached-manage/
(2) memcached的数据仅仅会存储在内存中,并不会持久化到磁盘,内存撑满则启动LRU策略。
3.通讯协议
服务端进程採用TCP或UDP通道来链接Memcached的服务端和client,详细通信的内容在1.4版本号曾经仅支持普通的文本协议,1.4版本号以后支持了高效的二进制协议。
4.部署结构
Memcached的单机部署方案非常easy,单机启动后。在client通过TCP或UDPport连接上来。然后就能够通过Memcached协议使用Memcached了。
而集群部署方案。则是针对存在多台Memcached的场景,多台Memcached在通用的方案其中,他们彼此是独立。即互相不感知的。详细的数据Sharding逻辑所有封装在Memcached的client中。
大致示意图例如以下:
存储一个KV:
读取一个KV:
由图可见数据的Sharding逻辑所有写在了client里面。
Repcached:
在memcached的解决方式中。分布的不同memcached结点彼此是不能通信的,要实现memcached结点的之间的Master/Slave结构。有一个日本同学开发了一个第三方的工具Recached,能够实现Memcached的主备结构。从结点能够实时的同步主结点的数据,当主节点挂掉,从结点能够热备的提供服务。
- 特性
(1) 服务端的连接管理基于libevent 异步事件引擎,能在能在Linux、BSD、Solaris等操作系统上发挥其高性能。能支撑高并发的请求。
(2) 数据不能持久化。经常使用作数据的加速缓冲。
(3) 通讯协议简单。client丰富(C/C++、PHP、Java、Python、Ruby、Perl、Windows/.NET、MySQL、PostgreSQL、Erlang、Lua、Lisp dialects等)
- 性能指标
性能这块官方文档这么说:On a fast machine with very high speed networking, memcached can easily handle 200,000+ requests per second. With heavy tuning or even faster hardware it can go many times that. Hitting it a few hundred times per second, even on a slow machine, usually isn’t cause for concern.
看来轻轻松松20W+的qps。
Redis
- 简单介绍
Redis是一个支持丰富数据结构的相似memcached的KV分布式存储系统。其开发工作由Redis的开发工作由VMware主持。
- 数据存储
(1) 数据存储到内存。并通过配置也能够持久化到磁盘。
假设仅存储在内存。则其功能和Memcached相似。而持久化到磁盘则能够保证数据即使由于掉电也不会丢失,眼下支持的持久化方式例如以下两种:RDB持久化方式和AOF持久化方式。
RDB持久化方式: 在指定的时间间隔能对你的数据进行快照存储.
AOF持久化方式:则是以与更新命令同步追加的方式实时更新数据文件。
依据以上两种持久化策略能够看出,RDB定时快照的方式在遇到掉电等突发情况下,会丢失当前和近期一次快照时间间隔内的操作数据。而AOF持久化方式通过后台线程fsync的方式通过内存出具和磁盘数据,由于是异步,也会丢失一定的数据。可是由于设置的fsync的策略不同。丢失的数据会非常少,同一时候性能较比RDB也会差一些。
- 通讯协议
Redis是一个使用client/server模型(也被称作请求/响应协议)的TCPserver:
Redis集群结点间的协议採用的是二进制协议(binary protocol)
client与集群通信採用的是文本协议(ascii protocol)
- 部署结构
在最新的3.0版本号的Redis中,新增了集群部署的结构。集群各个节点能够通过gossip协议进行数据同步。
而3.0曾经的版本号測试採用Redis Sentinel利用单双MS的结构来管理集群。
集群结点间通信採用gossip协议。
- 特性
(1) 具有157个操作命令
(2) 支持管道(一次发送多个命令)
(3) 支持消息Pub/sub 机制。
(4) 批量操作的事物机制。
- 性能指标
Redis的benchmark,从測试结果来看,单纯的get/set命令能够达到10w+每秒,而pipeline的批量运行命令,已经达到了50w+的水准。其性能和memcached相比一点都不差。