領先一步
VMware 提供培訓和認證,以加速您的進度。
瞭解更多健全的 CI 結構的有趣副作用之一是,當事情可靠地運行時,新的問題開始浮現。 在 Spring 的 CI 系統開始順利運行後不久,我們在 static.springframework.org 上的偶爾出現的空間和頻寬問題變得更加明顯。 Colin Sampaleanu 之前已經研究過如何減輕這些問題,並決定使用 Amazon S3。
Amazon S3 是 Amazon Web Services 的一部分,並提供非常便宜的線上檔案儲存服務。 什麼是「非常便宜」? 嗯,從網站上看來,1 GB*月的儲存成本為 0.15 美元,1 GB 的頻寬成本為 0.20 美元。 此外,加上高頻寬透明鏡像服務,S3 對於儲存我們的每日快照變得非常吸引人。 順帶一提,Amazon 實際上在內部使用完全相同的基礎架構,因此您知道有一個管理團隊保證他們的五個 9 的承諾。
為了使用 S3 進行我們的每日快照,我們首先必須替換使用 scp 的舊快照上傳程序。 我四處尋找,但沒有看到任何上傳到 S3 的 ANT 工作,所以我開始創建自己的。 我的目標配置非常簡單
<aws:s3 accessKey="${s3.accessKey}" secretKey="${s3.secretKey}">
<upload bucketName="static.springframework.org"
file="${target.release.dir}/${release-with-dependencies.zip}"
toFile="SPR/spring-framework-${spring-version}-with-dependencies-${tstamp}-${build.number}.zip"
publicRead="true"/>
<upload bucketName="static.springframework.org"
file="${target.release.dir}/${release.zip}"
toFile="SPR/spring-framework-${spring-version}-${tstamp}-${build.number}.zip"
publicRead="true"/>
</aws:s3>
我希望能夠定義一個由我們的存取金鑰和密碼金鑰(S3 的加密登入)管理的單一 S3 會話,並在該定義中執行多次上傳。 每次上傳都會進入一個「儲存貯體 (bucket)」,這是 S3 提供的唯一粒度層級。
S3 本身通常用作 REST-ful 服務,因此很容易與之互動。 在這項工作中,我使用了一個名為 jets3t(發音為 jet-set)的函式庫。 對於任何使用 Java 使用 S3 的人來說,這是使用 S3 的首選方式(據我所知,這是 Amazon 唯一認可的函式庫)。 Jets3t 使用類似於我的 XML 定義的範例(或者可能我使用了他們的?),即您建立對伺服器的參考,並重複使用該參考來執行多個動作。 在 ANT 工作中,我根據存取金鑰和密碼金鑰建立一組憑證,並將它們繫結到服務的參考中
AWSCredentials credentials = new AWSCredentials(accessKey, secretKey);
S3Service service = new RestS3Service(credentials);
for (Upload upload : uploads) {
upload.upload(service);
}
如您所見,我已模組化上傳動作,以便將來如果我需要擴展 s3 工作來執行其他操作(下載、設定權限等),我可以。 Upload 物件執行繁重的工作。 它根據 bucketName 建立對儲存貯體的參考,根據 toFile 值建立對新物件的參考,然後透過 HTTP 上傳檔案的內容。
private S3Bucket getBucket() {
return new S3Bucket(bucketName);
}
private S3Object getObject() {
S3Object object = new S3Object(toFile);
if (publicRead) {
object.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
}
object.setDataInputFile(file);
object.setContentLength(file.length());
return object;
}
S3Bucket bucket = getBucket();
S3Object object = getObject();
service.putObject(bucket, object);
在此工作的實際程式碼中,我新增了一些漂亮的輸出,以便您可以查看檔案上傳的速度以及上傳速度是多少
upload-s3: [aws:s3] Uploading /opt/j2ee/domains/springframework.org/build/bamboo-home/xml-data/build-dir/ SPR-NIGHTLY/spring/target/release/spring-framework-2.0.5-with-dependencies.zip (65132641B) to bucket static.springframework.org [aws:s3] Transfer Time: 34.0s - Transfer Rate: 1915665.9B/s [aws:s3] Uploading /opt/j2ee/domains/springframework.org/build/bamboo-home/xml-data/build-dir/ SPR-NIGHTLY/spring/target/release/spring-framework-2.0.5.zip (10752085B) to bucket static.springframework.org [aws:s3] Transfer Time: 6.0s - Transfer Rate: 1792014.1B/s
這項工作對我們來說非常成功,我們已將其擴展到 Spring 產品組合中的所有基於 ANT 的建置。 Spring Framework、Spring LDAP、Spring Web Flow 和 Spring Modules 現在都上傳到此 S3 每日快照儲存庫,而在我的待辦事項清單上,也要給予 Maven 專案一些關愛。 這樣做的結果是,我們釋放了超過 30GB 的空間,並大幅降低了頻寬使用量,而在過去兩個月中的花費約為 4.00 美元。
由於我必須編寫一些程式碼才能使這一切正常工作,因此我將其放入我們的原始碼控制區域。 我也繼續將其放置在我們的內部私有 Maven 儲存庫中,該儲存庫鏡像到公共 Maven 儲存庫。 如果您有興趣查看程式碼,請查看 SVN 儲存庫。 如果您想使用 ANT 工作,您可以從 Maven 取得它,其 groupId 為 org.springframework.aws,artifactId 為 spring-aws-ant。 請注意,這是完全不受支援且未記載的程式碼! 它的功能非常有限,並且目前沒有任何改進或記載它的計劃。 如果我有空閒時間,情況可能會改變,但不要指望它 :)。
看來我的航班現在正在降落,因此我將藉此機會完成此文章。 尋找後續文章,該文章描述了我們如何建立快照下載頁面,以便您可以直接從 S3 取得快照。