2014年4月18日 星期五

Linode - A pending free upgrade is available



2014/04/17 時,Linode 公告方案升級(所有方案升一級,最低方案剩 Linode 2G),並且提供 SSD 服務,跟朋友討論時,要點一下 Dashboard 右下角的 Upgrade,也因此試了一下。



以原先方案 Linode 4G 的機器升級,實際測試耗時約 30 分鐘,在評估一下機器中斷服務的時間吧!

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 不一樣,就可以避免這種問題了。