NoSQL架構實踐(一) 以NoSQL為輔

2021-08-27 02:15:54 字數 3220 閱讀 9109

前面[url=為什麼要使用nosql》[/url]和[url=關聯式資料庫還是nosql資料庫》[/url]兩篇從大體上介紹了為什麼要用nosql,何時該用nosql。經常有朋友遇到困惑,看到nosql的介紹,覺得很好,但是卻不知道如何正式用到自己的專案中。很大的原因就是思維固定在mysql中了,他們問得最多的問題就是用了nosql,我如何做關係查詢。那麼接下來,我們看下怎麼樣在我們的系統中使用nosql。

怎麼樣把nosql引入到我們的系統架構設計中,需要根據我們系統的業務場景來分析,什麼樣型別的資料適合儲存在nosql資料庫中,什麼樣型別的資料必須使用關聯式資料庫儲存。明確引入的nosql資料庫帶給系統的作用,它能解決什麼問題,以及可能帶來的新的問題。下面我們分析幾種常見的nosql架構。

[b](一)nosql作為映象[/b]

不改變原有的以mysql作為儲存的架構,使用nosql作為輔助映象儲存,用nosql的優勢輔助提公升效能。

[img]

圖 1 -nosql為映象(**完成模式 )

//寫入資料的示例偽** 

//data為我們要儲存的資料物件

data.title=」title」;

data.name=」name」;

data.time=」2009-12-01 10:10:01」;

data.from=」1」;

id=db.insert(data);//寫入mysql資料庫

nosql.add(id,data);//以寫入mysql產生的自增id為主鍵寫入nosql資料庫

如果有資料一致性要求,可以像如下的方式使用

//寫入資料的示例偽** 

//data為我們要儲存的資料物件

bool status=false;

db.starttransaction();//開始事務

id=db.insert(data);//寫入mysql資料庫

if(id>0)

if(id>0 && status==true)else

上面的**看起來可能覺得有點麻煩,但是只需要在db類或者orm層做乙個統一的封裝,就能實現重用了,其他**都不用做任何的修改。

這種架構在原有基於mysql資料庫的架構上增加了一層輔助的nosql儲存,**量不大,技術難度小,卻在可擴充套件性和效能上起到了非常大的作用。只需要程式在寫入mysql資料庫後,同時寫入到nosql資料庫,讓mysql和nosql擁有相同的映象資料,在某些可以根據主鍵查詢的地方,使用高效的nosql資料庫查詢,這樣就節省了mysql的查詢,用nosql的高效能來抵擋這些查詢。

[img]

圖 2 -nosql為映象(同步模式)

這種不通過程式**,而是通過mysql把資料同步到nosql中,這種模式是上面一種的變體,是一種對寫入透明但是具有更高技術難度一種模式。這種模式適用於現有的比較複雜的老系統,通過修改**不易實現,可能引起新的問題。同時也適用於需要把資料同步到多種型別的儲存中。

mysql到nosql同步的實現可以使用mysql udf函式,mysql binlog的解析來實現。可以利用現有的開源專案來實現,比如:

mysql memcached udfs:從通過udf操作memcached協議。

國內張宴開源的mysql-udf-http:通過udf操作http協議。

有了這兩個mysql udf函式庫,我們就能通過mysql透明的處理memcached或者http協議,這樣只要有相容memcached或者http協議的nosql資料庫,那麼我們就能通過mysql去操作以進行同步資料。再結合lib_mysqludf_json,通過udf和mysql觸發器功能的結合,就可以實現資料的自動同步。

[b](二)mysql和nosql組合[/b]

mysql中只儲存需要查詢的小字段,nosql儲存所有資料。

[img]

圖 3 -mysql和nosql組合

//寫入資料的示例偽** 

//data為我們要儲存的資料物件

data.title=」title」;

data.name=」name」;

data.time=」2009-12-01 10:10:01」;

data.from=」1」;

bool status=false;

db.starttransaction();//開始事務

id=db.insert(「insert into table (from) values(data.from)」);//寫入mysql資料庫,只寫from需要where查詢的字段

if(id>0)

if(id>0 && status==true)else

把需要查詢的字段,一般都是數字,時間等型別的小字段儲存於mysql中,根據查詢建立相應的索引,其他不需要的字段,包括大文字欄位都儲存在nosql中。在查詢的時候,我們先從mysql中查詢出資料的主鍵,然後從nosql中直接取出對應的資料即可。

這種架構模式把mysql和nosql的作用進行了融合,各司其職,讓mysql專門負責處理擅長的關係儲存,nosql作為資料的儲存。它有以下優點:

節省mysql的io開銷。由於mysql只儲存需要查詢的小字段,不再負責儲存大文字字段,這樣就可以節省mysql儲存的空間開銷,從而節省mysql的磁碟io。我們曾經通過這種優化,把mysql乙個40g的表縮減到幾百m。

提高mysql query cache快取命中率。我們知道query cache快取失效是表級的,在mysql表一旦被更新就會失效,經過這種欄位的分離,更新的字段如果不是儲存在mysql中,那麼對query cache就沒有任何影響。而nosql的cache往往都是行級別的,只對更新的記錄的快取失效。

提公升mysql主從同步效率。由於mysql儲存空間的減小,同步的資料記錄也減小了,而部分資料的更新落在nosql而不是mysql,這樣也減少了mysql資料需要同步的次數。

提高mysql資料備份和恢復的速度。由於mysql資料庫儲存的資料的減小,很容易看到資料備份和恢復的速度也將極大的提高。

比以前更容易擴充套件。nosql天生就容易擴充套件。經過這種優化,mysql效能也得到提高。

比如手機鳳凰網就是這種架構 [url]

[b]總結[/b]

以nosql為輔的架構還是以mysql架構的思想為中心,只是在以前的架構上輔助增加了nosql來提高其效能和可擴充套件性。這種架構實現起來比較容易,卻能取得不錯的效果。如果正想在專案中引入nosql,或者你的以mysql架構的系統目前正出現相關的瓶頸,希望本文可以為你帶來幫助。

NoSQL架構實踐(一) 以NoSQL為輔

前面 為什麼要使用nosql 和 關聯式資料庫還是nosql資料庫 兩篇從大體上介紹了為什麼要用nosql,何時該用nosql。經常有朋友遇到困惑,看到nosql的介紹,覺得很好,但是卻不知道如何正式用到自己的專案中。很大的原因就是思維固定在mysql中了,他們問得最多的問題就是用了nosql,我如...

NoSQL架構實踐(一) 以NoSQL為輔

摘要 經常有朋友遇到困惑,看到nosql的介紹,覺得很好,但是卻不知道如何正式用到自己的專案中。很大的原因就是思維固定在mysql中了,他們問得最多的問題就是用了nosql,我如何做關係查詢。那 經常有朋友遇到困惑,看到nosql的介紹,覺得很好,但是卻不知道如何正式用到自己的專案中。很大的原因就是...

NoSQL架構實踐(一) 以NoSQL為輔

怎麼樣把nosql引入到我們的系統架構設計中,需要根據我們系統的業務場景來分析,什麼樣型別的資料適合儲存在nosql資料庫中,什麼樣型別的資料必須使用關聯式資料庫儲存。明確引入的nosql資料庫帶給系統的作用,它能解決什麼問題,以及可能帶來的新的問題。下面我們分析幾種常見的nosql架構。不改變原有...