2010年3月4日 星期四

[引用]Distributed Filesystem / Database , Database Optimization, NoSQL

出處:http://blog.xdite.net/?p=1704


基本上如果你的網站規模不到一定規模(這邊的定義是,用到幾十台機器),是不需要去研究 Distributed Filesystem / Distributed Database 的。不過我還是稍微聊一下它們的使用情境好了。
Distributed Filesystem 我們在做完網站後,可以使用 Load Balancer 把 request 分散到各台 web-front 機器上,但隨之就會產生一個問題,全站上的靜態檔案要怎樣讓這麼多台的 web-front 存取呢?基本想法當然是用 NFS,但是隨著網站成長,很快的 NFS 就不夠擔當這種重責大任了。於是另一種簡單的作法又出現了,用大量的 rsync + script 將檔案複製到多台 來*暫時* 解決 NFS 不夠用的情況。這個方法勉強夠用,但是會隨之產生架構維護上的難度缺乏整體的管理與監控…。而且在有大量小檔案需要同步,或者是檔案數量到達了百萬級、千 萬級時,純用 rsync 非常的傷…
所以這時候才會用上 Distributed Filesystem 來解決這個問題。DFS 的作用是讓 Application 不用理會檔案資源實際會存在哪裡,往裡扔就對了,接下來的事情 DFS 會自己處理掉。Opensource 中比較出名的 Distributed Filesystem 當屬 Hadoop Distributed File System 。
HDFS 想做到的是 Google File System (GFS)能提供的:
1. 易於擴充的分散式檔案系統
2. 可運作於廉價的普通硬體上,又可以提供硬體錯誤容忍能力
3. 給大量的用戶提供總體性能較高的服務
解決以上情景會遇到的問題,同時又提供擴充性、移植性、資料一致性,而且支援相當大的資料規模(Perabytes)。Facebook 本身也是用 HDFS。
有關於這部分的閱讀資料,可參考國網中心的 Hadoop Distributed File System 這份投影片
Distributed Database 這個主題 DK 講過也講的蠻清楚了,我就不重複寫一遍了。最重要的目標是 CAP theorem 的 Eventual Consistent(資料最終一致性)。比較知名的 Distributed Database 有 HBase 、Cassandra、Voldemort 等等….
=====
Database Optimization
這方面的主題能談的非常多。而且每個主題也都相當博大精深。既然這系列的重點是 Reading Martrial,我就挑重點講好了。
首先是:MySQL 的調校 (軟硬體、版本、設定),這一段 DK 也已經專門整理過一篇文章了。內容是有關於機器、硬碟的挑選,架構的設計。挑選適合 MySQL 使用的 FileSystem ,my.cnf 的調校。
而跟 MySQL 各方面都不是很熟,看原文書又覺得很痛苦的人。我推薦看對岸簡朝陽寫的 MySQL 性能調優與架構設計 這一本書。基本上如果想瞭解 MySQL 的各樣基礎知識甚至進階知識,這本書大部分都含括了,而且寫的相當深入淺出….
架構設計上的需求,可直接看這本書的第三篇 (Ch12-Ch18),以及 High Performance MySQL 這本書。追求極致的 Performance Optimizaion 可追 MySQL Performance Blog 這個 blog …
DB 永遠是 Web Application 的瓶頸。而使用 ActiveRecord 想對 query optimize 的幾個 tips 是:
1. 不要忘記打 index,這一點很常在寫 model code ,寫著寫嗨了就忘記了,忘記打 index 可能會造成 slow query,可用 rails_indexes 這個 plugin。
2. 只 SELECT 你要的資料,而非 SELECT *。這一點可以透過 scrooge 這個 plugin 辦到。
3. 避免產生 n+1 query。
4. 記得加 counter_cache。( 3. 與 4. 都可用 bullet 這個 plugin 抓出來 )
5. 記得打開 my.cnf 裡面記錄 slow query log 的選項,然後善用 EXPLAIN 抓出真正的原因。
6. 儘量使用 find_in_batch,而不要使用迴圈跑 find(i)
7. 少用 join,多用幾次 select 做到相同的事。
8. 必要的時候,使用 SQL Antipattern 技巧,denormalize,實作 eav 等等….這方面可以看 SQL Antipaatern 這本書。
=====
NoSQL
對岸 JavaEye 的站長 Robbin 寫過一篇「NoSQL數據庫探討之一 - 為什麼要用非關係數據庫?」。整理了為什麼世界上比較大型的 Web 2.0 Site 要捨棄 RDBMS 轉而開發/使用 NoSQL 的原因:
1. High performance - 對數據庫高並發讀寫的需求
2. Huge Storage - 對海量數據的高效率存儲和訪問的需求
3. High Scalability && High Availability- 對數據庫的高可擴展性和高可用性的需求
這些 production 網站,對 DBMS 特性的要求 :
1.數據庫事務一致性需求
2.數據庫的寫實時性和讀實時性需求
3.對複雜的SQL查詢,特別是多表關聯查詢的需求
以及市面上滿足這些需求的各種 NoSQL (依照分類)以及簡單介紹,相當值得一看。
另外 High Scalability 這兩天也出了一篇 Paper: High Performance Scalable Data Stores

而我個人比較有在玩的是 MongoDB,他比較貼近 MySQL 的用法,但速度上快少 MySQL 不少。MongoDB 貼近 MySQL 的用法和一些其它的 feature,也比較滿足我在開發網站上的需求,比如說我就相當喜歡它以下的特色:
* Document-oriented # BSON ( Binary JSON)
* schema-less
* full index support
* dynaminc query (MongoDB - Ruby document store that doesn』t rhyme with ouchP.34)
* MM replication & auto sharding
* 可用來做 Real-Time Analytics …# upsert 特性
* subdocument 甚至是 nested document # 做巢狀 comment 特別簡單。知名留言系統 Disqus (支援 Nested Comment )的 backend 就是 Mongodb。
2009 的 Rubyconf 就有一個關於 MongoDB 的 Talk :Getting Non-Relational with MongoDB,相當值得一看。
====
以上就是我關於 Scaling Rails Site 的五篇文章,感謝收看…
另外推薦幾本 General Scaling 的書:
* Building Scalable Web Sites (Cal Henderson 著) # 這本是經典中的經典
* 構建高性能 Web 站點 (郭欣 著)# 這是對岸出的新書,也是講了相當多 general topic
還有這一個 blog: High Scalability

【下列文章您可能也有興趣】

沒有留言: