MySQL 上大量刪除的技巧

在「大表删除数据的思路」這篇提到 MySQL 刪除的技巧。

MySQL 的刪除不建議直接刪,也就是像這種 query 應該要避免:

DELETE FROM `table` WHERE `lastupdated_at` < 1234567890

因為在巨大的 table 裡面,這類的 query 可能會跑幾分鐘。

一般建議多幾筆 query 刪除:

DELETE FROM `table` WHERE `lastupdated_at` < 1234567890 ORDER BY `id` LIMIT 0, 10000

跑到適當地條件成立時為止。

會需要這樣設計,其中一個主要的原因是因為 MySQL 的 replication 架構:在 master 上面的寫入時是 multi-threading,但在 slave 上面的更新卻只有一個 thread。所以,如果有單一 query 跑太久,會造成有一段時間 master/slave 資料不一致。

另外一個可能的原因是 table 使用 MyISAM。因為 MyISAM 寫入時會鎖住 table,如果花太久時間會使得 SELECT 要等待 query 結束,這點在有 web 的服務要避免 (因為前端的 user 會卡住)。分成多次寫入可以讓 query 在兩次寫入中間取得資料。

原文的建議是將每個要刪除的 entry 都展開成一筆 DELETE,這個方法有不少壞處,應該要避免。

  • 在 replication 架構下會產生大量的 binlog,雖然是徹底打散了,但反而大幅增加 client 與 server 之間的傳輸成本。
  • InnoDB 的表格裡,我們會把 innodb_flush_log_at_trx_commit 設為 1 或 2,確保在 crash 時仍然可以回復資料,代價是每次更新時的 transaction log 都會 fsync(),強制寫回硬碟。如果有大量的 query 進來時,會產生很大量的 random write。

折衷的辦法是使用 LIMIT 限制數量,不過這樣還不夠,因為 MySQL 會認定這個 query 在 master 與 slave 上可能會有不同的結果 (即使兩邊資料一樣,底層的 data structure 可能不同,而造成 LIMIT 後出來的 Result Set 不一樣),為了資料安全而決定切到 ROW mode。

所以另外加上 ORDER BY `id` 確保 master 與 slave 所取得的 entry 是相同的。

Skype 將會提供 Open Source 的用戶端

Slashdot 上有報導說 Skype 將會提供 Open Source 的用戶端軟體:「Skype For Linux To Be Open-Sourced "In the Nearest Future」,而 Skype 官方的 blog 上面也證實了目前正在發展 Linux 上的版本 (而且是 open source):「Skype open source」。

事情是這樣發展的:有人向 Skype 詢問是否有 Mandriva RPM package 可以下載,而 Skype 的人回覆「近期內會放出 open source 的 Linux client」,這樣一來應該就會有不少軟體 porting 進去,或是 cleanroom 重寫 (如果有人認為 license 不夠友善)。

另外也終於可以驗證 Skype 的加密到底安不安全。

Update:參考 comment 的說明,只有 UI 的部份會 open。

ZFS 的 dedupe 工具

Slashdot 上看到 ZFS 也在發展 block-level dedupe 的工具:「ZFS Gets Built-In Deduplication」。這東西應該已經有一票軟體專利在前面阻撓,尤其是 SAN 廠商手上應該都有不少這類型的專利...

Block-level Data Deduplication 指的是重複的 block 區塊可以用 reference 紀錄,而非複製完整的 block。等到有修改時再複製修改,也就是 Copy-on-write

在維基百科的頁面記載了:

ExaGrid's patented byte-level deduplication (content aware), NEC's HydraStor (Content Aware Deduplication Technology) , IBM's ProtecTier, Quantum, EMC/Data Domain, Symantec NetBackup PureDisk, EMC Avamar, Sepaton, FalconStor VTL, SIR, FDS (Virtual Tape Library, Single Instance Repository, and File Deduplication System) are some notable names.

應該會有人跳出來告吧?還是 SunOracle 手上跟這些廠商有神秘的 agreement?

The Pirate Bay 被封鎖後的效應

在瑞典法院下令 ISP 封鎖 The Pirate Bay (TPB) 之後,這陣子 ISP 開始動起來了,使得 TPB 的連線斷斷續續的。不過,McAfee 發現,可以取得版權物的站台反而因此增加了 300%:「Pirate Bay Closure Sparked P2P Explosion」。

本來大家都往 TPB 找資料,現在因為 TPB 被擋 (或是不順),就有人利用之前從 TPB 上面搜刮下來的資料 hosting...

不知道這次會花多久時間恢復...

Firefox 3.6 系列

把家裡的 Firefox 換成 3.6b2pre 了,照慣例一樣是砍掉重來。

把東西裝回去時發現 RefControl 爛掉了,不如網站所宣稱的可以用。這部份反而意外找到 Mason 可以用,而且對 host 靈活多了 (用 regular expression),之後應該會丟掉 RefControl 吧。

速度與 UI 沒什麼太大變化。有些動作有感覺變慢了一些,但有些動作有感覺變快... 看了細部設定的部份,發現 about:config 內的 javascript.options.jit.chrome 預設打開了。另外開新的 tab 時,新的 tab 會貼到 tab 的旁邊,而非最後面 (最右側)。

穩定性的話,目前逛網頁還沒遇到 crash 或是卡住,算是堪用的版本吧,是可以找時間把手上的機器都換上去測試了...

Sunlight Labs 對美國政府呼籲:「不要再用 Adobe 的技術了」

這兩天在好幾個地方都看到同樣的報導了,Sunlight Labs 對美國政府呼籲,不要再使用 AdobePDFFlash:「Adobe is Bad for Open Government」,因為這兩項技術對於歐巴馬政府想推動的 Open Government 有極大的障礙。

文章的論點其實很簡單,Sunlight Labs 的人認為 Open Government 使用的技術不僅必須是「公開標準」,而且必須是「容易實做」的標準。PDF 的技術是公開標準 (ISO/IEC 32000-1:2008),但不是容易實做的標準,在不少 comment 裡面很多人都提到,擷取文字的最快方式是轉成圖檔後用 OCR 技術拉出來。這點 OpenDocument (ISO/IEC 26300:2006) 也有相同的問題。

不過,當國外已經更上層樓在爭論要走向「容易實做」的公開標準時,國內還是繼續 doc 與 docx...

MariaDB 5.1 Beta 版釋出

MariaDBMySQL AB 的創辦人之一,Michael Widenius (也就是 Monty),在離開 Sun Microsystem 之後,以 MySQL 為基礎所發展的一套資料庫。

剛剛看到 MariaDB 5.1 Beta 版包出來了:「MariaDB 5.1 Beta Released」,與 MySQL 5.1 的差異可以參考「MariaDB versus MySQL」這個網頁的說明。

主要的差異在於內建了 MariaPBXT 兩個 engine,其他的都是細節部份,大家都會 porting 來 porting 去。在「How does Maria 1.5 Compare to MyISAM?」介紹了 Maria storage engine 1.5 (目前 MariaDB 5.1 Beta 包的版本) 與 MyISAM 的差異,最主要的重點應該還是 Data 與 Index 都變成 crash-safe,所以比較容易配合 SAN 或是 DRBD 了...

要找時間測試看看,尤其是讀取速度的效能。

UpdateOurDelta 放出 binary 了,可以將 DebianUbuntu 的 repository 指過去安裝:「MariaDB 5.1 packages for Debian and Ubuntu」。

「ニコニコ動画」的外連...

剛剛吃飯的時候有人說這兩天「ニコニコ動画」感覺變快了,吃完飯回來 trace 後發現是因為上了 CDN,用的是 Limelight Networks:(下面是 mtr --report smile-cll46.nicovideo.jp 的結果)

3. 60-199-255-113.static.tfn.ne  0.0%    10    0.8   0.8   0.6   1.0   0.1
4. 60-199-6-125.static.tfn.net.  0.0%    10    0.8   0.8   0.8   1.0   0.1
5. 60-199-6-2.static.tfn.net.tw 20.0%    10    0.8   0.8   0.8   1.1   0.1
6. 60-199-6-26.static.tfn.net.t  0.0%    10    2.7   1.2   1.0   2.7   0.5
7. 60-199-17-42.static.tfn.net.  0.0%    10   23.1  23.0  22.8  23.3   0.2
8. limelight-10G.hkix.net        0.0%    10   27.8  23.6  22.3  27.8   1.9
9. cds37.hkg.llnw.net            0.0%    10   22.5  22.5  22.3  23.1   0.2

HiNet 過去是到美西,速度應該還可以。(回家用 ADSL 測看看才知道)

Yahoo! 把 Traffic Server 的 source code 放出來了

Traffic Server 是 Inktomi 的產品之一,是一套高效率的 HTTP cache server,據說在很早前就支援 multi processor (Squid 到現在還是不行),就目前的版本有機會在夠好的機器上跑出 35k reqs/sec。不過,這家公司在 dot-com 泡沫時被 Yahoo! 買下。

Simon Willison 在七月的時候提到 Yahoo! 打算把 Traffic Server 的 source code 公開出來並放到 Apache Software Foundation 上面,不過當時只有計畫。

三個月後,在「Traffic Server」這篇看到 Yahoo! 已經把 code 整理好,可以透過 Subversion 取得原始程式碼了:「Traffic Server」。

這套軟體的簡寫是 YTS,在無名也用的很多。Flickr 則是用自己改的 Squid。(就目前在外面的謠言,至少 header 看起來不是 YTS)

算是 open source 的另外一種選擇...