2012年8月28日 星期二

使用Auto-Scale

撰寫︰2012/8/29 02:32
次數︰1
一、前言
亞馬遜因為擁有自動調整伺服器需求的功能,
因此在近年來成為灸手可熱的選擇之一。

最近在研究CloudWatch + AutoScale來自動依狀況自動增加或減少EC2開啟的機臺,
想要做到能夠自動調節+省錢,
而這件事也真的辦到了。

二、說明
CloudWatch稱為雲監控,
亞馬遜將他們大部份的服務,
提供一個還蠻完善的機臺監控服務。

我可以利用亞馬遜提供的tool工具,
寫出一套適合自己的腳本,
每5分鐘從EC2主機print出記憶體用量的log給CloudWatch,
然後再在CloudWatch裡做ALARM監聽,
只要記憶體報告跟我說現在的記憶體用量超過總量的30%(我是用m1.small型EC2),
就寄一封EMAIL給我,
並幫我自動開一臺機臺分擔流量。

因為要能分擔流量,
所以在製作自動增設機臺的腳本時,
要用到ELB(流量負載平衡)的概念。

ELB(流量負載平衡)提供了多機臺一統的概念,
只要用戶連結至ELB的End Point(對外連結點),
ELB就會馬上將其名下擁有的EC2們做偵測,
並將流量分派到任一健康的EC2機臺。

三、Auto Scale的腳本製作法
Auto Scale由於仍然需要用Terminal去執行,
因此必須先將Auto Scale tool安裝且設定好環境變數。

之後就做一堆事,
這裡將我寫好的Auto Scale腳本列出來。

欲執行以下指令時,
需先將做好Credential的設定。
如果你操作tool的環境是Window,則下︰
C:\> set AWS_CREDENTIAL_FILE=<PATH> 

[建立Launch-Config檔]
寫一個產出基本執行腳本,名稱定為MsLaunchConfig(可自訂),image-id找一個你喜歡的AMI(當然也可以用自己安裝設定後的EC2製成的AMI,這樣就能做出一臺一模一樣的主機了。)
region最好是指定一下,因為預設是在美國。
key pair也設定一下,這樣子才能夠有登入並修改主機的權限。
as-create-launch-config MsLaunchConfig --image-id ami-9c8ccdce(你要備份的AMI_ID) --instance-type m1.small --region ap-southeast-1 --group quicklaunch-1 --key jsp

[建立Auto-scale Group]
製作一個Auto scale群組。
在這邊設定一次開臺上限就是1,然後開出來的機臺要放進我創建的mslb這個負載平衡器(load balance)裡。
as-create-auto-scaling-group MsGroup --availability-zones ap-southeast-1b --launch-configuration MsLaunchConfig --min-size 1 --max-size 1 --load-balancers mslb --region ap-southeast-1

[加開1臺EC2 Policy(政策)]
告訴MsGroup一旦Auto Scale的+1臺EC2條款被啟動,
一次就是新開一臺。
as-put-scaling-policy MsScaleUpPolicy --auto-scaling-group  MsGroup --adjustment 1 --type ChangeInCapacity --cooldown 300 --region ap-southeast-1

[關閉1臺EC2 Policy(政策)]
CloudWatch一旦觸發到一個我們設定的狀態(如主要的EC2記憶體沒用那麼兇了),
就幫我關掉1臺EC2。
as-put-scaling-policy MsScaleDownPolicy --auto-scaling-group  MsGroup "--adjustment=-1" --type ChangeInCapacity --cooldown 300 --region ap-southeast-1

註︰
亞馬遜Document裡提到,
一個正常的Auto scale腳本,
應該要有2個Policy,
一個是啟動,
另一個則是關閉。

如果要換成別的AMI做Auto Scale,
目前還沒有update等相關指令,
只能用刪除的方式將設定檔刪除,
再重新建立一組設定資料︰
先刪除Group,再刪Config檔。
[刪除Auto-scale Group]
as-delete-auto-scaling-group MsGroup --force-delete --region ap-southeast-1

[刪除Launch-Config檔]
因為auto scale tool沒有提供修改的功能,
因此如果值設錯了,就得刪除再重新新增了。
as-delete-launch-config MsLaunchConfig --region ap-southeast-1

2012年8月7日 星期二

RDS的最大連線數限制

RDS的機臺分很多型,
RAM、硬碟速度都不同,
一位外國網友列出了他的測試數據

Max. Connections on RDS MySQL


Just recently I ran into some MySQL issues while load-testing our web servers. The reason were limitations in the predefined MySQL RDS settings for our RDS instance plus some swapping lags due to missing RAM on heavy operations. The CPU was always at less than 30%.
I fixed both issues in upgrading from a small RDS instance (1.7 GB RAM) to a large RDS instance (7,5 GB RAM).
The predefined AWS RDS settings for MySQL max. connections are:
  • Small Instance: 150 connections
  • Large instance: 640 connections
他測出一個samll型的RDS(1.7 GB RAM),大概可以忍受150人同時連線,
而large型的RDS(7.5 GB RAM)則能忍受640個連線數。
我自己使用的經驗,如果是提供的AWS Free Usage Tiermicro型RDS,只能提供33人同時連線。
悲劇。

2012年7月11日 星期三

json NoClassDefFoundError

今天欲使用JsonLib,
照例將jar檔放進tocmat安裝目錄的lib底下,
並重新啟動tomcat。

但卻遇到NoClassDefFoundError的錯誤。

爬文後才發現,
要讓JsonLib能work,
要在tomcat/lib放入以下jar檔︰

(1)commons-beanutils-1.7.0.jar(http://commons.apache.org/index.html取得,見圖1)
(2)commons-httpclient-3.1.jar (http://www.docjar.com/搜尋關鍵字httpclient用jar檔搜尋取得)
(3)commons-lang-2.3.jar (http://commons.apache.org/index.html取得,要抓2.6版。3.1版仍會報找不到class的錯)
(4)commons-logging-1.0.4.jar (http://commons.apache.org/index.html取得)
(5)commons-collections-3.1.jar (http://commons.apache.org/index.html取得)
(6)ezmorph-1.0.3.jar(http://ezmorph.sourceforge.net/取得)
(7)json-lib-2.3-jdk15.jar(http://json-lib.sourceforge.net/取得)

才能正常運作Json

圖1 beanutils下載連結點
這些是如果沒放入以上jar檔可能會遇到的錯誤︰
java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher
java.lang.NoClassDefFoundError: org/apache/commons/collections/map/ListOrderedMap
java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean
java.lang.NoClassDefFoundError: org/apache/commons/codec/DecoderException
java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

2012年6月24日 星期日

S3的使用問題

這幾天在用S3,
發現如果目錄有空格的話,
在Android裡用也放入空格的path是無法正常下載檔案的。

2012年6月16日 星期六

修改RDS的預設語系(解決MySQL???亂碼問題)

文章撰寫︰2012/6/17 11:34
文章修改︰2012/6/18 10:49
修改次數︰2
一、前言
RDS是亞馬遜上很方便的資料庫服務,他們提供了MySQL、mssql和Oracle等大型資料庫,而啟動的方式也像EC2一樣,設定一下,一臺專門提供資料庫查詢的server,就產生了。

二、文章開始
但是因為RDS預設是latin語系,我們在使用前必須將語系設為BIG5或UTF8,底下以UTF8為例。

亞馬遜RDS服務在建立時,其實有一個地方可以設定"各種類型的DB屬性(DB Parameter Groups)",見下圖。
我建立了一個utf-8專用的屬性,名稱為msinstance01,但是我卻找不到能設定屬性的地方。
原來亞馬遜建議我們建立一個DB group參數後,使用他們提供的RDS tool去修改每種參數裡的設定。

(以下教學從亞馬遜RDS文件提供)
但是,環境變數需先設定好。
1.JAVA_HOME那些東西要設定好,這不用說了。

2.設好AWS_RDS_HOME,可以用下列指令在命令提示字元設定
C:\> set AWS_RDS_HOME=<path-to-tools>

3.將AWS_RDS_HOME底下的bin目錄設到path
C:\> setx PATH=%PATH%;%AWS_RDS_HOME%\bin 

3.重開機
此時,基本的RDS_tool已經安裝完成。

接著要做一些較細項的相關設定,
1.設定AWS_RDS_HOME底下的credential-file-path.template檔,之後我們在使用RDS tool時,才能獲得修改的權限

2.進入命令提示字元,先設定你的RDS的region(擺放地區,看你的機臺放在哪裡而定)
C:\> set EC2_REGION=us-west-1

像我將機臺設在新加坡,這個值就是設
C:\> set EC2_REGION=ap-southeast-1
 
3.設定AWS_CREDENTIAL_FILE environment variable環境變數
C:\> set AWS_CREDENTIAL_FILE=<檔案路徑就是上面credential-file-path.template的路徑>

然後,你才能擁有修改DB Parameter Groups的權利。

4.我想要替我剛才建立出來的msinstance01設定成utf-8
C:\>rds-modify-db-parameter-group utfgroup --parameters "name=character_set_connection, value=utf8, method=immediate" --parameters "name=character_set_client, value=utf8, method=immediate" --parameters "name=character_set_database, value=utf8, method=immediate" --parameters "name=character_set_results, value=utf8, method=immediate" --parameters "name=collation_connection, value=utf8_general_ci, method=immediate" --parameters "name=collation_server, value=utf8_general_ci, method=immediate" 

這樣就修改完成了。
註︰上方的紅字請改成你的parameter group名稱
看一下DB Parameter Groups屬性表, 沒錯,值有被修改。

5.回到RDS Console頁,將RDS的參數設成剛才修改的msdbparameter
這樣就完成了RDS預設語系的修改。

三、總結
經過設定,你的RDS終於正式始用utf-8環境的資料庫了!

如果用JSP使用RDS,
在使用JDBC連線前,
記得網址除了填上亞馬遜RDS提供的endPoint:3306以外,
還要在後面加上使用Unicode的設定。
整串用起來像這樣子︰
String final URL = "jdbc:mysql://msinstance04.c7xieywxei8h.ap-southeast-1.rds.amazonaws.com:3306?useUnicode=true&characterEncoding=utf-8";
Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection(URL,ACCOUNT,PASSWORD);

紅色那段字將是解決亂碼很重要的關鍵哦!

因為電腦是很笨的,
如果你沒告訴RDS裡的DB說你要上傳的資料是utf-8編碼格式,
即使DB有utf-8編碼,
它也會笨笨的顯示成一堆????亂碼給你看喔!

2012年5月22日 星期二

Tomcat的初始化

記得要將JDBC放到tomcat\lib\目錄裡,
重開tomcat,
JSP才能讀到Connect/J

切換Linux的權限

Linux的預設權限為使用者,
要切換成管理者權限
指令是
$sudo -i