文章標題,文章標題大全

來源:互聯網
上載者:User

文章標題,文章標題大全
NoSQL 資料庫產品學習總結(一)

本篇文章共分為四個章節,會陸續整理下 Memcached、Redis、tair、mongodb、hbase、SequoiaDB、 Cassandra的相關知識。 本文為第一個章節,先簡介下memcached、reids,有理解不到位的地方,請不吝賜教。

Memcached

1.簡介

Memcached 是臨時性建值儲存的NoSQL產品(官網:memcached.org), 可以用它搭建一套高速的分布式緩衝系統,資料採用LRU演算法儲存在記憶體中,資料不會持久化到磁碟,即當記憶體掉電或記憶體空間不夠,資料會全部釋放或LRU部分釋放。常被用來做像Mysql這類產品的前面的加速緩衝系統。產品由Danga Interactive公司研發,服務端部分是C寫的,用戶端部分只要實現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的服務端和用戶端,具體通訊的內容在1.4版本以前僅支援普通的文本協議,1.4版本以後支援了高效的二進位協議。

4.部署結構

Memcached的單機部署方案很簡單,單機啟動後,在用戶端通過TCP或UDP連接埠串連上來,然後就可以通過Memcached協議使用Memcached了。而叢集部署方案,則是針對存在多台Memcached的情境,多台Memcached在通用的方案當中,他們彼此是獨立,即互相不感知的。具體的資料Sharding邏輯全部封裝在Memcached的用戶端中。大致如下:

儲存一個KV:

讀取一個KV:

由圖可見資料的Sharding邏輯全部寫在了用戶端裡面。

Repcached:

在memcached的解決方案中,分布的不同memcached結點彼此是不能通訊的,要實現memcached結點的之間的Master/Slave結構,有一個日本同學開發了一個第三方的工具Recached,可以實現Memcached的主備結構。從結點可以即時的同步主結點的資料,當主節點掛掉,從結點可以熱備的提供服務。

(1) 服務端的串連管理基於libevent 非同步事件引擎,能在能在Linux、BSD、Solaris等作業系統上發揮其高效能。能支撐高並發的請求。
(2) 資料不能持久化,常用作資料的加速緩衝。
(3) 通訊協議簡單,用戶端豐富(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是一個使用用戶端/伺服器模型(也被稱作請求/響應協議)的TCP伺服器:

Redis叢集結點間的協議採用的是二進位協議(binary protocol)
用戶端與叢集通訊採用的是文本協議(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相比一點都不差。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.