寫這一篇內容的原因是MySQL5.6.2突然推出了memcached的功能。NoSQL to InnoDB with Memcached的出現,可以看出NoSQL對關聯式資料庫的確產生了巨大的影響,個人覺得這是一個非常大的進步,可以讓開發人員更加方便的使用NoSQL和關聯式資料庫。NoSQL一般被認為效能高於關聯式資料庫,那麼直接在InnoDB之上提供NoSQL功能並和MySQL共存是否是一個更好的選擇呢?
MySQL with HandlerSocket
去年在twitter上看到HandlerSocket的出現,並宣稱效能是Memcached的兩倍時,非常令人吃驚,居然可以達到750000qps。接著HandlerSocket成為NoSQL領域談論的焦點之一, 大量的人開始想要嘗試,並做過一些自己的效能測試。 是HandlerSocket的結構圖:
圖1 HandlerSocket結構圖(來源於官方)
HandlerSocket的出現,給我們眼前一亮的感覺。原來InnoDB的效能已經足夠好,並可以直接提供NoSQL的功能。最大的好處就是可以共用MySQL的功能,DBA以前的經驗一樣可以用。但是有些小小的風險:
- HandlerSocket沒有與MySQL一起發布版本,因此對於使用MyISAM引擎的使用者是無緣的。不過現在Percona-Server已經整合了HandlerSocket,可以非常方便的使用。
- 目前大規模的成功案例並不多,國內也只有少部分公司在嘗試,我知道的有飛信開放平台,據說還不錯。
- 官方給出的測試資料在應用情境上其實並不充分,至少測試的情境跟我們實際使用的情境相差很大。但是毫無疑問, HandlerSocket的效能比直接使用MySQL肯定要高效得多。
InnoDB with Memcached
也許是因為HandlerSocket的火爆的衝擊,也許是受HandlerSocket的啟發,MySQL開始關注NoSQL領域的應用,並在MySQL5.6.2版本增加了通過Memcached協議直接存取原生Innodb API的功能。
InnoDB with Memcached是在提供MySQL服務的同一進程中提供Memcached服務 ,這與HandlerSocket的架構模式幾乎是一樣的。雖然目前InnoDB with Memcached還是預覽版本,但是我個人更看好它,因為:
- 它使用Memcached協議,並同時支援文本和二進位協議,在client的選擇和成熟度等級上就要勝出許多;
- 其支援的三種cache模式,不但可以省去開發中使用Memcached來快取資料的麻煩,並且具有更好的可靠性和資料一致性;
- 在應用程式中,可以使用高效的memcached協議來操作資料,同時也可以使用sql進行複雜的查詢操作;
注意:目前通過memcached的更新操作不會記錄到binlog中,未來的版本會支援。
圖二 InnoDB with Memcached
Memcached and MySQL Cluster
顯而易見,我們會想到MySQL Cluster結合Memcached是一個更好的組合,MySQL Cluster提供了99.999%高可用性,並真正提供了去中心化的無縫高可擴充性。還有什麼比這更人興奮的呢。
MySQL已經提供了這樣的功能,原始碼在這裡。這裡有一個O'Reilly MySql Conference大會的PPT示範 ,你也可以看下這個功能開發人員的一篇部落格。
圖三 NDB with Memcached
MySQL Cluster雖然具有高可靠性和無縫擴充的優勢,但是對於複雜SQL查詢的效率卻不能令人滿意。不過對於僅僅依賴於key-value查詢和寫入的海量資料存放區需求,MySQL Cluster with Memcached應該是個很好的選擇。
總結
Memcached協議由於其簡單、協議輕量、存在大量的client,所以提供相容Memcached協議的產品比較佔據先天的優勢。
MySQL提供NoSQL的功能,個人覺得並不是MySQL耐不住寂寞,而是的確在響應使用者的需求。我前面的文章也說過,“NoSQL只是一個概念,並不是一個資料庫 產品,MySQL也可以是NoSQL”,現在也正應了這句話。NoSQL從架構上就約束了開發人員的架構和開發方式,從而提高擴充性和效能,而NoSQL和MySQL的融合,也同時提供了複雜查詢功能。
雖然MySQL提供了NoSQL功能,如果你要嘗試的話,你的資料庫設計必須從NoSQL從發,然後再考慮SQL查詢功能。
SQL與NoSQL的融合的確會給開發人員帶來方便,比如最近很流行的Mongodb,它吸引開發最大的點就是支援簡單的關係查詢。SQL與NoSQL的融合可能是未來很多資料庫產品的一個趨勢。但是純NoSQL資料庫的優勢也是顯著的,就是他的簡單、高效、易擴充。
參考連結:
- Mongodb的SQL支援
- Tokyocabinet的table支援
- Schema-Free vs NoSQL
- MySQL Cluster - NoSQL access with some SQL
- 我的新浪微博@sunli1223NoSQL微群
關於作者
孫立,目前為去哪兒網(qunar.com)進階系統架構師。曾就職於鳳凰網、ku6和搜狐。多年互連網從業經驗和程式開發,對分布式搜尋引擎的開發,高並發,大資料量網站系統架構最佳化,高可用性,延展性,分布式系統緩衝,資料庫分表分庫(sharding)等有豐富的經驗,並且對營運監控和自動化營運控制有經驗。是開源項目phplock,phpbuffer的作者。近期開發了一個NOSQL資料庫儲存INetDB,是NoSQL資料庫愛好者。
本文已經首發於InfoQ中文站,著作權,原文為《MySQL與NoSQL——SQL與NoSQL的融合》,如需轉載,請務必附帶本聲明,謝謝。
InfoQ中文站是一個面向中高端技術人員的線上獨立社區,為Java、.NET、Ruby、SOA、敏捷、架構等領域提供及時而有深度的資訊、高端技術大會如QCon 、線下技術交流活動QClub、免費迷你書下載如《架構師》等。