閒話家常


這應該是這本筆記的第一篇純文字的閒聊筆記.想了很久才決定要下這一篇.作為一個階段的感想也可能不錯.所以便因為這原因.所以便有了這篇東東.首先.因為昨天的某些事情.再者加上之後的事後初步總結.得到出來的結果.其實也心中有數.基本上只是想再一次證明自己的想法不無理由吧.更甚的是給自己一個安心的結論.除此之外便無其他.

接下來先簡單總結一下幾個問題
首先是題目情景大約如下(以自身記憶作回想)


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活了嗎?..