MySQL 的現況

Jeremy Zawodny 月初在 Linux Magazine 上所寫的「The State of MySQL」描述了最近 MySQL 的狀況。這篇文章與技術面的想法沒關係,討論了比較多 SunOracle 與其他 3rd-party 的努力。

前陣子 Sun 與 MySQL 的整合其實讓 MySQL 很受傷,包括許多 MySQL developer 的離開 (創辦人 Monty 也走了),使得 MySQL 的發展停滯了一段時間。另外,去年底推出的 MySQL 5.1.30 (第一個 5.1 GA) 被許多人批評品質不足以列為 GA。而實際在使用 MySQL 的單位也可以看到還是繼續用 MySQL 5.0,因為找不到升級到 MySQL 5.1 的理由。

另外一方面,MySQL 仍然是 open source relational database 領域的主要選擇,在官方的支援不夠的情況下,很多公司提供了自己發展的 MySQL patch,像是 Google 或是 Percona。而 MySQL 上最常被使用的 transaction engine,InnoDB 也推出新版,以 MySQL 5.1 plugin 形式釋出,這個版本包括了新的檔案格式、壓縮 (對於 I/O bound 環境幫助不小),並針對朝多 CPU 發展的環境修正的許多 multi-threading 效能的問題。(主要是 lock 的改善)

Monty 在離開 Sun 之後也成立了一家公司,發展由 MySQL 分支出來的 MariaDB,希望成為一個 storage engine,取代現有的 MyISAM。

其他的公司也都有各自的想法,透過 MySQL 的 plugin 架構發展自己的軟體,有許多是 open source (像是 PBXT),也有不少是 proprietary software,給了 MySQL 使用者許多不同的方向。

幾個不同的 Web Server (或是 Reverse Proxy) 實做內部重導的方式

Reverse Proxy 的部份,Perlbal 可以用 X-Reproxy-URL

Apachemod_xsendfile 實做 X-SendfilelighttpdX-LIGHTTPD-send-file (1.4 版) 或是 X-Sendfile (1.5)。nginxX-Accel-Redirect

都是避免用動態語言傳輸大檔的方式。

不知道 F5 有沒有提供類似的功能,如果沒有的話就得自己放兩台...

Twitter Spam Report

Twitter 上遇到 Spam Follower,可以用 direct message 通報給 spam 這個帳號 (不過,你要先 follow 對方,而且對方反過來 follow 你),但手動回報的機制還是太麻煩。

於是有人就在 Greasemonkey 上寫了回報機制:「Twitter Spam Report for Greasemonkey」,裝好後,在每個 Twitter 頁面下面都有 "Report Spam" 的連結...

Update:需要改 code,把:

var twitterspam_user = $("h2").text().replace(/ /g,'');

改成:

var twitterspam_user = $("h2").eq(0).text().replace(/ /g,'');

CherryPy 與 mod_wsgi (apache 2.2)

依照「mod_wsgi 與 .htaccess」的設定設好後,在 index.py 內參考「Integration With CherryPy」這篇文章的範例就會動了,可以用 ab 或是 httperf 測試看看效能如何。

另外 Robert E Brewer 在 PyCon 2009 - Chicago 上講的「Introduction to CherryPy (#90)」(包含影片) 也蠻適合剛碰 CherryPy 的人看。

mod_wsgi 與 .htaccess

mod_wsgiapachePEP-333 的實做軟體,使用 Python 開發 web application 的人不用知道怎麼介接。

既然是 .htaccess,apache 的部份就不講了。

Update:修正 mod_rewrite 的部份。

先從最簡單的「所有 request 都丟給 index.py」開始:

SetHandler wsgi-script
RewriteEngine on
RewriteBase /~gslin/py/
RewriteRule ^index.py$ - [L]
RewriteRule ^(.*)$ index.py/$1 [L]

如果不希望連靜態檔案都透過 index.py 處理 (像是 robots.txt),要做兩件事情。第一件是限制 wsgi-script 的範圍:

<Files *.py>
SetHandler wsgi-script
</Files>

然後修改 mod_rewrite 的條件,只有檔案不存在的 request 才丟給 index.py:

RewriteEngine on
RewriteBase /~gslin/py/
RewriteRule ^index.py$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.py/$1 [L]

不會很難,不過還是寫下來,以後應該會找到自己的文章...

MySQL ALTER TABLE

瑪莉亞的凝望》第三本看到一半,到 Twitter 上看到 Jeremy Zawodny (O'Reilly 出的 High Performance MySQL 第一版與第二版的作者之一) 在喊 MySQL ALTER TABLE 跑了八天了:

I have an ALTER TABLE running for nearly 8 days now... yikes.

結果 Aaron Brazell 居然很機車的這樣問他 XDDD

@jzawodn Removing South Carolina from all Craigslist tables?

如果不清楚 Craigslist 與南卡的新聞,可以參考紐約時報「Under Pressure, Craigslist to Remove ‘Erotic’ Ads」這篇的說明。

Anyway,Jeremy Zawodny 有說明這次的目的是要把舊的 InnoDB 轉成 XtraDB compression 格式:

the big ALTER TABLE is to enable InnoDB/XtraDB compression on ~650M records (old CL postings)

簡單提一下 MySQL 搭配一些 open source solution 的運作方式。

首先是要打開 replication,有 master 與 slave server(s)。寫入都到 master,讀取到 slave。(這邊為了說明方便,暫時不考慮 replication delay)

除了 master/slave 讓前端的 application servers 或 web servers 存取外,另外建立一套 slave server,上面有 snapshot filesystem (像是 Linux 的 LVM,或是效能較好的 Solaris/OpenSolarisZFS),用 cron 定時將 MySQL 暫停並寫入磁碟,產生 snapshot。

在這樣的架構下,當需要 ALTER TABLE 而且已經知道會卡很久時,我們可以從 snapshot 上先複製一份完整的資料,建立一台 MySQL server 並且在上面 ALTER,等到完成後再接回 master server,將 replication delay 的部份補上。如果想確認資料正確性,可以跑 mk-table-checksum 確認。當 replication delay 跟上後,停機時間不用太長就可以將 master 換成這份新的格式。

雖然 Jeremy Zawodny 沒有詳細說明,不過應該是類似的方法。

Update:Jeremy Zawodny 在「The Big ALTER TABLE Test」這篇有提到結果。

FreeBSD ZFSv13 進 RELENG_7

FreeBSD ZFSv13 終於進入 RELENG_7 了:「svn commit: r192498」。

幾個重要的改變:

  • kmem now goes up to 512GB so arc is now limited by physmem (kmem 再度拉高到 512GB)
  • the arc now experiences backpressure from the vm (which can be too much - but this allows ZFS to work without any tunables on amd64) (我不確定這個說明的意思,猜測是指當非 ZFS 需要系統資源時,cache 所使用的記憶體空間會放出來給 kernel 用)

另外 commit log 有個讓人還蠻在意的地方:

Supported by: Barrett Lyon, BitGravity

BitGravity (一家 CDN company) 的 CTO 贊助 XDDDDD