因為 EC2 的特性限制, 要在 EC2 底下做 DRBD + heartbeat 是相當麻煩的事情

而有些 service 就得需要做到 failover (e.g.: DB)

如果是 DB, 官方建議的解法是

1. RDS with read replica

2. 跨 zone or 跨 region 的 EC2 instance 建立

3. 利用前人實做過的 DRBD on EC2 做些修正

第一個要花不少錢, 第二個要自己處理 failover 的問題. 各有優缺點.

第三個是利用到 EC2 可以 attach network interface 的方式來做, 網卡 up/down 的時間會稍久.

 

而在工作上, 遇到的是 EC2 + VPC 的環境.

由於 VPC 支援 assign secondary private address, 所以可以利用 heartbeat 的 standby/takeover 動作時,

unassign/assign virtual IP,  以實現自動 failover 的動作.

優點是 assign/unassign secondary private address 的速度比 attach network interface 快很多.

IP 便可以很快地 bind 到另外一個 instance.

以兩台 t1.micro 來測試, 大概 5~10 秒左右就可以切換 IP (不包含 service stop/start 的時間)

 

以下說明會是針對在 EC2 + VPC 環境底下, 如何做到 heartbeat 自動切換 IP 跟服務的動作.

環境:  兩台  t1.micro , 各綁了一個 EBS, 跑 Debian

1. 設定 DRBD : 可參考 DRBD on EC2

 

2. 準備好 ec2-api-tools on 兩台 instances

 

3. 因為工作上設定的 VPC 是得透過某台 proxy 才能夠聯外, 所以請參照 ec2-api-through-http-proxy 來設定

    重點是

export EC2_JVM_ARGS="-DproxySet=true -DproxyHost=localhost -DproxyPort=5865 -Dhttps.proxySet=true -Dhttps.proxyHost=localhost -Dhttps.proxyPort=5865"

    把 localhost 跟 port 5865 改成你需要的

    Note: 如果你的 VPC 可以直接 bind public EIP 出去的話, 上面這段可以忽略

 

4. 在 /etc/bash.bashrc 設定一些基本的 environmental variables, 這樣可以保證所有人執行 ec2-api-tools 的變數內容都一樣

export JAVA_HOME="/usr"
export EC2_HOME="/usr/local/ec2-api-tools"
export EC2_REGION=ap-northeast-1
export AWS_CREDENTIAL_FILE=/user/.aws-secret
export EC2_JVM_ARGS="-DproxySet=true -DproxyHost=a.b.c.d -DproxyPort=xxxx -Dhttps.proxySet=true -Dhttps.proxyHost=a.b.c.d -Dhttps.proxyPort=xxxx"

 

5. 設定 heartbeat  (以 mysql 為例)

  • /etc/ha.d/haresources
db-drbd-aws-1 drbddisk::r0 Filesystem::/dev/drbd1::/srv::xfs::rw,noatime,nodiratime,nobarrier mysql a.b.c.d
  • /etc/ha.d/resource.d/mysql
#!/bin/bash

. /etc/ha.d/shellfuncs
ulimit -n 131072
sleep 1; ENI_ID="eni-aaaaaaaa" # Network ENI name of instance
ACCESS_KEY="BLAH1" # access key
SECRET_KEY="BLAH2" # secret key
REGION="ap-northeast-1" # region
HEARTBEAT_IP="a.b.c.d" # VIP
NIC_ALIAS="eth0:0" # bind NIC alias case "$1" in

start)
/usr/local/ec2-api-tools/bin/ec2-assign-private-ip-addresses -O ${ACCESS_KEY} -W ${SECRET_KEY} --region ${REGION} -n ${ENI_ID} --secondary-private-ip-address ${HEARTBEAT_IP}
sleep 5
/sbin/ifconfig ${NIC_ALIAS} ${HEARTBEAT_IP}/24 up
sleep 5
res=`/etc/init.d/mysql.server start`
ret=$?
exit $ret
;;
stop)
res=`/etc/init.d/mysql.server stop`
sleep 5
/sbin/ifconfig ${NIC_ALIAS} down
sleep 5
/usr/local/ec2-api-tools/bin/ec2-unassign-private-ip-addresses -O ${ACCESS_KEY} -W ${SECRET_KEY} --region ${REGION} -n ${ENI_ID} --secondary-private-ip-address ${HEARTBEAT_IP}
ret=$?
ha_log $res
exit $ret
;;
status)
echo "SHOW status;" | /usr/local/mysql/bin/mysql -u root mysql > /dev/null 2>&1;
if [ "$?" == "0" ] ; then
echo "running"
else
echo "stopped"
fi
;;
*)
echo "Usage: mysql {start|stop|status}"
exit 1
;;
esac
exit 0

 

6. 這樣就可以用 /usr/share/heartbeat/hb_standby or /usr/share/heartbeat/hb_takeover 做切換動作了, 同時也可以讓 heartbeat 自動做 failover 的動作

 

stephon 發表在 痞客邦 留言(1) 人氣()

Percona Toolkit 中, pt-stalk 是一個可以幫助 DBA 尋找 MySQL issue 的工具

因當 MySQL 問題發生時 (e.g.: 卡 lock, performance down, ...)

就算有做好萬全的 log / monitoring , 有些當時候發生的狀況還是需要紀錄才能釐清

pt-stalk 就是這樣的工具

 

用法很簡單

舉例來說, 我們發覺在 MySQL server threads > 800 會有 performance issue

則這樣下

 /usr/bin/pt-stalk --daemonize --variable Threads_connected --threshold 800 -- --defaults-file=/srv/mysql/var/my.cnf

當 MySQL server threads > 800 時, 就會在 /var/lib/pt-stalk 目錄紀錄 df, memory, interrputs, trigger 等等, 範例如下

 

2013_03_17_01_26_24-df
2013_03_17_01_26_24-disk-space
2013_03_17_01_26_24-diskstats
2013_03_17_01_26_24-hostname
2013_03_17_01_26_24-innodbstatus1
2013_03_17_01_26_24-innodbstatus2
2013_03_17_01_26_24-interrupts
2013_03_17_01_26_24-iostat
2013_03_17_01_26_24-iostat-overall
2013_03_17_01_26_24-log_error
2013_03_17_01_26_24-lsof
2013_03_17_01_26_24-meminfo
2013_03_17_01_26_24-mpstat
2013_03_17_01_26_24-mpstat-overall
2013_03_17_01_26_24-mutex-status1
2013_03_17_01_26_24-mutex-status2
2013_03_17_01_26_24-mysqladmin
2013_03_17_01_26_24-netstat
2013_03_17_01_26_24-netstat_s
2013_03_17_01_26_24-opentables1
2013_03_17_01_26_24-opentables2
2013_03_17_01_26_24-output
2013_03_17_01_26_24-pmap
2013_03_17_01_26_24-processlist
2013_03_17_01_26_24-procstat
2013_03_17_01_26_24-procvmstat
2013_03_17_01_26_24-ps
2013_03_17_01_26_24-slabinfo
2013_03_17_01_26_24-sysctl
2013_03_17_01_26_24-top
2013_03_17_01_26_24-transactions
2013_03_17_01_26_24-trigger
2013_03_17_01_26_24-variables
2013_03_17_01_26_24-vmstat
2013_03_17_01_26_24-vmstat-overall

 

然後便可以從中去分析可能的問題所在

更多的使用說明, 可以參考 pt-stalk examples

stephon 發表在 痞客邦 留言(0) 人氣()

PostgreSQL 相較於 MySQL 而言, 設計概念各有所長

而對於 location-based 的 data 而言, PostgreSQL 所支援的 R-Tree / Gist indexing 可以讓 query response time 更快.

所以一般對於 location-based data 的存取, 仍以 PostgreSQL 優先.

 

但總是會遇到不小心 ALTER TABLE, DROP TABLE, ... 等等的狀況

production 環境下, 能快速地把資料救回來就是好方式.

官方的建議中, Point-In-Time Recovery 是 9.x 板新增的功能, 

但是步驟繁複, 對初入 PostgreSQL 的人來說比較難上手, 要改現成的設定也不知道原理.

所以就直接從 file system level 的 backup 下手是最快的.

 

  • 需求環境:

根據官方提供的 High Availability 方式 (不論是 Master/Slave, Clustering 都可) 

請準備好至少兩台的 PostgreSQL 機器

假設為 Pgsql_A 跟 Pgsql_B , writer IP 在 Pgsql_A

且 DATADIR 放在 ZFS 的 pool 上

 

  • 流程:

1. 確認 Pgsql_B 沒有 writer 的量
2. stop pgsql on Pgsql_B
3. take snapshot using zfs snapshot DATADIR
4. start pgsql on Pgsql_B

 

這樣只要不小心出事, 可以從 ZFS 的 snapshot 撈回資料

然後設定稍微修正一下, 跑起來就好了

這部分可以利用 zfs-snapshot-mgmt + cron script 做到每分鐘/小時/天 的備份

stephon 發表在 痞客邦 留言(0) 人氣()

F5BIG-IP 機器, 用了很久的 load balancer, 都沒遇到問題

但是官方架構建議是 server IP 是 private, 然後在 F5 上做 public virtual server

某組機器閒下來了以後, 就想說 F5 可不可以兩端都接 public IP, 這樣就可以提供給 public IP 機器使用

理論上可行, 但是問過 SI 也沒這樣做過, 所以不知道效果如何

接上去以後, 還真的可以 work.

紀錄一下作法:

1. F5 只需要設定 WAN 的 IP

2. 同樣做個 SNAT Pool, 此處需要用 public IP

3. 接下來的設定就等同於用 F5 當 load balancer 的設定, 請自行補上 Monitor / iRule / Pool / VS / SSL / ... 等設定

4. 由於機器這樣接只有 public IP 可以 access, either 是用 management IP 來管

    或者是參考 HTTPD Allow 的設定

 

stephon 發表在 痞客邦 留言(0) 人氣()

在某些 db 機從 Lenny -> Squeeze 後, drbd 變得異常的慢, 三不五時就在卡 query

繞了好大一圈, 發覺是 drbd 從 8.0.14 -> 8.3.7 搞的鬼, 一些設定變得嚴謹了, 造成效能低落

而在 Linux Kernel >= 2.6.28 時, drbd modules 已經被整合到 kernel 去了, 所以也沒辦法 downgrade

那麼, 要怎麼 tune, 才會接近原本的效能呢?

 

drbd performance tuning 上有講到一些參數, 我連著更新好的 drbd.conf 一起講.

1. 原本是:

global {
        usage-count no;
}

common {
        protocol C;
}

resource r0 {
        on NodeA {
                disk /dev/md1;
                device /dev/drbd1;
                address IP_NodeA:7789;
                meta-disk internal;
        }

        on NodeB {
                disk /dev/md1;
                device /dev/drbd1;
                address IP_NodeB:7789;
                meta-disk internal;
        }
}

2. 改成

global {
        usage-count no;
}

common {
        protocol C;
}

resource r0 {

        # 在沒有 write-back 的 i/o system 底下, 以下的設定請關閉, 因為開了只是減低效能
        disk {
                no-disk-barrier;  
                no-disk-flushes; 
                no-disk-drain; 
                no-md-flushes; 
        }

        net {
                max-buffers 8000;   # drbd 一次寫入的 buffer 大小, 如果用到 RAID, 建議調整到 8000, 預設是 2048
                max-epoch-size 8000;   # drbd 在兩端點一次最多的 request 數量, 建議跟 max-buffer 設定一樣
                sndbuf-size 0;  # TCP send buffer, 設定成 0 表示 auto tune
                unplug-watermark 8000;  # I/O subsystem 在每次正常的 operation 會有多高的機會被要求要處理 pending I/O process, 這個跟 hardware 相關
        }

        syncer {
                al-extents 3389;  # 調整 activity log size
        }


        on NodeA {
                disk /dev/md1;
                device /dev/drbd1;
                address IP_NodeA:7789;
                meta-disk internal;
        }

        on NodeB {
                disk /dev/md1;
                device /dev/drbd1;
                address IP_NodeB:7789;
                meta-disk internal;
        }
}


設定完以後

跑個 /etc/init.d/drbd reload 就可以了, 不用重開

在其他 linux distro, 可以執行 drbdadm sh-nop; drbdadm adjust all 也會達到同樣效果

stephon 發表在 痞客邦 留言(0) 人氣()

這個稿欠好久了 orz

Amazon SES 推出後, 對於一般中小企業做 bulk mail server 更為方便

但是缺點是

1. SES 的量需要 training, 並不是一開始就可以寄多封

2. 得自己做 SPF+DKIM

SPF 好解決, 但是如果是 DKIM 的話, 得自己做 DKIM Sign, 而 SES 預設是不提供這個 API 可供使用

3. 原本的 bulk mail server 怎麼辦? 如果很不幸的 SPF record 在同一個 domain 的話, 換個 domain 寄信是風險

所以, 今天要講的是, 如何讓 Amazon SES 做到 DKIM (with dkimproxy)

 

1. 安裝 postfix + dkimproxy, 並設定好連動, 至少透過 postfix 寄信可以有 DKIM Sign 的效果

2. 擁有一個 Amazon 帳號, 並抓取 SES Scripts, 在 FreeBSD 底下, 可以用 ports 裝 mail/p5-SES

並修改 /usr/local/lib/perl5/site_perl/%PERL_VERSION%/Mail/DKIM/Signer.pm

根據文件, 在 @DEFAULT_HEADERS 這個變數, 把 Message-Id, Date, Return-Path, Bounces-To 拿掉

3. dkimproxy 設定部份

不用做特別修改, 只要原本 postfix + dkimproxy 有正常 work 就可

4. postfix 設定部份

(1) master.cf 

aws-email       unix  -         n       n       -       1       pipe
  flags=R user=dkimproxy argv=/usr/bin/perl /usr/local/bin/ses-send-email.pl  -r -k  .aws-ses-key -f $sender $recipient

(2) main.cf

transport_maps = hash:/usr/local/etc/postfix/transport

header_checks = regexp:/usr/local/etc/postfix/header_checks

(3) header_checks

/^Auto-Submitted:/ IGNORE

 /^Errors-To:/ IGNORE

 /^Received:/ IGNORE

 /^X-Mailer:/ IGNORE

(3) transport

(把 To: A@bbb.org 的信件藉由 aws-email 傳送出去)

A@bbb.orgaws-email

設定完記得 postmap transport

 

5. 最後, postfix & dkimproxy restart 以後就可以了

 

要注意的是, bulk mail header 有沒有 Precendence: bulk , 有的話也請拿掉, Amazon SES 不認得

stephon 發表在 痞客邦 留言(0) 人氣()

會想這樣做的原因, 是因為開發網頁程式總是需要檢查 IE 相容性

很不幸的, 有些人的電腦不能跑 IETester (奇怪的錯誤啦, 或者是跑出來效果不對, 很慢, etc...)

Multiple IE 雖然說有 IE{5,6,7}, 但是還是有 IETester 的上述問題

由於之前有用過 VMWare Thinapp, 他可以把一個 Apps 弄成 Sandbox mode, 這樣就可以帶著到處跑

其實 ThinApp 的原理也很簡單, 紀錄安裝前/後的變異, 然後將變異的部份打包起來

以下是 Thinapp 的使用教學:

 

stephon 發表在 痞客邦 留言(0) 人氣()

因為用不到 L7 Load Balancer (如 haproxy), 但是又要做 LB 的需求時
在 linux 底下, 有 IPVS 可以使用, 尤其是可以支援 DR (Direct Routing), 前端 Server 只要負責轉發就可

一些注意事項如下:
1. 建議用 linux, 不論是 master server 或者是底下的 real server, 設定也比較方便
2. linux kernel 在 > 2.6.9 就內建 ipvs, 不用特別重編 kernel

架構圖

IPVS Architecture  

設定方式 (以 DR mode 為例)

1. Master (as LB Server)

(1) 額外 Bind 一個 Virtual IP (簡稱 VIP)

Master 跟 Real Server 是靠 Virtual IP 溝通

且因會動到 ARP 關係, 所以建議在同一個網域內

(2) 開啟 Master 的 ip forwarding

>> echo "1" > /proc/sys/net/ipv4/ip_forward

(3) 設定 Master 對 Real Server 做 Direct Routing

>> ipvsadm -A -t VIP:port -s rr
>> ipvsadm -a -t VIP:port -r RIP1:port -g -w 1
>> ipvsadm -a -t VIP:port -r RIP2:port -g -w 1

...

有幾台就加幾台

2. Real Server (as Client)

(1) 額外 Bind 一個 IP, IP 要跟 VIP 是一樣的

(2) 把 ARP 關掉

>> echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
>> echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
>> echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
>> echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce 

3. 測試

直接連到 VIP:port , 就會自動分流到底下的 RIP*:port

stephon 發表在 痞客邦 留言(0) 人氣()

最近在測試 mobile streaming 時, 發覺 Wowza 能夠丟給常見的 mobile devices

但如果要拉外來的 rtmp stream 並丟給 Wowza, 並且手機要能夠正常的播放, 需要作些 re-encoding

例如 iPhone 只吃 H.264 baseline 3.0 + AAC

 

作法有兩種:

1. 安裝 xuggle-xuggler (教學網頁)

2. 編譯 ffmpeg 時, 記得要 depend libx264, libfaac ,librtmp (新版的 librtmp 支援 rtmp output)

 

所以, 如果要滿足上述需求, 並手機 (iPhone, Android) 也能支援播放的話:

ffmpeg -i ${INPUT_RTMP_STREAM} -re -acodec libfaac -ab 64k -vcodec libx264 -vb 230k -vpre default -vpre ipod640 -r ${FRAME_RATE} -f flv ${OUTPUT_RTMP_STREAM}

若 OUTPUT_RTMP_STREAM 是 rtmp://example.com/live/testlive

以 Wowza 來說, 就可以用

(1) iPhone: http://example.com:1935/live/testlive/playlist.m3u8 

(2) Android: rtsp://example.com/live/testlive (用 rtsp 是為了 Android 1.x 的相容性, 2.x 可以吃 flash)

stephon 發表在 痞客邦 留言(1) 人氣()

DVD-VR 格式常見在 $ony CAM, 目錄結構會出現 VIDEO_RM 這個目錄

轉 mp4 的話, 直接用 TMPGEnc 之類的沒辦法讀取

所以作法如下:

1. 用 ImgBurn 讀成一個 ISO

2. 用 DVD Decryptor 開 IFO Mode, 讀取出各章節

3. 接下來照正常的 mp4 轉法就可

stephon 發表在 痞客邦 留言(0) 人氣()