星期一, 12月 31, 2012
FreeBSD 與 Linux 下強制重開...
星期六, 12月 22, 2012
星期日, 12月 16, 2012
FreeBSD 下 lagg 在 /etc/rc.conf 的設定方式
如果在 FreeBSD 的 /etc/rc.conf 裡想要搞定 Link Aggregation (lagg) 的設定,主要是這幾條:
cloned_interfaces="lagg0"
ifconfig_igb0="up"
ifconfig_igb1="up"
星期日, 11月 25, 2012
用 tpcc-mysql 測試 LSI 的 Nytro MegaRAID NMR 8100-4i
8100-4i 100GB/s SSD 建議售價NT$62,900
8110-4i 200GB/s SSD 建議售價NT$93,900
8120-4i 800GB/s SSD 建議售價NT$239,000
- 有 Cache:
- 16 threads:5443.300 TpmC
- 32 threads:16247.400 TpmC
- 64 threads:21203.900 TpmC
- 128 threads:23206.100 TpmC
- 256 threads:20845.500 TpmC
- 沒有 Cache:
- 16 threads:1080.500 TpmC
- 32 threads:1434.100 TpmC
- 128 threads:1304.800 TpmC
- 有 Cache:
- 64 threads:800.367 TpmC
- 128 threads:1270.367 TpmC
- 256 threads:1053.467 TpmC
- 沒有 Cache:
- 64 threads:443.567 TpmC
- 128 threads:348.133 TpmC
- 256 threads 在最後 Stop threading 的地方一直跑不完,重跑三次都一樣。
星期五, 11月 23, 2012
用 tpcc-mysql 測試 MySQL InnoDB 效能
TPC-C 是用來模擬線上交易服務所產生的資料庫 query 藉以測試效能 (另外還有 TPC-E 與 TPC-H 是測試不同面向)。而 tpcc-mysql 則是 Percona 維護的 open source 專案,專門拿來測試 MySQL 的效能,面向則是跟 TPC-C 接近。
所以就決定拿 tpcc-mysql 來當測試工具 (因為 Percona 的關係)。
建議第一次玩的人可以在 AWS EC2 上開一台 Ubuntu server 玩看看,反正爛掉可以重來,不用太擔心要還原...
首先先安裝 bzr 與 build-essential 以及 libmysqlclient-dev,然後將 source code checkout 下來:
# apt-get install bzr build-essential libmysqlclient-dev# cd /tmp# bzr branch lp:~percona-dev/perconatools/tpcc-mysqlcheckout 後要先上這個 bug report 裡面提供的 patch,雖然標題是 9.04 64bits,但在 12.04 64bits 下還是沒修正:「tpcc_start core dump on Ubuntu 9.04 64bit」。
# cd src# make
# ./tpcc_load 127.0.0.1:3306 tpcc1000 root rootpassword 1000
# ./load.sh tpcc1000 1000
# ./tpcc_start -h127.0.0.1 -P3306 -dtpcc1000 -uroot -prootpassword -w1000 -c32 -r 60 -l3600
星期三, 10月 31, 2012
一個晚上,把該踩的地雷都踩完了...
弄 OpenVPN,直接把踩到的地雷列一下:
- FreeBSD 上用 pf 不能直接對 interface 開放,因為 OpenVPN 可能會在 pf 都跑完後才跑起來。查資料的時候有找到資料說,可以讓 pf 不要 cache 這部份,不過測了老半天測不出來,最後還是用 IP range 來做。
- OpenVPN 2.2 已經改成一個 interface 通殺所有 client,而不是一個 client 一個 interface,測了老半天發現是誤會一場,manpage 裡有寫現在變成這樣。(不知道從哪個版本變成這樣,至少裝的 2.2 是...)
- 如果 dhcp-option 只推 dhcp-option DNS 而沒有推 dhcp-option DOMAIN,Ubuntu 下的 DNS 設定不會生效,據說是 spec feature... +_+
- 如果要吃 RADIUS,可以透過 PAM 處理。不過 pam.d 的設定檔內只能用 try_first_pass,不能用 use_first_pass,原因看一下 FreeBSD 的 pam_radius manpage,裡面有說明。
- 另外,如果要用 RADIUS,記得設定 template_user 避免有 local account 的人會過,沒有 local account 的人就掛了...。
星期三, 7月 11, 2012
用 Percona Xtrabackup 複製資料給 slave 用
我安裝 Percona Xtrabackup 是透過 apt-get,如果要用其他安裝方式也可以,這邊就不提了。
跑法是先在 master 機器上跑 innobackupex:(要記得 /data 下得有足夠的空間放檔案)
# innobackupex /data/db/
# innobackupex --apply-log /data/db/xxx/
等這些指令跑完後,就可以把整個目錄複製到別台使用,在 xtrabackup_binlog_info 裡面有 master 的 binlog 資訊可以讓你設定。
其中比較要注意的地方是不能加上 --compress,因為 --apply-log + --compress 會失敗,這個問題在 Percona Xtrabackup 的 Launchpad 上有看到有 ticket 在處理了。
星期二, 6月 26, 2012
XtraBackup 2.0.1
星期日, 6月 24, 2012
在 Mac 上的 DNS split tunnel
利用 ifconfig 的結果,產生每個 IP address 所屬的 interface
用 Perl 當然是好做很多,但還是想用 awk 包,之後遇到的問題會比較少 (其中一個原因是因為 FreeBSD 剛裝好的時候系統內沒有 Perl,如果之後要重複使用這個功能,用 awk 寫比較方便)。
ifconfig 輸出的結果像是這樣:
lo0: flags=8049因為 awk 是一行一行讀 (回頭讀的話比較麻煩),而我只打算抓出 IPv4 (包括 IP alias) 的部分,所以想法是用一個暫存變數 INTERFACE 來放最近一次的 interface 名稱。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
其中用到 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);
}
}'
星期五, 6月 22, 2012
用 pt-duplicate-key-checker 檢查是否有沒有用到的 key
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 格式。
用 pt-online-schema-change 改變 InnoDB table
遇到有支援 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
星期三, 1月 25, 2012
Unbound + DNSSEC
FreeBSD 上要 Unbound 啟用 DNSSEC 很簡單,安裝完後,先跑 sudo -u unbound unbound-anchor
產生 root.key
,之後每次重開機都會檢查是否需要更新。
再來是在 unbound.conf
裡面的 server 區段增加:
如果有自己的 domain,可以先用 domain-insecure 設定,讓 Unbound 不檢查這些 domain:server: auto-trust-anchor-file: "/usr/local/etc/unbound/root.key"
server: domain-insecure: "mycompany"
星期日, 1月 22, 2012
Perl 的 regular exprssion 可以用 (?...) 設定參數
我遇到的問題很簡單,就是這樣的 code:
say 'yes' if 'Test' =~ $a;
我想要在 $a
做出 'Test' =~ /test/i;
的效果,也就是找方法帶 modifier 進去。
第一個想到的方法是用 eval()
做:eval("'Test' =~ $a;")
,但這個方法問題很多... 因為我的 $a 是從設定檔讀進來,我並不希望給予奇怪的權限。
在 Perl 裡可以用 inline modifier 解決,也就是把 regular exprssion 前面加上 (?i)
,其中 i
就是 modifier,變成 (?i)^test
。
pcre:$configuration_directory/xxx
也可以這樣設定 (regexp:...
就不確定了)。
星期二, 1月 17, 2012
Cisco IPSec VPN Client 在 Windows 與 Mac 上遇到的問題
Windows (XP & 7) 與 Mac 上面都各遇到一個不太能解的問題,找國外的論壇發現不少人抱怨原廠都不修正... Anyway,還是有些很笨的方式可以繞過去。
Windows 上遇到的問題是,如果 ASA 上面有設定 split-dns
,那麼 Windows 除了 split-dns
所設定的網域可以查到資料,其他的網域都會無法查詢 (不會丟出任何 DNS query)。這不是 client 軟體的問題,而是作業系統內的問題,微軟目前看起來沒打算處理。
Mac 上遇到的問題是,Mac 系統內建的 Cisco VPN client 不吃 ASA 丟出來的 DNS server。不過在 Mac 上可以吃 split-dns
...
目前用的解法是設定兩個不同的 tunnel-group
,一個給 Mac 用,另一個給 non-Mac 用,大家各連各的,吃不一樣的設定值避開問題。
星期四, 1月 12, 2012
FreeBSD NIS master 與 Linux NIS client 時 shadow 的處理
剛剛 gaod 發現 Linux 的機器無法用帳號密碼登入 (因為我一直都是用 key 直接登入,所以一直沒發現),花了不少力氣才抓出要怎麼解,用 Google 找了不少文件,好像沒什麼人遇到?
解法是把 FreeBSD 上 NIS/YP server 的 Makefile
裡面產生 passwd
的 *
部份改成 x
就解決了。可以參考「Re: FreeBSD NIS serving linux clients.」這篇十年前文章的說明...
會產生問題是因為 Linux 上的 NIS code 在看到 passwd
密碼欄位是 *
時就不會去 shadow
要資料,然後就爆炸了... 改成 x
就沒問題了...
星期一, 1月 02, 2012
AWS SES 與 Postfix 的配合...
官方論壇上面沒找到比較好的方法,於是 trace ses-send-email.pl
之後找到一些方法可以用。
在 ses-send-email.pl
寫的 helper 中,規定寄給多個使用者必須使用「逗號」隔開:
ses-send-email.pl [--help] [-e URL] [-k FILE] [--verbose] -r [-f FROM_EMAIL] [TO_EMAIL[,TO_EMAIL]...]
但實際 trace 後可以發現除了逗號外也可以接受空白,但是必須在「一個參數」內 (Perl 會用 regex 切開),但是 Postfix 所丟出來的 $recipient
會是多個參數,而且無法調整 quote,所以得用一個 shell script 將傳入參數包起來:
#!/bin/sh SENDER="$1" shift /usr/local/bin/ses-send-email.pl -k /usr/local/etc/aws_creditentials -r -f "$SENDER" "$*"
再來是修正 Postfix 的 master.cf
,改吃 shell script:
awsses unix - n n - 1 pipe flags=RX user=www argv=/usr/local/bin/awsses-wrapper.sh $sender $recipient這樣在寄給多個使用者的時候才會正常...
Postfix 的 policy daemon...
沒注意好 Postfix 的 policy daemon 傳回的值,居然變成 open relay 了...
依照「Postfix SMTP server access table」的說明,現在沒辦法決定而要往後面的條件判斷時,需要丟出 DUNNO
,而非 OK
,一時間沒注意就變成 open relay...。