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



Ubuntu使用MySQL

一、基本會使用的指令

1.查詢MySQL目前的服務狀態
$sudo netstat -tap | grep mysql
 
正常來說應該會呈現像這樣
 
 
2.啟動MySQL
在任何目錄下使用指令
$sudo service mysql start
 
帳號root 密碼為123456
 
3.登入並使用MySQL 
輸入指令
$mysql -u root -p
再輸入密碼

登入完成後,就會看到進入mysql>的狀態










4.更改密碼
#mysqladmin -u root password 1234
就能將預設的空白密碼改成1234
 
5.開始使用某資料庫結構(資料庫結構假設名稱為mysql)
mysql>use mysql

$mysql mysql
(如果有密碼就要再加上-p-->$mysql mysql -p<Enter>) 
 
正常來說應該要顯示以下畫面
 
 
 
 
 
代表切換資料庫結構成功!

6.退出MySQL狀態
mysql> exit
 
應該會收到



二、其它操作MySQL的語法︰

顯示所有 MySQL 資料庫
mysql> SHOW DATABASES;
(分號記得要打完再按Enter哦!否則會變成底下這樣,你會以為壞掉了!)






顯示該資料庫資料表
mysql> SHOW TABLES;

顯示 data 資料表的欄位資訊
mysql> SHOW COLUMNS FROM data;

顯示系統狀態(詳細)
mysql> show status;

顯示系統狀態(簡單)
mysql> status;

顯示變數
mysql> show variables;
mysql> show variables like '%max%';

顯示 process list
mysql> show processlist;

顯示帳號的權限資訊
mysql> show grants for cross@localhost;

顯示權限有那些
mysql> show privileges;

顯示表格格式
mysql> show table types;

顯示當初表格如何建立
mysql> show create table user;

 
刪除資料庫db1
mysql>drop database db1;


刪除資料庫db1裡的資料表tab1
mysql>drop table tab1;

查看tab1資料表的結構 
mysql>desc tab1;

查看資料表tab1裡的所有表格內容
mysql> select * from tab1;

備份特定的資料庫(結構)
$mysqldump -u root -p  database名稱 > 新名字.sql
 
還原特定的資料庫
$mysql -uroot -p123456 myschema < myschema.sql 
註︰如果資料庫裡沒有myschema這個資料結構
mysql>create database myschema後再繼續
 



相關連結
1.MySQL教程

2012年5月21日 星期一

更改記錄

更改記錄
sudo apt-get install yum
sudo apt-get install tomcat7--->移除了
sudo apt-get install tomcat7-admin--->移除了
sudo service tomcat7 start [OK]--->移除了
http://lp43.blogspot.com/2011/09/tomcatamazon-ec2.html
(最後是用這個方法灌成功,在etc/apache-tomcat-7.0.27/bin/底下呼叫startup.sh開啟tomcat)
 

2012年5月19日 星期六

AWS相關專用名詞

AMI(Amazon Machine Image)
An Amazon Machine Image (AMI) is an encrypted file stored in Amazon S3.
AMI 是編碼過後存在 Amazon S3 的 Image instances, 此 Image instances 就是一套作業系統的 snapshot, EC2 開機就是靠 Image 當作業系統.

Amazon EC2 Instance
A running server instantiated from an AMI is referred to as an instance. All instances launched from the same AMI will create a nearly identical running server (except for the IP range or computer name). 
執行 AMI 產生出的實體(instance), 此為主 Server 系統.

Security Group
The security group is analogous to a firewall that can block all incoming (ingress) and outgoing (egress) traffic that does not come in on a specific IP (specified by a CIDR) or port number range.
簡易的防火牆設定, 可以設定要 開放/關閉 哪些 TCP/UDP port 或 網段 等.

Instance Type
The instance types described different configurations of CPU, memory, and ephemeral storage capacity.
由 Instance type 來決定要哪種等級的機器 / CPU / Ram / HD 等.

Availability Zone
Amazon EC2 provides the ability to place instances in multiple locations. Amazon EC2 locations are
composed of availability zones and regions.
Amazon EC2 支援很多的地區, 由此選擇想要在哪個地區
(註: 若有使用 Volumes, Volumes 也要選同樣地區)

Minimum/Maximum Number of Instances
This functionality provides you with a way asking Amazon EC2 for a specific range of instances.
 一次要開啟多少數量的 Instances.

S3 Bucket
S3 is a persistent data store that enables you to store objects, like an AMI.
儲存 AMI 到 Amazon S3, AMI 就儲存在 S3 Bucket.

EBS(Elastic Block Storage)
Amazon Elastic Block Store (EBS) provides block level storage volumes for use with Amazon EC2 instances.
EBS 可以提供給 Amazon EC2 實體一個實體的儲存空間. (EC2 關機後, 資料就消失了.)

Amazon EBS Volume
Amazon EBS volumes are off-instance storage that persists independently from the life of an instance.
You can create storage volumes from 1 GB to 1 TB that can be mounted as devices by Amazon EC2 instances.
Amazon EBS Valoumn 是提供離線狀態的實體儲存空間, 空間大小由 1G ~ 1T 都可以設定, 一個 EC2 Instances 可以 mount 多個 Volume.

Amazon EBS Snapshot
Amazon EBS also provides the ability to create point-in-time snapshots of volumes, which are persisted to Amazon S3.
Amazon EBS 另外可以隨時建立 Amazon EBS Volumes 的 Snapshot, 並將此儲存在 Amazon S3.

Elastic IP (EIP)
Elastic IP addresses are static IP addresses designed for dynamic cloud computing.
Elastic IP addresses are associated with your account, not specific instances.
EIP 是要給此機器一個固定的靜態 IP, 不過 IP 是給 Account, 並不是給任何一個 Instances.