這應該是這本筆記的第一篇純文字的閒聊筆記.想了很久才決定要下這一篇.作為一個階段的感想也可能不錯.所以便因為這原因.所以便有了這篇東東.首先.因為昨天的某些事情.再者加上之後的事後初步總結.得到出來的結果.其實也心中有數.基本上只是想再一次證明自己的想法不無理由吧.更甚的是給自己一個安心的結論.除此之外便無其他.
接下來先簡單總結一下幾個問題
首先是題目情景大約如下(以自身記憶作回想)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| - 有一個很大型的網站(想像成 Facebook),人流量很多,所以引申了讀與寫的次數很密.就是所謂的並發率很高.
1. 如果目前只有一部的 MySQL 主要已經吃不消.撐不住,那你會作出怎樣的處理? (假設金錢無限) [注: 架構上如何安排?] 2. Database Design (資料庫設計) 上. 有一個 user profile 的表(類似 facebook user profile).那你會如何設計這表? [注: 提示為你會一個表存放還是分開,如果分開那又怎麼處理] 3. 再者有一張 Form (想像成用戶注冊). 怎樣可以肯定那個是人手輸入或是機械人輸入?再者你前期和後期還是作出怎樣的檢查? [注: 前期為提交表單前,後期已送出到後方再檢查,檢查方面可想想有什麼引致不安全] 4. 承上.在檢查 Email 時如何確定那是 Email?User 名稱方面又需要檢查什麼? [注: 此地方向3的提示差不多] 5. 儲存圖片層面..你會如何設計整個儲存的方式? [注: 即如何儲存大量由用戶上載的圖片] 6. 除以上外. Webserver 的設計和安排上又有什麼不同? [注: 這和第1題相似.只是換成 WebServer 而言] 7. 最後關於 MySQL Database Engine 中 MyISAM 同 InnoDB 的分別是什麼?
|
關於以上問題的初步總結其實如下
以下有部份資料是請教了某些在這方面蠻有經驗的人的建議
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| 1. MySQL 可以使用 MySQL Proxy 這種結構方式實現讀寫分離.. 又或者改用 PostgreSQL 因為有陣列 [注: 關於這方面的資料可以 Google] 又又或者繼續用 MySQL 但是就使用 PARTITION 功能 [注: 關於這方面的資料可以 Google] 另外另一位很 Cool 的朋友建議可以使用 Oracle 或者 MSSQL,如果想次一級的一定是 PostgreSQL 因為友人說他一定比 MySQL 好.因為有陣列 2. Database Design 其實就是分表. - 將不同的資料分開.依條件性質分開 - 如單數就寫到 A 機..雙數的就寫到 B 機 (如此類推) - 再者便是按照 DBP 原理.將表和資料細分.每一台機一個表? (注: 不知道可行性如何) 3. 提交時最主要的是檢查 XSS, CSRF, SQL Injection. 關於機械人的識別.最常見的情況就是驗證碼 - 以網上的資料所說.如果需要驗證碼比較難破解.字與字之間最好有連接部份. 4. 前期的 Email 檢查方面 - 可以經 Regular Expression 檢查 - 或者在新版本 PHP 中使用新的 Filter 功能 而後期方面便是需要用戶作出電郵激活功能 5. 儲存圖片.可以將 Filename 經 MD5 之類的方法得出一堆無意義的字(如: ab4dxxxxx) 之後再定義一個深度 (如: 3) 即該張圖會儲在 a/b/4/ab4dxxxxx 這條路徑之上 再者意思即是 - a 的就可以存放於 a 硬碟之上 - b 的就可以存放於 b 硬碟之上 總的來說按深度/一定的規律拆解就可以拆出 例如 - ab 是一個 hdd .. ac 是一個 hdd 等等. (注: a-z0-9 這一連串的 Range 當中已經可以分出很多 HDD ..所以會放得好好) (注: 其實如果還有別的需要.還可以自己寫 File System ..就像 Facebook) (解: 另外因為 Folder 本身是有檔案上限...需要再肯定) 6. Webserver 基本上 - Static file 就一定是存放於處理靜態檔案較好的能獨立伺服器上 - 而最頂層部份便用 Nginx 做出 Proxy Pass 分流到不同的子服務器中. 7. MyISAM 和 InnoDB .其實 Google 方面也比較多資料..但係以下是個人的基本上總結. - MyISAM (Table Lock) , InnoDB (Row Lock) - MyISAM (No FK), InnoDB (FK Supported) - MyISAM (FULL Text Search), InnoDB (No,要加野先支持) - MyISAM (Select 快), InnoDB (Delete, Insert 快) - MyISAM (Backup 抄 Folder 就得), InnoDB (MySQLDUMP) - InnoDB (支持事務處理) - InnoDB (需要更多既記憶體同埋存儲) - MyISAM (寫少讀多,寫多讀少 或比較好), InnoDB (讀和寫並發率一樣高時)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 另外需要補充的資料是 - MySQL 前方可以放置 NOSQL 的東西作為緩存一些不常更新的資料.以減少大量的 Query 動作 - 再者調教 MySQL 方面其實也可以將 Log 記錄關掉.再來便是一些 Buffer 上的微調. - 還有 PHP 可以通過 FastCGI 方式運作..而別的如 Python 可考慮 uWSGI - 除此之外..其實另一位朋友建議可使用 LVS 的方法 (像Cloud Computing..朋友已在某大機構中實作了..)
補充: 2011-03-19 05:14PM LVS 的方法可以配合 Hyper-V 來共享不同 VM 中的資料 但由於 FreeBSD 的關係所以不支持 Hyper-V 但可以用 XEN 替代
另有朋友指出 上面 2 Database Design 所提到的單數寫 A ,雙數寫 B 的分法 其實當資料已有一定數量,同時用戶也開始慢慢流失時. 數據的平衡度其實會有很大改變/影響 (有待考證)
|
最後..如果以上有什麼錯誤或者更好的方法.歡迎指正和交流
最最後補充一份豆瓣的架構發展歷程.其實很多地方值得參考
和 MySQL-Proxy 的一張圖片 (從網上取得)

感,一天兩場.兩天三場.難道現在香港真的少人幹 IT活了嗎?..