2015-11-27

MySQL Slave 重啟後步驟

此文章的場景是描述 MySQL Slave 和 Master 斷了同步資料,如何恢復。


  1. [M] myql> FLUSH TABLES WITH READ LOCK;
  2. [M] $ mysqldump --all-databases --master-data | bzip2 -9 > mysql.bz2
  3. [M] scp mysql.bz2 foo@SLAVE:
  4. [S] mysql> STOP SLAVE;
  5. [S] bzip2 -dc | mysql -u root -p
  6. [M] mysql> RESET MASTER;
  7. [S] mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=147;
  8. [S] mysql> START SLAVE;
  9. [M] UNLOCK TABLES;

2015-10-04

WordPress Replication

手上有兩台異地不同 Public IP 主機,在 CloudFlare 設定 DNS Round Robin,又運行著 WordPress,下面解說如何設定兩台主機同步。讓兩台主機都能登入,且新文章能互相同步。

MySQL 資料庫

參考 MySQL Replication 設定。要注意的是因為做的是 DNS Round Robin,所以隨機兩台主機都要設定 master-slave 兩種角色同時運行,我參考 Digital Ocean 的文章完成。

同步腳本

因為 WordPress 要處理 cache、files 資料夾,腳本請參閱 FTP Replication

FTP Replication

我有兩台異地不同 Public IP 主機,在 Cloud Flare 設定 Round Robin,運行著 nginx。此文講解使用兩個腳本同步檔案。

我的 H0 機器讓人 FTP 上傳檔案,監控程式偵測有檔案異動及開始 rsync 到 H1。示意圖如下:



H0


L3 ~ L6: 因為 web root 權限需要,所以使用 sudo 提高權限。
L8: H0 & H1 透過 ssh 加密傳輸,得事先加信任公鑰。 L14 ~ L15: inotifywait 排除掉不想監控的檔案 ([Tt]hunms.db),接著只監控特定事件 (delete, moved_to, close_write, create)。為了記錄過程我把時間戳一並寫出,log 的樣子會長這樣:
15/10/04 21:37:05 CREATE /var/www/example.com/index.html
L9: 在 H1 機器上有個 pool 目錄放置這些需要同步的檔案,原因不想讓 rsync 直接寫到 web root,權限過大危險。
L21: 移除前綴字,避免同步路徑錯誤。
L24: 移除檔案名稱,讓 rsync 同步資料夾,而非單一檔案。
L26: rsync + ssh 同步資料夾到 H1。

H1


L3 ~ L6: 因為要寫入到 web root,要求得是 root 。
L13 ~ L26: 做的事情和 H0 一樣,只是來源和目的互換。

已知問題

刪除

inotifywait 遇到刪除檔案或目錄,只會出現 OPEN,ISDIR,接著就沒了,所以也無法偵測到 DELETE 事件。rsync 直到下個時間才會把上個未刪除的工作做完。


2015-10-02

GoDaddy 註冊系統有安全疑慮

GoDaddy 註冊系統只接受最長 11 個字的 local-part,而 Email 地址的規範 RFC 5322 明確指出最長可以到 64 個字。

緣由

我在 GoDaddy 註冊了一個帳號,我的 Email local-part 有 30 個字,因為某個原因我需要重新登錄網站,結果就無法登錄。查了 Whois 發現 GoDaddy 把我的 Email 縮短了,而且是沒有規則。

客服

0. 官網沒有文字客服

GoDaddy 不知緣由為何,停止了文字客服,只剩電話客服。因為擔心英文口說無法順利解決我的問題,且如此長的國際電話肯定所費不貲。最後讓我找到了 @GoDaddyHelp

1. 英譯證件

GoDaddy 客服來信要求我提供英文翻譯的官方證件,原先試著自己 PS 將身分證翻譯成英文版本,但是客服不接受這種翻譯。後來我提供了護照,但是由於當初註冊使用的名字不是漢語拼音,而是沒有法律效力的自取英文名字。我在信中和對方表明當初我沒有想到註冊會失敗,且我的自取英文名字和漢語拼音的用處。客服人員基於保護客戶帳號安全,提供了三個方式:

0. 試著聯繫 Whois 上面錯誤的 Email。
1. 透過 ICANN 投訴
2.  法院傳票要回。

2. 將錯就錯

GoDaddy 客服拒絕我的護照證明後,我在信中嚴厲的反應這是網站註冊系統的瑕疵,造成我的困擾。客服根本不想回應我的理由,因為他有理由可以假設我是壞人,透過如此手段竊取別人的域名,想想也是有道理,就不在此爭端,徒勞罷。

我讀了 ICANN 投訴的方式,根據 2015-03-01 發佈的 Rules for Uniform Domain Name Dispute Resolution Policy,投訴方得負擔所有調查的費用,看了 GODADDY SUBPOENA POLICY/ATTORNEY TIPS 光研究每小時就得付 75 USD,這已經超出我的域名購買費用,不划算。

最後,我想到了將錯就錯的伎倆,去申請 Whois 錯誤的 Email。因為是 Gmail 所以可以隨意申請,果真行得通,重置密碼的信件順利收到,把登入權限給拿回來了!


安全疑慮

一拿到登入權限後,試著在後台變更 Email 為 30 個字的帳號,發現依然不行,然後聯繫 @GoDaddyHelp,得到的答案是:

I was not able to duplicate this in another account. You may want to try using an alternate email address.

這種回答讓我對 GoDaddy 灰心,工程文化沒落實完全,如此簡單的註冊瑕疵能用這麼簡單的方式拿回權限,如果今天我就是壞人呢?

2015-09-01

事件捕捉進化

最近寫網頁爬蟲用到並行的方法,因為 golang 接收 channel 是外層包一個 for loop,觀察到這樣會讓一個邏輯 CPU 使用率滿載,這個寫法是 busy waiting,認為這麼做耗電很浪費資源。或許 golang 採用 CSP channel 就是決定得走 busy waiting。

找到一篇 Haskell 討論 select(2) 或 poll(2) 捕捉方法,有人提出這些討論的視野都是較為底層,在 Haskell 可以用更高階優雅的方式解決。閱畢感到興奮,就是要優雅!