前麵我們講解《為什麼要使用NoSQL》和《關係數據庫還是NoSQL數據庫》兩 篇從大體上介紹了為什麼要用NoSQL,何時該用NoSQL。經常有朋友遇到困惑,看到NoSQL的介紹,覺得很好,但是卻不知道如何正式用到自己的項目 中。很大的原因就是思維固定在MySQL中了,他們問得最多的問題就是用了NoSQL,我如何做關係查詢。那麼接下來,我們看下怎麼樣在我們的係統中使用 NoSQL。
怎麼樣把NoSQL引入到我們的係統架構設計中,需要根據我們係統的業務場景來分析,什麼樣類型的數據適合存儲在NoSQL數據庫中,什麼樣類型的 數據必須使用關係數據庫存儲。明確引入的NoSQL數據庫帶給係統的作用,它能解決什麼問題,以及可能帶來的新的問題。下麵我們分析幾種常見的NoSQL 架構。
不改變原有的以MySQL作為存儲的架構,使用NoSQL作為輔助鏡像存儲,用NoSQL的優勢輔助提升性能。
圖 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){
status=NoSQL.Add(id,data);//以寫入MySQL產生的自增id為主鍵寫入NoSQL數據庫
}
if(id>0 && status==true){
DB.commit();//提交事務
}else{
DB.rollback();//不成功,進行回滾
}
上麵的代碼看起來可能覺得有點麻煩,但是隻需要在DB類或者ORM層做一個統一的封裝,就能實現重用了,其他代碼都不用做任何的修改。
這種架構在原有基於MySQL數據庫的架構上增加了一層輔助的NoSQL存儲,代碼量不大,技術難度小,卻在可擴展性和性能上起到了非常大的作用。 隻需要程序在寫入MySQL數據庫後,同時寫入到NoSQL數據庫,讓MySQL和NoSQL擁有相同的鏡像數據,在某些可以根據主鍵查詢的地方,使用高 效的NoSQL數據庫查詢,這樣就節省了MySQL的查詢,用NoSQL的高性能來抵擋這些查詢。
圖 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觸發器功能的結合,就可以實現數據的自動同步。