星期二, 6月 26, 2012

XtraBackup 2.0.1

Percona 更新了 XtraBackup:「Announcing Percona XtraBackup 2.0.1」。

對於使用 Percona XtraDB Cluster (Galera Cluster) 的人,幾乎都應該設定 XtraBackup 為 full resync 工具。在 resync 過程中才不對讓提供資料的 server 停止服務 (如果用 rsync 當 resync 工具,會停止服務)。

這個版本修正了一個之前遇到的問題:當單檔超過 8GB 的時候會爛掉。

之前的解法是自己用 bzr 把 2.0 branch 拉下來編一個 xtrabackup-5.5 出來用 (我遇到的時候其他人也已經遇到了,patch 也已經進 branch 2.0 了),現在只要 apt-get 裝起來就可以了...

星期日, 6月 24, 2012

在 Mac 上的 DNS split tunnel

不論是 Cisco ASA 的 IPSec client,還是 Juniper SA SSLVPN 連線,在 Mac 上遇到 DNS split tunnel 設定時都不太正常,常常會不吃 VPN 給的 DNS 設定。

剛剛在網路發現「Split Tunnel DNS or per domain DNS」這篇方法,測了一下至少是有用的?算是一個方向...

先在 /etc 下建立 resolver 目錄,然後把公司的 DNS 設定丟進去,看起來就 okay 了?

利用 ifconfig 的結果,產生每個 IP address 所屬的 interface

為了把 Heartbeat 設定檔弄進 local ports system 內,需要知道這是哪台機器,寫完之後才發現這個問題可以抓 hostname 解決... 還是把這次用 awk 的一些事情記錄下來吧 :o

Perl 當然是好做很多,但還是想用 awk 包,之後遇到的問題會比較少 (其中一個原因是因為 FreeBSD 剛裝好的時候系統內沒有 Perl,如果之後要重複使用這個功能,用 awk 寫比較方便)。

ifconfig 輸出的結果像是這樣:

lo0: flags=8049 metric 0 mtu 16384
        options=3
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x7
        nd6 options=3
因為 awk 是一行一行讀 (回頭讀的話比較麻煩),而我只打算抓出 IPv4 (包括 IP alias) 的部分,所以想法是用一個暫存變數 INTERFACE 來放最近一次的 interface 名稱。

其中用到 match() 會將抓到的部分放入 RSTART (放 offset) 與 RLENGTH (放長度) 的特性:
ifconfig -a | awk '{
  if (match($0, "^[0-9A-Za-z]+:")) {
    INTERFACE = substr($0, RSTART, RLENGTH - 1);
  } else if (match($0, "inet [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+")) {
    print INTERFACE, substr($0, RSTART + 5, RLENGTH - 5);
  }
}'
可能還有些地方可以再修的有彈性一點,不過上面這段 code 在目前的 FreeBSD 應該都能跑,可以預期的是抓 interface 的部分如果遇到帶底線的名稱就會掛 :P

星期五, 6月 22, 2012

用 pt-duplicate-key-checker 檢查是否有沒有用到的 key

pt-duplicate-key-checker 是 Percona Toolkit 裡面一個還蠻簡單實用的功能,第一次用請只指定 DSN 就好,看看輸出內容:
pt-duplicate-key-checker --charset utf8 h=db-test-float-1,u=username,p=password
你應該會看到一堆 ALTER TABLE 以及 DROP INDEX 的指令。如果沒有的話代表你的資料庫沒有顯而易見的 INDEX 問題。

如果沒有問題,就把這串指令 pipe 給 mysql 執行:
pt-duplicate-key-checker ... | mysql -h db-test-float-1 -u username -p
然後輸入密碼。

值得一提的是,我測試過的環境中,InnoDB 的 DROP INDEX 行為都是瞬間做完,但我不確定是否有特別的設定。我測試的環境有些特點:

  • 都是在 Percona XtraDB Cluster 上測試 (目前是 5.5.24-55)。
  • innodb_file_format = Barracuda
  • innodb_file_per_table
  • innodb_support_xa = FALSE
  • 所有的 InnoDB table 都是 COMPRESSED 格式。
如果不能停機,最好是先建立測試環境 (像是 AWS EC2) 測試過後再做。

用 pt-online-schema-change 改變 InnoDB table

由於 InnoDB 的設計,ALTER TABLE 時有可能會導致其他的表格也卡住 (MyISAM 就可以確定只會卡住當事人當事表格),所以還是用其他方式處理。

遇到有支援 transaction 的資料庫,作法是建立新的表格,然後在舊的表格上面設定 trigger 確保寫入舊的表格也會更新到新表格,接下來把舊的表格複製到新的。

在 Percona Toolkit 內,有 pt-online-schema-change 這個工具幫你做完這些事情。

用法是:
pt-online-schema-change --charset utf8 --alter 'ADD COLUMN xxx INT NOT NULL DEFAULT 0' h=db-test-float-1,u=username,p=password,D=database,t=table
或是多加上 --chunk-index 指定要使用某個 index 當作切割條件 (當 pt-online-schema-change 抓到複合欄位 index 時會產生錯誤,這時候要自己指定單一欄位的 index):
pt-online-schema-change --charset utf8 --chunk-index=index_name --alter 'ADD COLUMN xxx INT NOT NULL DEFAULT 0' h=db-test-float-1,u=username,p=password,D=database,t=table
相當好用的工具...

Cisco 3750G 的 LACP 不夠平均的解法

並不是每個環境都是使用這個解法,在我目前遇到的情況,用:
# port-channel load-balance src-dst-ip
就可以平均一些。

使用的環境是 F5 BIG-IP LTM 需要往後端 server 取得大量資料,然後在 MRTG 圖上發現中間經過某兩條用 LACP 綁在一起的流量不夠平均。

印象中跟 hash algorithm 或是 balance algorithm 有關,用這些當關鍵字找了一些資料,發現預設是使用 MAC address 計算,而在我們的環境裡,F5 與 server 的 MAC address 都是固定的,於是就極端不平均...

目前的解法是讓 F5 有多個 IP address 往後端 server 連線,再透過上面的指令要求 3750G 去看 IPv4 封包內的 IP address 去計算,測試的結果算是讓人滿意了...

如果需要知道更完整的說明,可以參考 Cisco 網站上「Understanding EtherChannel Load Balancing and Redundancy on Catalyst Switches」這篇文章。

星期日, 6月 10, 2012

用 pt-find 加熱 (暖機) InnoDB table

這是老問題了,以前自己寫 script 做,現在可以用 pt-find 加上 SELECT COUNT(*) 設成 alias 做:(這邊是 bash alias)
alias warmup="pt-find --engine InnoDB --exec 'SELECT COUNT(*) FROM %D.%N;' --print"
用法是:
warmup -h DBHOST -u USER -p PASSWORD
這樣一來,雖然沒有把所有的 data & index 都讀進來,但這樣已經可以稍微減緩 InnoDB 的暖機問題。