2016年3月1日 星期二

2016 - 03月份 出勤表 - Invitation to edit

Simon Su has invited you to edit the following spreadsheet:
This email grants access to this item without logging in. Only forward it to people you trust.
Google Sheets: Create and edit spreadsheets online.Logo for Google Sheets

2013年7月2日 星期二

使用Stingray進行Domain Name分流

Scenario

許多人會遇到在一台Stingray底下,需要使用到相同Port建立不同的服務的情況,當Stingray綁訂多組IP時候,當然可以把來自不同ip的部分分別設定Virtural Server,但是若只有綁訂一組IP,Port重複使用的部份就是個頭痛的問題,這邊虛擬一個簡單的範例,如下圖所示:



如上圖,當Stingray只有Binding一組IP時候,三組DNS共用一組Domain Name,則需要透過Traffic Rule來進行流量的控制,Traffic Rule的內容大致上就是取出連線的Target端Domain Name,並且將該Traffic重導到適當的Pool...
在這個設定中,需要事先準備下面設定:
  1. 三組Pool,分別對應到要Group的Server
  2. 一組Virtual Server,對應到port 80,預設Pool可以設定為discard
  3. 設定Virtual Server上的Traffic Rule


Traffic Rule

進入Traffic Rule的編輯部分,在Input Traffic部分建立下面的規則:

#使用getHostHeader取出連線進入的domain name
$hostheader = http.getHostHeader();

#透過log確認是否是正確的規則
log.info("$hostheader:". $hostheader);

#撰寫連線規則
if($hostheader == ‘www1.abc.com’)
 pool.use( "www1_pool");
else if($hostheader == ‘www2.abc.com’)
 pool.use( "www2_pool");
else if($hostheader == ‘www3.abc.com’)
 pool.use( "www3_pool");

測試


當Virtual Server enable之後,則可以透過在你的連線主機上hard code hosts設定來達到可以連線www1.abc.com, www2.abc.com, www3.abc.com的效果,此時如果設定無誤,則可以正確的連線到您所指定的Pool中的主機。

2013年5月15日 星期三

Stingray Clustering

如果您有一台以上的Stingray,一定會希望透過Cluster的方式來把它串起來!
而Cluster的設定其實是有License的限制的,需要到System > License > Installed License Key裡面檢視您目前的License支援的程度



另外,在建立Cluster的同時,您需要確認在設定上hostname的設定上,cluster member必須能夠找到對方,因此比較快的方式是去設定/etc/hosts...

開始設定Cluster,只要把Wizards下拉後,選擇Join a Cluster,後面的精靈會帶您填入cluster member的位置,然後再輸入該Stingray(要加入的那台)的admin帳號密碼,就可以完成加入的動作∼(這邊不贅述Winzards的設定)



加入後就可以在Web Console上的右上角看到Cluster: OK字樣,且Traffic Managers可以看到已經加入的Cluster Member... 且使用另一台Stingray登入時也可以看到一樣的設定喔∼


2012年12月8日 星期六

TrafficScript log

在TrafficScript中,有提供一個log物件,並提供error, info, warn等操作方式,log的寫法是:
log.info("string that need to log...");

而,如果要操作到字串的相加,則是使用"."來串接兩個字串...
例如:顯示"url=目前連進的url"這樣的一串文字..
$rawurl = http.getRawURL();
log.info('url='.$rawurl);

而在所有設定就緒後
尚需要確認Virtual Server的log記錄功能是否打開...


等設定都OK之後,您就可以在進入頁面(Home)看到相關的Log資訊(當然,您需要有Request進入才會Trigger相對應的Log)...


2012年12月7日 星期五

Using TrafficScript to Redirect Page

Page redirect在網頁中,一般只要一行HTML或是JavaScript就可以完成
但是跑一段HTML或JavaScript卻需要一台HTTP Server!
許多網路上的服務主機移轉,其實沒必要再那麼費資源∼

在TrafficScript中,只要在Request Rule中指定redirect的位置即可
例如,我有一台server要從http 80 port遷移到https 443 port
那Listen在該位置80 port的Virtual Server Request Rule可以這下:


另外,可以搭配http.getRawURL()來針對每一個Path的導向都做直接重導的動作:

$rawurl = http.getRawURL();
http.redirect("https://your.server.domain.name/".$rawurl);


2012年12月2日 星期日

Stingray簡介

不是第一篇講簡介好像又點奇怪,不過就當做給不認識Software Load Balancer的朋友一個參考啦...

Stingray原名Zeus,為Riverbed公司所購買之Zeus公司產品,專職負載平衡與網路流量管理相關功能。
研究Stingray的緣起是越來越多的專案使用到網路層的Load Balancer,因大型的軟體架構中,時常需要有負載平衡及Cluster的架構,而仰賴Apache或是簡單的Load Balancer軟體常常不能滿足需求,而硬體方式的Load Balancer像是BigIP或是Cisco相對應的負載平衡設備都往往超出預算而又超出一般軟體工程師可以觸及的範圍,在這些條件之下,Stingray反而圖顯了一些他存在的重要性。





以下針對幾個個人認為Stingray價值核心的部份列出給大家參考:
  • 本身為軟體:這部份對軟體工程師而言是好消息,不需觸及硬體部份即可將一些網路之構想以Stingray所提供之介面實現,當然設定者本身也必需具備部份網路架構之基礎,方可收事半功倍之成效。另外,不少網路設備提供可程式化介面,但往往由於網路設備下所關係到的節點數量龐大,導致安全性上考量而無法釋放給軟體工程師太多空間進行管理與設定,而本身為軟體的優勢,讓您可以在任何節點部署架構,而佈至於影響到太多的網路節點。
  • 提供各種程式語言實作之API介面:提供各種語言之API介面,也是方便系統架構與軟體工程師之特性,這部份讓系統環境中許多不定因素或是需要大量判斷之路由規則不在是夢想。
  • 提供友善的Web管理界面:Web的管理介面通常是一套系統必備的工具,而Stingray提供的Web介面也出奇的簡單,並可在介面中對軟體或系統進行重新啓動的操控,這部份也讓管理者可以減少在外部網路環境還需要SSH連線到作業系統的需求。

目前Stingray系列以model區分有三個系列:1000 Model, 2000 Model, 4000 Model,功能模組上稍有差異,其中2000系列以上提供的Global Load Balancing是最大差異,該功能提供使用者可以依地區性來進行區域網址的導向,簡單的說,就是可以做到讓美國的IP連線美國的主機、台灣的IP連線台灣的主機... 

其他有些不錯的功能像頻寬管理、服務等級監控...等功能也是2000以上系列才有提供,不過這些開發測試版本都可以直接使用喔,唯差在頻寬限制而已...


Stingray價目表,參考至官網


在官方網站簡介中,Stingray之安裝規格最小為2GB,筆者曾試過1GB的Ubuntu可以正常安裝,且可以運作,不過考慮到穩定性,建議還是依照官方建議規格進行安裝,會比較好唷~

Operating System: SoftwareLinux 2.6.22 or later (x86, x86_64), Solaris 10 (SPARC, x86_64), OpenSolaris 2009.6 (x86_64)
Virtual Environment: Virtual ApplianceVMware vSphere 4, VI3 (3.5), XenServer 5.5, OracleVM 2.1, VMware ESXi 4.1 and 5.0
Recommended Hardware: CPUIntel Xeon / AMD Opteron / Oracle SPARC
Recommended Hardware: Memory2 Gb
Recommended Hardware: Disk space10 Gb
表:建議安裝規

2012年11月30日 星期五

苦惱訂單系統沒有額外LOG記錄,Stingray幫你通通記下來

當LoadBalancer不再只有流量重導與負載平衡時候,您也可以透過LB來做一些特殊的事情...
這邊展示從HTTP協定著手,將LB所負載之WEB上的Log做一個額外的紀錄...

[系統URL或API URI範例]
[POST] https://your.ip.address:port/cloudstore/simonsu/order/OD-01346

Create Body:(當post上面url時候,實際是送這邊的資料出去)
{"order_id":"OD-01346","username":"simonsu","price":"1000"}
Response Body:(當post完成時候,系統回傳資訊)
{"status":"OK"}

這邊透過一個Request Rule與一個Response Rule來組成這個服務,
其中Request部分記錄使用者傳入參數
而Response部分記錄系統回傳完成訂購之資訊
回傳部分,可以透過某些檢查機制來確認是否要進行Log動作...

[RULE_CREATEORDER_LOG_REQ]
$rawurl = http.getRawURL(); # ex: /cloudstore/simonsu/order/OD-01346
$method = http.getMethod(); # ex: POST
$post = http.getBody(); # ex:
{"order_id":"OD-01346","username":"simonsu","price":"1000"}
$arr = string.split($rawurl,'/'); $ want to get user
$user = '';
if ( array.length($arr) >= 2 ) {
  $user = $arr[1];
}
if ( string.startsWith( $rawurl,"/cloudstore") &&
    string.regexmatch($method, 'POST') ) {
  log.info('>>>>>>>YES GOT CREATE ACTION!!!!');
  # pass the parameter to response rule
  connection.data.set("post", $post);
  connection.data.set("user", $user);
}


[RULE_CREATEORDER_LOG_RESP]
$user = connection.data.get("user");
$post = connection.data.get("post");
$resp = http.getResponseBody();
# Query the mapi2 for record the post and the response
# All things in url can process from node.js using req.params.[name]
# All thinsg in POST column can process from node.js using req.body
$new_url = "http://log.server.ip.address:port/logOrder/".$user."/".string.urlencode( $post );
if($resp != '{"status":"Failed"}'){ $result = http.request.post($new_url, $resp,"Content-Type: application/json");
log.info('>>>create order result='.$result);
}

接收Log的程式,也相當簡單,這邊展示使用Node.js的接值方式
至於儲存部分,則依據自己實作啦∼

[Node.js Server (Using ExpressJS)]
# app.js
app.get('/logOrder/:user/:post', route.createOrderLog);
# route/index.js
exports.createOrderLog = function(req, res){
//post data取值,直接接回body取值
 var order = req.body;
 res.writeHead(200, {'Content-Type': 'application/json'});
//url列的參數取值,使用req.params.[name]取值
 order.user=req.params.user;
 order.post=JSON.parse(req.params.post);

  //TODO: 使用您prefer的儲存方式存檔
 console.log('Get create order request...., %s', JSON.stringify(order));
//回應狀態
 res.end(JSON.stringify(order));
}

已上面的範例,做後可以看到console的Log

[LOG]
Get create order request...., {"status":"OK","user":"simonsu","post":{"order_id":"OD-01346","username":"simonsu","price":"1000"}}