2014年4月17日 星期四

淘寶國際轉運心得



有些人都會佔賣家便宜,硬要說"國內運算",當然,賣家也不是省油的燈 XD 所以大部份都要先橋好運費才能往下走,而大部分從大陸寄東西過來的快遞大概耗費 30~36RMB 的價碼(需看商品重量)

上回在 PTT 跟團買烏克麗麗,第一次體驗淘寶購物,不過,煩擾的事是由主購者處理的,所以體驗上只有在收件時要額外付快遞錢。這次則是親自使用,就試試所謂的國際轉運。

國際轉運的特色是讓賣家把東西寄到國際轉運站,所以賣家上頭標記運費多少就是多少,不必去跟賣家討價還價,畢竟到國際轉運站就一定是國內運輸。等到東西到國際轉運站後,買家在上去網站支付所國際轉運站到自己家的運費。

整體貨品訂購跟運輸流程:
  1. 跟賣家下單,請賣家送到國際轉運站
  2. 追蹤貨品何時到國際轉運站
  3. 到國際轉運站進行支付到自家運費,此時可以選超商取貨或直接送到你家
最大的優點是處理多件商品,也就是跟多位賣家下單,統一在國際轉運站集貨,再一次支付國際運費。最大的缺點就是運輸時間拉長,原先賣家用快遞送到你家可能只要 5 天就能拿到貨,現在變成 3 天到國際轉運,再 3 天等待國際轉運簽收,再 3 天進行空運,時間可能拉長到一倍不等,在國際轉運站的 status 有不少 Orz,如"待入庫"、"已入庫"、"待出庫"等,而從國際轉運運輸時,又不少狀態 orz

未來思考這種用法可以著重在:
  • 是否向有多個賣家購買物品以及多項物品的急迫性,不急的話就用國際轉運
  • 若不急著收件且想要超商取貨,那就選國際轉運吧
  • 若不急著收件且賣家支付快遞的錢(例如 36RMB) > 賣家國內快遞(7RMB)+國際轉運運費(18RMB)

2014年4月16日 星期三

AWS - 初次使用 Amazon Relational Database Service (RDS) 筆記

時間差不多了,該幫公司引入 Amazon RDS 了!首先就是先請老闆拿出信用卡註冊一個帳號,接著邀請指定的管理者進駐使用,再透過 AWS Identity and Access Management (IAM) 給予權限,而這些管理者就不需要註冊 AWS 了,並且有專屬的 login 網址。此例會接觸到 EC2 跟 RDS 這兩塊,其中 EC2 是 Security Group 的部分,因為 Amazon RDS 的登入權限是吃 EC2 裡的 Security Group,例如不限 IP 來源(0.0.0.0/0) 等。

簡單地用圖記錄,此例先用預設值:

Step 1:使用 AWS RDS


Step 2:在此選擇 MySQL


Step 3:在此使用最簡單的方案


Step 4:設定 RDS 的規格,以及 RDS 代號,以及登入的帳密


Step 5:設定 MySQL 的環境,在此先用預設,之後還可以改。並且開一個 Database,此外 Security Group 則是在規範有誰可以連到這台 DB server,這可以晚點再切換到 EC2 去設定


Step 6:使用預設備份等


Step 7:接著就會確認 RDS 規格並進行啟動啦,可以準備回到 Dashboard 觀察目前的資訊


Steo 8:接著就可以查看目前 RDS 初始化的狀態


Step 9:初始化完在 EndPoint就會顯示登入位置:


Step 10:這步不見得需要,這是切換到 EC2 的 Security Group 設定,此例是允許任何位置的 IP 連入


最後,就跟用 command line 連進一台 MySQL DB 沒兩樣囉。

2014年4月15日 星期二

[Linux] 使用 Nagios 和 nagios-nrpe-server 定期偵測系統狀況



記得上個月也摸了一下 nagios ,但後來因忙碌而中斷的 Orz 這次就專心補齊了一下。簡單的說,若是在單機上安裝,則是自我檢測的方式,若透過 nagios-nrpe-server 則可以晉升為遠端監控。

僅需挑一檯機器當 Monitor,在上頭安裝 nagios3 環境 (nagios3 server),而在其他待監控的機上,安裝 nagios-nrpe-plugin 環境,並設置可以監控它的來源、要監控的指令。

待監控的 Servers:

由於有些資源還是要從 Server 自身監控,如 Disk space、 CPU Load 等,所以透過 nagios-nrpe-server 來提供遠端查詢方式

$ sudo apt-get install nagios-nrpe-server
$ sudo vim /etc/nagios/nrpe_local.cfg
allowed_hosts=127.0.0.1,MonitorServerIP
command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20
command[check_all_disks]=/usr/lib/nagios/plugins/check_disk -w 15% -c 5%
$ sudo service nagios-nrpe-server restart
netstat -at |grep nrpe
tcp        0      0 *:nrpe                  *:*                     LISTEN
$ grep nrpe /etc/services
nrpe            5666/tcp                        # Nagios Remote Plugin Executor


自我連線測試,也可以在 Monitor Server 測試指定 Server IP :

$ telnet localhost 5666

Monitor Server:

$ sudo apt-get install nagios3 nagios-nrpe-plugin

別忘了帳密在 /etc/nagios3/htpasswd.users 設定。此外,在 /usr/lib/nagios/plugins/ 就有一堆可以用的 tools ,例如監控 Google 是否正常:

$ /usr/lib/nagios/plugins/check_http -H www.google.com
HTTP OK: HTTP/1.1 200 OK - 12316 bytes in 0.057 second response time |time=0.056623s;;;0.000000 size=12316B;;;0


接著,則是定義自己的服務跟機器:

$ sudo vim /etc/nagios3/conf.d/my-server.cfg

#define host

define host {
        host_name db
        alias db.xxxx.com
        address db.xxxx.com
        hostgroups ssh-servers,remote-servers,https-servers
        use generic-host
}

define host {
        host_name www
        alias www.xxxx.com
        address www.xxxx.com
        hostgroups ssh-servers,remote-servers,http-servers,https-servers
        use generic-host
}

# define hostgroup

define hostgroup {
        hostgroup_name          mysql-servers
        alias                   MySQL DB Service
        members                 db
}

define hostgroup {
        hostgroup_name          https-servers
        alias                   HTTPS Service
        members                 db
}

define hostgroup {
        hostgroup_name          remote-servers
        alias                   Remote Server
        members                 db
}

# define service checking

define service {
        hostgroup_name          https-servers
        service_description     HTTPS
        check_command           check-https!$HOSTADDRESS!443
        use                     generic-service
        notification_interval   0 ; set > 0 if you want to be renotified
}

define service {
        hostgroup_name          remote-servers
        service_description     Remote NRPE CPU Load
        check_command           check_nrpe_1arg!check_load
        use                     generic-service
        notification_interval   0
}

define service {
        hostgroup_name          remote-servers
        service_description     Remote NRPE Disk Space
        check_command           check_nrpe_1arg!check_all_disks
        use                     generic-service
        notification_interval   0
}

# define commands

define command{
        command_name    check-https
        command_line    /usr/lib/nagios/plugins/check_http -I $ARG1$ -p $ARG2$ -S
}


$ sudo service nagios3 restart

如此一來,到 http://MonitorServerIP/nagios3 登入後,就可以觀察現況啦。以上的偵測包括 http, https, ssh, cpu loading, disk space 等,如果想要加上 mysql db service 的情況,可以試試 check_mysql_health 這支,需要額外下載:

下載 check_mysql_health 和編譯:

$ cd /tmp
$ wget -qO- http://labs.consol.de/download/shinken-nagios-plugins/check_mysql_health-2.1.8.2.tar.gz | tar -xzvf -
$ cd check_mysql_health-2.1.8.2
$ ./configure
$ make
$ sudo cp /tmp/check_mysql_health-2.1.8.2/plugins-scripts/check_mysql_health /usr/lib/nagios/plugins/


接著,撰寫相關 mysql db service checking:

$ sudo vim /etc/nagios3/conf.d/my-server.cfg

define host {
host_name db
alias db.xxxx.com
address db.xxxx.com
hostgroups ssh-servers,mysql-servers
use generic-host
}

define hostgroup {
hostgroup_name mysql-servers
alias MySQL DB Service
members db
}

define service {
hostgroup_name mysql-servers
service_description MySQL Remote Connection
check_command check-mysql-db!$HOSTADDRESS
#check_command check_tcp!-H!$HOSTADDRESS$!-p!3306
use generic-service
notification_interval 0 ; set > 0 if you want to be renotified
}

define command{
command_name check-mysql-db
command_line /usr/lib/nagios/plugins/check_mysql_health --hostname $ARG1$ --username nagios --password nagiospassword --mode querycache-hitrate --warning 90 --critica 95
}


此外,別忘了建立帳號供 monitor server 連到 db server,在 db server 上建立 nagios 帳號:

mysql> GRANT usage ON *.* TO 'nagios'@'nagios_monitor_server' IDENTIFIED BY 'nagiospassword';

[Linux] High Availability MySQL 筆記:auto-increment-increment, auto-increment-offset, my.cnf @ Ubuntu 12.04

想起來很妙,在過去累積至今 2014 年初的工作經驗上,對於處理資料儲存方面,我並非使用 SQL DB 的,結果今年一口氣摸了不少 XD 不過原理都大同小異,就順便筆記一下。

以 High Availability MySQL (MySQL HA) 為例,通常為了降低系統複雜度又要提供 HA 時,可以考慮將 Read/Write 分離,讓 Write 在某一檯機器上,但 Read 可以有一批機器,只是開發上又要留意,如果 client 有更新資料時,必須讓 client 後續的動作也在 write 那檯機器,以免 MySQL Replication 的過程還未及時,這是讀比寫大量的使用情境。

如果寫也要做 HA 時,最常碰到的問題就是每檯 server 上的 primary key collision 的問題,以兩台某 table 的 int id 為例,讓其中一檯為 2N,另一台是 2N + 1,其中 N 是第幾筆資料,同理有 10 台,那就依序為 10N, 10N+1, 10N+2, ..., 10N+9。

達成這個效果,慶幸地只需要更改 my.cnf 或動態更新環境變數即可,共有兩個參數:

$ sudo vim /etc/mysql/my.cnf

[mysqld]
# ...
# http://dev.mysql.com/doc/refman/5.5/en/replication-options-master.html
auto-increment-increment = 10
auto-increment-offset = 1

$ sudo service mysql restart


如果不想要讓 mysql restart 的話,可以透過設定 global variable 的方式:

mysql> set global auto_increment_increment=10;
mysql> set global auto_increment_offset=1;


另外,也可以查詢目前情況:

mysql> show variables like '%auto_increment%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+

mysql> set global auto_increment_increment=10;

mysql> show session variables like '%auto_increment%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+

mysql> show global variables like '%auto_increment%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 10    |
| auto_increment_offset    | 1     |
+--------------------------+-------+


需留意 session variables 代表是此時 mysql connection 的狀態,若透過 set global 變數的方式,需要重連才會看到。

透過上述 primary 的分開後,除了可以做 write HA 外(如:Master-Master 架構),其實也可以用在移機過程,例如目前有 Server 1 跟 Server 2 且 Server 1 是目前的 DB server,想要把 db 從 Server 1 移到 Server 2 時,先透過 MySQL Replication 機制讓 Server 2 同步跟著 Server 1 資料,等到資料差不多時,可以把 target db connection 角色從 Server 1 移到 Server 2,但轉移的過程中總是有一些連線還在跟 Server 1 溝通,就會變成有新資料新增到 Server 2 上,而 Server 1 裡還未同步到 Server 2的資料,其 primary key id 很大的機會跟 Server 2 裡的一樣,導致 primary key collision 問題。

因此,為了解決這個問題,就可以透過 auto-increment-increment 和 auto-increment-offset 的設定,讓兩台的 auto-increment-offset 不一樣,就可以避免這種問題了。

Linode - 使用 Backup 服務處理事件: An issue affecting the physical hardware this Linode resides on has been detected.

下班前收到這個 event ,結果就是繼續加班 Orz 若下班前的會議沒 delay 的話,我應該是在回家的路上被狂 call XDD

An issue affecting the physical hardware this Linode resides on has been detected.

We are working to resolve the issue as quickly as possible and will update you as soon as we have more information.
Your Linode will return to its previous state once the issue is resolved. Thank you for your patience and understanding.

記得以前問過學弟,他說 Linode 也會有維護的情況,沒想到真的碰到了...直接把你的機器關掉,我跟老闆說,這就像我們租的機房碰到火災一樣 XD 沒轍。

至於解法也沒有啥好辦法,一種就是等他維護好,另一種則是另外建一台 backup server 出來用,由於我們的服務都有建 backup ,所以就來體驗一下。

切換到被關掉的那台機的 backup 區,可以看到有一些選項可用:


此例就選 daily backup 的 restore to 選項,接著選要去哪台機器:


由於我已經先開了新機器(最下面那台),不然可以點 Add a Linode,此例也意外發現只能 restore to 同一區 DataCenter 的機器。最後,那台新機器的情況就會顯示正在處理:

 

處理完後,就可以 Boot 啦 :P

註:還好 Linode 只花了 3 小時處理,接著就可以把新機器著手進行關閉了。