NoSql爲輔php
1. 手動同步插入數據。html
//寫入數據的示例僞代碼 //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數據庫
若是有數據一致性要求,能夠像以下的方式使用:mysql
//寫入數據的示例僞代碼 //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層作一個統一的封裝,就能實現重用了,其餘代碼都不用作任何的修改。sql
在某些能夠根據主鍵查詢的地方,使用高效的NoSQL數據庫查詢,這樣就節省了MySQL的查詢,用NoSQL的高性能來抵擋這些查詢。mongodb
2. 自動鏡像數據。數據庫
這種不經過程序代碼,而是經過MySQL把數據同步到NoSQL中,這種模式是上面一種的變體,是一種對寫入透明可是具備更高技術難度一種模式。這種模式適用於現有的比較複雜的老系統,經過修改代碼不易實現,可能引發新的問題。同時也適用於須要把數據同步到多種類型的存儲中。json
MySQL到NoSQL同步的實現可使用MySQL UDF函數,MySQL binlog的解析來實現。能夠利用現有的開源項目來實現,好比:後端
有了這兩個MySQL UDF函數庫,咱們就能經過MySQL透明的處理Memcached或者Http協議,這樣只要有兼容Memcached或者Http協議的NoSQL數據庫,那麼咱們就能經過MySQL去操做以進行同步數據。再結合lib_mysqludf_json,經過UDF和MySQL觸發器功能的結合,就能夠實現數據的自動同步。緩存
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){ status=NoSQL.Add(id,data);//以寫入MySQL產生的自增id爲主鍵寫入NoSQL數據庫 } if(id>0 && status==true){ DB.commit();//提交事務 }else{ DB.rollback();//不成功,進行回滾 }
把須要查詢的字段,通常都是數字,時間等類型的小字段存儲於MySQL中,根據查詢創建相應的索引,其餘不須要的字段,包括大文本字段都存儲在NoSQL中。在查詢的時候,咱們先從MySQL中查詢出數據的主鍵,而後從NoSQL中直接取出對應的數據便可。
這種架構模式把MySQL和NoSQL的做用進行了融合,各司其職,讓MySQL專門負責處理擅長的關係存儲,NoSQL做爲數據的存儲。它有如下優勢:
NoSql爲主:
1. 純nosql。
在一些數據庫結構常常變化,數據結構不定的系統中,就很是適合使用NoSQL來存儲。好比監控系統中的監控信息的存儲,可能每種類型的監控信息都不太同樣。這樣能夠避免常常對MySQL進行表結構調整,增長字段帶來的性能問題。
這種架構的缺點就是數據直接存儲在NoSQL中,不能作關係數據庫的複雜查詢,若是因爲需求變動,須要進行某些查詢,可能沒法知足,因此採用這種架構的時候須要確認將來是否會進行復雜關係查詢以及如何應對。
MongoDB就帶有關係查詢的功能,能解決經常使用的關係查詢。
2. 以NoSQL爲數據源的架構。
純NoSQL的架構雖然結構簡單,易於開發,可是在應付需求的變動、穩定性和可靠性上,老是給開發人員一種風險難於控制的感受。爲了下降風險,系統的功能不侷限在NoSQL的簡單功能上,咱們可使用以NoSQL爲數據源的架構。
在這種架構中,應用程序只負責把數據直接寫入到NoSQL數據庫就OK,而後經過NoSQL的複製協議,把NoSQL數據的每次寫入,更新,刪除操做都複製到MySQL數據庫中。同 時,也能夠經過複製協議把數據同步複製到全文檢索實現強大的檢索功能。在海量數據下面,咱們也能夠根據不一樣的規則,把數據同步複製到設計好的分表分庫的 MySQL中。這種架構:
這種架構須要考慮數據複製的延遲問題,這跟使用MySQL的master-salve模式的延遲問題是同樣的,解決方法也同樣。
在這種以NoSQL爲數據源的架構中,最核心的就是NoSQL數據庫的複製功能的實現。而當前的幾乎全部的NoSQL都沒有提供比較易於使用的複製接口來完成這種架構,對NoSQL進行復制協議的二次開發,須要更高的技術水平,因此這種架構看起來很好,可是卻不是很是容易實現的。個人開源項目PHPBuffer中有個實現TokyoTyrant複製的例子,雖然是PHP版本的,可是很容易就能夠翻譯成其餘語言。經過這個例子的代碼,能夠實現從Tokyo Tyrant實時的複製數據到其餘系統中。