OSDC.TW 2008 第一天

2008 第一天我是中午才到的。在技術方面,大多數的題目都已經在網路上看過資料研究過,沒有什麼特別的感想,不過可以感覺到有些講者可能因為經驗與時間的關係,有些重要的地方都沒講清楚。

先是我們自己家介紹的 Berkeley DB, 沒有提到為何要避免使用 LEFT JOIN 的原因,然後在測試的部份數據也少說明了很多東西。

另外 Vivek Ratan 講 的部份,有些地方沒有講清楚,像是要怎麼因應 Namenode 故障時的處理 (在「」這邊的說明可以參考)。另外我回來查了以後發現跑 Hadoop 後,所需要的時間變成原來的 66%,而不是效率變成原來的 66%,所以我在台下問了一個笨問題...

第一天結束後倒是到樓下的咖啡廳聊了很久,儘講些有的沒的...

Google App Engine

幾天前就一直有消息, 打算要把 的服務拿出來給大家用。結果拿出來的餅比預期的更大,直接幫你 Hosting 整個服務:

Google App Engine 目前以 為語言 (更仔細的說,是以 為參考的標準,所以有用過 Django 的人會蠻熟悉的),後端則是以 與 BigTable 支撐整個系統。Hosting 的服務以 appspot.com 這個獨立域名避免 Cookie 與 XSS 安全性的問題,看起來是呼應 blogspot.com。

昨天一睡醒看到有一萬個人的註冊限制,就先丟進去註冊,出門到公司就發現已經申請到了。

另外,這個系統有一些限制:500MB storage、200M CPU cycle/day、10GB bandwidth/day,這個量對於自己玩看起來是沒什麼問題,等到收費後要看看價錢到底如何。

在開始玩之前,看看 可以知道 BigTable 可以做到的事情,其實還蠻有趣的,像是不支援「!=」... XD

Update:在「」這篇裡面有後台的畫面,可以看到相當多資訊!

參考:

Zend_Json + Zend_Config + Zend_Db

如果使用 放設定檔,這「可能」是一個比較好的解法:

public function __construct()
{
    $j = file_get_contents(dirname(__FILE__) . '/db.json');
    $conf = Zend_Json::decode($j);
    $conf = new Zend_Config($conf['Db']);
    $this->rDb = Zend_Db::factory($conf->rDb);
    $this->wDb = Zend_Db::factory($conf->wDb);
}

參考:

Zend_Db 的例外處理

照 Manual 所列出來的功能, 似乎沒有提供 的功能,所以就得自己做了。

正常的作法是自己寫 SQL query 處理,但我想到的方法就是先 ->insert(),如果失敗再 ->update()。拆開來的這兩個動作會使得 多花不少 CPU resource,但我暫時不想自己寫 SQL Query (主要是因為嫌 escape 麻煩),先放個 XXX 等以後再 tune。

問題在 ->insert() 後如果遇到 Duplicate 會丟出 Exception,用 try-catch 的方法我不是很喜歡,但稍微翻過 Zend_Db 的 code,似乎沒辦法改成 return status,所以就只好用 try-catch 處理。這應該是跟底層的 有關,Zend_Db 只是在中間的介面。

如果還有遇到其他問題就繼續寫...

Zend_Db 的參數 (與 Zend_Config、Zend_Json)

::factory() 可以吃兩種語法,第一種是用兩個參數指定所有的資訊,像這樣:

$params = array('host' => 'localhost', 'username' => 'my_username', 'password' => 'my_password', 'dbname' => 'my_database');

$db = Zend_Db::factory('pdo_mysql', $params);

第二種是吃一個參數, (或者繼承他的 class):

$conf = Zend_Config_Ini('filename.ini');
$db = Zend_Db::factory($conf);

如果想把資料庫設定放在檔案裡,再用 Zend_Config 讀進來傳給 Zend_Db,目前官方有 兩種方法,不過這兩種方法我都不喜歡,用 找 "Zend_Config_Yaml",沒有什麼人在研究這個 (在是有看到一份,不過沒看到其他人用的心得)。

於是退而求其次,用 讀進來後用第一種方式傳進去。

Zend Framework 的 Zend_Db

這個週末都在研究 的用法,然後套用到新的系統上。

的三個架構裡,Controller 透過 .htaccess 配合,效果還算可以。View 目前是用 ,不過會看情況改用 或是 ,基本上都沒什麼問題。

最大的問題在於 Model: 的功能看起來很多 (在說明文件的份量裡,算是相當厚的一個模組),但實際上有不少缺陷沒辦法光靠 Zend_Db 目前內附的模組解決,需要自己寫 Adapter 處理。在沒時間研究 Zend_Db 的 Adapter 怎麼寫的情況下,只能先把他當作非常小的 使用。

Zend_Db 主要的兩個問題是:Master-Slave 時讀寫必須分開,以及多台時 Failover 及 Load sharing 的處理。雖然這兩個問題都可以用 解決,但我不是很喜歡 MySQL Proxy 的解法,所以...

Anyway,目前該解決的都解決掉了,如果有遇到其他的模組不好用,我再寫文章抱怨好了... XD

Mtron SSD 硬碟

昨天 Mtron SSD 硬碟 3.5" 32GB*2 終於到了,上線後測試發現與之前的 SSD 硬碟完全不同,以 MySQL 的啟動時效率來看,足以殲滅 15KRPM SCSI*4 (RAID10)。(剛啟動時因為 key buffer 還沒有 cache,會需要一段時間速度才會慢慢上來,在 15KRPM 的 RAID10 SCSI 上需要幾分鐘,但 Mtron SSD 幾乎不需要 slow start)

其他的就不多說了,目前是 jnlin 在測試,請參考他寫的「Mtron SSD 在 MySQL (MyISAM) 上跑了兩個小時」這篇,之後應該會有一些數據可以看。目前已經是卡在 CPU bound 了,接下來要期待 Jeff Roberson 對於 FreeBSD 上 pthread_rwlock 的改善。

Ref:「MySQL 在創見 SSD 上跑的情況

缺乏 Model 支援的 Zend Framework

Zend Framework 前陣子釋出 1.5.0 正式版了,與 1.5.0-RC 系列沒有太大差別,所以沒支援的還是得自己想辦法。

Controller 的部份,Zend_Controller 沒什麼問題,最基本的配置方式都已經摸熟了,也覺得算是還蠻好用的。

View 的部份,Zend_View 畢竟是 PHP 語法,看起來就不太討喜,加上我們是使用 Google cTemplate,其實以目前狀況算是還不錯,要另外再學一套的話要先考慮好處夠不夠足以換掉。far 最近在研究這方面,而我則是想使用 Smarty。但不管是哪種方案,View 的部份看起來沒什麼問題。

真正的問題在 Model,你可以在 Zend Framework 的文件裡面看到 "models" 的目錄配置 (像是在 Using a Conventional Modular Directory Structure 裡),但實際上 trace code 發現沒有對 model 支援。如果你自己寫了一個 Model 放到 models 裡,也沒有很方便的方法讓 Controller 裡的 code 使用,目前我想到的 dirty work 是 require_once(dirname(__FILE__) . '/../models/UserModel.php')

有誰用 ZF 開發有遇到同樣問題的嗎?

MyISAM 在 FreeBSD 上效率不好的原因?

Jeff Roberson (也就是目前 FreeBSD 上 SCHED_ULE 的維護者) 的 blog 上說了這樣的話:(原文章連結)

MyISAM performance is terrible in FreeBSD 7.0 due to the user-space pthread_rwlock implementation. Just a word of warning if you intend to deploy a database server based on 7.0. I am certain we will have this fixed in 7.1. It will most likely be in CURRENT in a week or two.

所以不是我在「FreeBSD 上的 MySQL 效率」這裡想的 Filesystem I/O 問題?來等 Jeff Roberson 的 patch 吧...