2014年6月24日 星期二

工具邦的雲端大數據系統架構

這個年頭不加個閃亮的標題不會有人看,其實只有雲端,沒有大數據...。目前的主機商是 LINODE ,在日本 Tokyo 和美國西岸 Freemont 各租一台,以美國為主。日本那台只是備援,都是租 2048 的版本,幾個決策點如下:
  • 為何在美國,而不是在日本?因為日本曾經一個月兩度大斷線,連海底電纜都會斷。美國雖遠,但相對穩定,全世界連美國都是最寬的。再來是工具邦的非台灣流量佔七成。
  • 為何不用 digitalocean?不是便宜一半嗎? 因為 linode 網路比較快。同樣 100MB ,linode的下載速度可以較短的時間達到最高速(ADSL的20Mbits)。
  • 為何租兩台?不是有備份或回復機制嗎?回復機制沒什麼用!我之前試過要花2個小時以上,所以真的遇到問題,重灌還比回復快!linode 的 backup 還是有買,只是以防萬一。
  • 為何兩台要這麼遠?因為之前是在日本租兩台,在備援和同步很快!但有一次連日本海底電纜斷了,才終於懂了異地備援的重要!
  • 為何兩台不一起服務?因為資料無法這麼快同步,跟 facebook 只放在美國是一樣的。曾經試過美國 replication 到日本,但會經常斷線。

目前日本和美國各一台機器的 HA 架構如下:

  • 用 route53 做 failover :如果美國的機器掛了,會在 90 秒後切到日本的機器。但因為 route53 很貴,所以我把 dns ttl 改成 20分鐘,所以理論上切過去要大約 10~20分鐘,可以接受。
  • database 和 files 每天 sync 兩次:mysql 因為是 myisam ,我用 partitioning 讓每個 table 的實體檔案大小不超過 30mb ,備份流程:
    1. 美國機:就是將 table 檔案 copy 到 tmp 資料匣,因為實體檔很小,所以不會造成 mysql 卡住。
    2. rsync 檔案從美國機到日本機的tmp
    3. 日本機:mysql stop,將檔案放到 mysql 目錄,mysql start
    4. 美國的 tmp,日本的tmp 留著,因為使用 rsync ,下一次 sync 只用更新部份檔案就好
    5. 上述的 sync 方法,日本的備援機會斷線個30秒左右。

系統環境:

  • 作業系統:ubuntu 12.04 LTS 64bits
  • 伺服器:nginx + php5-fpm + mysql
  • 後端語言:php, python, nodejs, shellscript
  • 監控系統:用 python 在 Google App Engine 自建一個類似 montastic 的。
  • 儲存空間:自建 S3 。原本用 aws s3 ,但是備份不易。
  • 服務:
    • aws route53:linode dns 速度慢,cloudflare 很不穩定,route53 又好又快又貴!
    • cloudfront:我們的後端會將 js / css 自動 minify 和 combo 成一隻,再由 cloudfront 來吐。combo 架構類似 yahoo
    • github:程式、文件、工作分配
    • trello:討論用
    • cloudflare:一些超級大的流量的公用檔案還是放在 CF ,在使用 CF 之前,我們是用 share hosting 來檔。