回覆列表
  • 1 # 葛小波不見了

    不同的Nosql,其實應用的場景各有不同,所以我們應該先了解不同Nosql之間的差別,然後分析什麼才是最適合我使用的Nosql。

    Nosql介紹

    Nosql的全稱是Not Only Sql,這個概念早起就有人提出,在09年的時候比較火。Nosql指的是非關係型資料庫,而我們常用的都是關係型資料庫。就像我們常用的mysql,sqlserver一樣,這些資料庫一般用來儲存重要資訊,應對普通的業務是沒有問題的。但是,隨著網際網路的高速發展,傳統的關係型資料庫在應付超大規模,超大流量以及高併發的時候力不從心。而就在這個時候,Nosql得到的告訴的發展。

    Nosql和關係型資料庫的區別

    1.儲存方式

    關係型資料庫是表格式的,因此儲存在表的行和列中。他們之間很容易關聯協作儲存,提取資料很方便。而Nosql資料庫則與其相反,他是大塊的組合在一起。通常儲存在資料集中,就像文件、鍵值對或者圖結構。

    2.儲存結構

    關係型資料庫對應的是結構化資料,資料表都預先定義了結構(列的定義),結構描述了資料的形式和內容。這一點對資料建模至關重要,雖然預定義結構帶來了可靠性和穩定性,但是修改這些資料比較困難。而Nosql資料庫基於動態結構,使用與非結構化資料。因為Nosql資料庫是動態結構,可以很容易適應資料型別和結構的變化。

    3.儲存規範

    關係型資料庫的資料儲存為了更高的規範性,把資料分割為最小的關係表以避免重複,獲得精簡的空間利用。雖然管理起來很清晰,但是單個操作設計到多張表的時候,資料管理就顯得有點麻煩。而Nosql資料儲存在平面資料集中,資料經常可能會重複。單個數據庫很少被分隔開,而是儲存成了一個整體,這樣整塊資料更加便於讀寫

    4.儲存擴充套件

    這可能是兩者之間最大的區別,關係型資料庫是縱向擴充套件,也就是說想要提高處理能力,要使用速度更快的計算機。因為資料儲存在關係表中,操作的效能瓶頸可能涉及到多個表,需要透過提升計算機效能來克服。雖然有很大的擴充套件空間,但是最終會達到縱向擴充套件的上限。而Nosql資料庫是橫向擴充套件的,它的儲存天然就是分散式的,可以透過給資源池新增更多的普通資料庫伺服器來分擔負載。

    5.查詢方式

    關係型資料庫透過結構化查詢語言來操作資料庫(就是我們通常說的SQL)。SQL支援資料庫CURD操作的功能非常強大,是業界的標準用法。而Nosql查詢以塊為單元操作資料,使用的是非結構化查詢語言(UnQl),它是沒有標準的。關係型資料庫表中主鍵的概念對應Nosql中儲存文件的ID。關係型資料庫使用預定義最佳化方式(比如索引)來加快查詢操作,而Nosql更簡單更精確的資料訪問模式。

    6.事務

    關係型資料庫遵循ACID規則(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)),而Nosql資料庫遵循BASE原則(基本可用(Basically Availble)、軟/柔性事務(Soft-state )、最終一致性(Eventual Consistency))。由於關係型資料庫的資料強一致性,所以對事務的支援很好。關係型資料庫支援對事務原子性細粒度控制,並且易於回滾事務。而Nosql資料庫是在CAP(一致性、可用性、分割槽容忍度)中任選兩項,因為基於節點的分散式系統中,很難全部滿足,所以對事務的支援不是很好,雖然也可以使用事務,但是並不是Nosql的閃光點。

    7.效能

    關係型資料庫為了維護資料的一致性付出了巨大的代價,讀寫效能比較差。在面對高併發讀寫效能非常差,面對海量資料的時候效率非常低。而Nosql儲存的格式都是key-value型別的,並且儲存在記憶體中,非常容易儲存,而且對於資料的 一致性是 弱要求。Nosql無需sql的解析,提高了讀寫效能。

    8.授權方式

    關係型資料庫通常有SQL Server,Mysql,Oracle。主流的Nosql資料庫有redis,memcache,MongoDb。大多數的關係型資料庫都是付費的並且價格昂貴,成本較大,而Nosql資料庫通常都是開源的。

    Redis,Memcache,MongoDb的特點與區別

    Redis

    優點

    支援多種資料結構,如 string(字串)、 list(雙向連結串列)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基數估算)

    支援持久化操作,可以進行aof及rdb資料持久化到磁碟,從而進行資料備份或資料恢復等操作,較好的防止資料丟失  的手段。

    支援透過Replication進行資料複製,透過master-slave機制,可以實時進行資料的同步複製,支援多級複製和增量複製,master-slave機制是Redis進行HA的重要手段。

    單執行緒請求,所有命令序列執行,併發情況下不需要考慮資料一致性問題。

    支援pub/sub訊息訂閱機制,可以用來進行訊息訂閱與通知。

    支援簡單的事務需求,但業界使用場景很少,並不成熟。

    缺點

    Redis只能使用單執行緒,效能受限於CPU效能,故單例項CPU最高才可能達到5-6wQPS每秒(取決於資料結構,資料大小以及伺服器硬體效能,日常環境中QPS高峰大約在1-2w左右)。

    支援簡單的事務需求,但業界使用場景很少,並不成熟,既是優點也是缺點。

    Redis在string型別上會消耗較多記憶體,可以使用dict(hash表)壓縮儲存以降低記憶體耗用。

    Memcache

    優點

    Memcached可以利用多核優勢,單例項吞吐量極高,可以達到幾十萬QPS(取決於key、value的位元組大小以及伺服器硬體效能,日常環境中QPS高峰大約在4-6w左右)。適用於最大程度扛量。

    支援直接配置為session handle。

    缺點

    只支援簡單的key/value資料結構,不像Redis可以支援豐富的資料型別。

    無法進行持久化,資料不能備份,只能用於快取使用,且重啟後資料全部丟失。

    無法進行資料同步,不能將MC中的資料遷移到其他MC例項中。

    Memcached記憶體分配採用Slab Allocation機制管理記憶體,value大小分佈差異較大時會造成記憶體利用率降低,並引發低利用率時依然出現踢出等問題。需要使用者注重value設計。

    MongoDB

    優點

    更高的寫負載,MongoDB擁有更高的插入速度。

    處理很大的規模的單表,當資料表太大的時候可以很容易的分割表。

    高可用性,設定M-S不僅方便而且很快,MongoDB還可以快速、安全及自動化的實現節點(資料中心)故障轉移。

    快速的查詢,MongoDB支援二維空間索引,比如管道,因此可以快速及精確的從指定位置獲取資料。MongoDB在啟動後會將資料庫中的資料以檔案對映的方式載入到記憶體中。如果記憶體資源相當豐富的話,這將極大地提高資料庫的查詢速度。

    非結構化資料的爆發增長,增加列在有些情況下可能鎖定整個資料庫,或者增加負載從而導致效能下降,由於MongoDB的弱資料結構模式,新增1個新欄位不會對舊錶格有任何影響,整個過程會非常快速。

    缺點

    不支援事務。

    MongoDB佔用空間過大 。

    MongoDB沒有成熟的維護工具。

    Redis、Memcache和MongoDB的區別

    1. 效能

    三者的效能都比較高,總的來講:Memcache和Redis差不多,要高於MongoDB。

    2. 便利性

    memcache資料結構單一。

    redis豐富一些,資料操作方面,redis更好一些,較少的網路IO次數。

    mongodb支援豐富的資料表達,索引,最類似關係型資料庫,支援的查詢語言非常豐富。

    3. 儲存空間

    redis在2.0版本後增加了自己的VM特性,突破物理記憶體的限制;可以對key value設定過期時間(類似memcache)。

    memcache可以修改最大可用記憶體,採用LRU演算法。

    mongoDB適合大資料量的儲存,依賴作業系統VM做記憶體管理,吃記憶體也比較厲害,服務不要和別的服務在一起。

    4. 可用性

    redis,依賴客戶端來實現分散式讀寫;主從複製時,每次從節點重新連線主節點都要依賴整個快照,無增量複製,因效能和效率問題,所以單點問題比較複雜;不支援自動sharding,需要依賴程式設定一致hash 機制。一種替代方案是,不用redis本身的複製機制,採用自己做主動複製(多份儲存),或者改成增量複製的方式(需要自己實現),一致性問題和效能的權衡。

    Memcache本身沒有資料冗餘機制,也沒必要;對於故障預防,採用依賴成熟的hash或者環狀的演算法,解決單點故障引起的抖動問題。

    mongoDB支援master-slave,replicaset(內部採用paxos選舉演算法,自動故障恢復),auto sharding機制,對客戶端遮蔽了故障轉移和切分機制。

    5. 可靠性

    redis支援(快照、AOF):依賴快照進行持久化,aof增強了可靠性的同時,對效能有所影響。

    memcache不支援,通常用在做快取,提升效能。

    MongoDB從1.8版本開始採用binlog方式支援持久化的可靠性。

    6. 一致性

    Memcache 在併發場景下,用cas保證一致性。

    redis事務支援比較弱,只能保證事務中的每個操作連續執行。

    mongoDB不支援事務。

    7. 資料分析

    mongoDB內建了資料分析的功能(mapreduce),其他兩者不支援。

    8. 應用場景

    redis:資料量較小的更效能操作和運算上。

    memcache:用於在動態系統中減少資料庫負載,提升效能;做快取,提高效能(適合讀多寫少,對於資料量比較大,可以採用sharding)。

    MongoDB:主要解決海量資料的訪問效率問題。

  • 中秋節和大豐收的關聯?
  • 丟芒果快遞員承認撒謊,你怎麼看待女快遞員撒謊?