基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

1。 雲硬碟

HDD(普通雲盤)

特徵: 效能一般, IOPS大概在數百左右。

應用場景: 資料不被經常訪問或者低I/O負載的應用場景,需要低成本並且有隨機讀寫I/O的應用環境。

混合HDD(高效雲盤)

特徵: 結合HDD和SSD硬碟構建, IOPS為1000~5000左右。

應用場景: 開發與測試業務、系統盤。

SSD雲盤

特徵: 具有穩定的IO能力, IOPS能夠達到10000~25000左右。

應用場景:I/O密集型應用、中小型關係資料庫、NoSQL資料庫。

企業級SSD(ESSD雲盤)

特徵: 最佳化增強的SSD雲盤, 一般是採用企業級的快閃記憶體硬體, IOPS能夠達到10000~1000000左右。

應用場景: 大型OLTP資料庫等關係型資料庫、NoSQL資料庫、ELK分散式日誌儲存等。

測試:

安裝fio工具

yum -y install fio

iops測試

fio ——name=disktest ——filename=~/disktest ——rw=randread ——refill_buffers ——bs=4k ——size=1G -runtime=5 -direct=1 -iodepth=128 -ioengine=libaio

輸出結果:

[root@iZm5egp1t778ocdk7f1j6fZ ~]# fio ——name=disktest ——filename=~/disktest ——rw=randread ——refill_buffers ——bs=4k ——size=1G -runtime=5 -direct=1 -iodepth=128 -ioengine=libaiodisktest: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=128fio-3。7Starting 1 processJobs: 1 (f=1): [r(1)][100。0%][r=8560KiB/s,w=0KiB/s][r=2140,w=0 IOPS][eta 00m:00s]disktest: (groupid=0, jobs=1): err= 0: pid=1417: Thu Nov 12 22:09:25 2020 read: IOPS=2151, BW=8606KiB/s (8812kB/s)(42。3MiB/5032msec) slat (usec): min=2, max=166, avg= 6。54, stdev= 3。69 clat (usec): min=794, max=157946, avg=59467。61, stdev=47971。33 lat (usec): min=799, max=157950, avg=59474。73, stdev=47971。03 clat percentiles (usec): | 1。00th=[ 1172], 5。00th=[ 1434], 10。00th=[ 1614], 20。00th=[ 1860], | 30。00th=[ 2147], 40。00th=[ 2999], 50。00th=[ 98042], 60。00th=[ 98042], | 70。00th=[ 99091], 80。00th=[ 99091], 90。00th=[ 99091], 95。00th=[100140], | 99。00th=[127402], 99。50th=[127402], 99。90th=[156238], 99。95th=[156238], | 99。99th=[158335] bw ( KiB/s): min= 8544, max= 8560, per=99。46%, avg=8558。40, stdev= 5。06, samples=10 iops : min= 2136, max= 2140, avg=2139。60, stdev= 1。26, samples=10 lat (usec) : 1000=0。16% lat (msec) : 2=25。15%, 4=15。13%, 10=0。03%, 50=0。59%, 100=56。23% lat (msec) : 250=2。71% cpu : usr=0。58%, sys=1。93%, ctx=1154, majf=0, minf=163 IO depths : 1=0。1%, 2=0。1%, 4=0。1%, 8=0。1%, 16=0。1%, 32=0。3%, >=64=99。4% submit : 0=0。0%, 4=100。0%, 8=0。0%, 16=0。0%, 32=0。0%, 64=0。0%, >=64=0。0% complete : 0=0。0%, 4=100。0%, 8=0。0%, 16=0。0%, 32=0。0%, 64=0。0%, >=64=0。1% issued rwts: total=10826,0,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100。00%, depth=128Run status group 0 (all jobs): READ: bw=8606KiB/s (8812kB/s), 8606KiB/s-8606KiB/s (8812kB/s-8812kB/s), io=42。3MiB (44。3MB), run=5032-5032msecDisk stats (read/write): vda: ios=10486/0, merge=0/1, ticks=614779/0, in_queue=485314, util=75。89%

iops平均達到2139。60,與高效雲盤標示的2120基本是一致。

也可以掛在動態硬碟進行測試, 不同的型別和儲存空間, IOPS是不一樣:

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

2。 物件儲存

Amazon S3 vs 阿里雲 OSS

Amazon S3,全稱亞馬遜簡易儲存服務(Amazon Simple Storage Service)

阿里雲 OSS(Object Storage Service,簡稱OSS),是阿里雲對外提供的海量、安全、低成本、高可靠的雲端儲存服務。

對比:

功能特性

Amazon S3

阿里雲OSS

儲存物件

物件

物件

物件ACL

支援

支援

最大物件大小

5T

48。8T

資料可靠性

99。999999999(11個9)

99。999999999(11個9)

物件元資料

元資料

物件元

物件生命週期管理

支援

支援

物件版本控制

支援

支援(可選)

更新事件通知

支援

支援

跨地域複製

支援

支援

物件追加寫入

不支援

支援

並行或分段上傳

支援

支援

高一致性

支援

支援

資料加密

在客戶端和服務端加密

在客戶端和服務端加密

請求協議

HTTP/HTTPS

HTTP/HTTPS/Bit Torrent

圖片處理

不支援

支援

物件儲存VS雲硬碟

提供介面訪問

物件儲存本質是一個網路化的服務, 雲硬碟是掛載到虛擬機器的虛擬硬碟,必須連線到虛擬機器才能操作。

儲存結構不一致

雲硬碟是一個可以作為一個真正的檔案系統, 而云儲存是一個近似鍵值(key和value)的儲存服務。

海量資料儲存

雲硬碟一般會受自身容量的限制, 不能支撐海量資料儲存, 物件儲存得益於其底層設計, 天生就能夠支撐大資料儲存。物件儲存服務不僅可以支援海量的小檔案, 也適合處理大型檔案。

實踐操作

流程:

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

開通OSS服務OSS產品詳情頁

建立儲存空間, Bucket名稱要具備唯一性。

開通對應的訪問許可權

不要採用主賬號,會存在安全隱患, 授權給RAM使用者。

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

新增依賴

com。aliyun。oss aliyun-sdk-oss 3。10。2

上傳檔案

UploadApplication:

public class UploadApplication { public static void main(String[] args) throws Exception{ // 建立OSSClient例項。 OSS ossClient = new OSSClientBuilder()。build(Constants。endpoint, Constants。accessKeyId, Constants。accessKeySecret); // 建立PutObjectRequest物件。 PutObjectRequest putObjectRequest = new PutObjectRequest(Constants。bucketName, “readme”, new File(“d:/readme。txt”)); // 上傳檔案。 PutObjectResult result = ossClient。putObject(putObjectRequest); System。out。println(“upload complete。”); // 關閉OSSClient。 ossClient。shutdown(); }}

下載檔案

DownloadApplication:

public class DownloadApplication { public static void main(String[] args) { // Endpoint以杭州為例,其它Region請按實際情況填寫。 String endpoint = Constants。endpoint; // 阿里雲主賬號AccessKey擁有所有API的訪問許可權,風險很高。強烈建議您建立並使用RAM賬號進行API訪問或日常運維,請登入 https://ram。console。aliyun。com 建立RAM賬號。 String accessKeyId = Constants。accessKeyId; String accessKeySecret = Constants。accessKeySecret; String bucketName = Constants。bucketName; String objectName = “readme”; // 建立OSSClient例項。 OSS ossClient = new OSSClientBuilder()。build(endpoint, accessKeyId, accessKeySecret); // 下載OSS檔案到本地檔案。如果指定的本地檔案存在會覆蓋,不存在則新建。 ossClient。getObject(new GetObjectRequest(bucketName, objectName), new File(“e:/”+ objectName)); // 關閉OSSClient。 ossClient。shutdown(); System。out。println(“download complete。”); }}

3。 表單上傳案例

應用場景

表單上傳非常適合嵌入在HTML網頁中來上傳Object,比較常見的場景是網站應用,以招聘網站為例, 流程比對:

不使用表單上傳

網站使用者上傳簡歷。

網站伺服器迴應上傳頁面。

簡歷被上傳到網站伺服器。

網站伺服器再將簡歷上傳到OSS。

採用表單上傳

網站使用者上傳簡歷。

網站伺服器迴應上傳頁面。

簡歷上傳到OSS。

使用表單上傳,少了一步轉發流程, 並且在上傳量過大時, 減少了業務應用方服務擴容的壓力。

透過STS臨時授權訪問OSS

透過阿里雲STS(Security Token Service)進行臨時授權訪問, 可以為第三方應用頒發一個自定義時效和許可權的訪問憑證, 用以保障服務安全性(類似於OAuth2的授權碼訪問模式)。

實現機制:

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

RAM使用者STS授權配置

進入RAM訪問控制後臺->使用者->新增許可權, 輸入框填寫“sts”過濾, 選擇

AliyunSTSAssumeRoleAccess

許可權。

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

建立許可權策略

輸入許可權策略名稱, 可以選擇指令碼配置, 更為靈活。

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

策略內容:

{ “Version”: “1”, “Statement”: [ { “Effect”: “Allow”, “Action”: [ “oss:*” ], “Resource”: [ “acs:oss:*:*:cloudstorage-test”, “acs:oss:*:*:cloudstorage-test/*” ] } ]}

意思是對名稱為cloudstorage-test的Bucket具有完全控制權限。如果更細力度的控制, 可以修改Action,例如:

“Action”: [ “oss:ListBuckets”, “oss:GetBucketStat”, “oss:GetBucketInfo”, “oss:GetBucketTagging”, “oss:GetBucketAcl” ],

建立訪問角色

開啟“RAM角色管理”,點選“建立RAM角色“,可信實體型別選擇“阿里雲賬號”

接下來輸入角色名稱, 選擇當前雲賬號;新增上面所建立的許可權策略“oss_access”。

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

配置完成後, 會生成一個ARN值, 需要將它記錄下來。

申請STS的訪問TOKEN資訊

StsServiceApplication程式碼:

public class StsServiceApplication { public static void main(String[] args) { String endpoint = ”sts。cn-beijing。aliyuncs。com“; String AccessKeyId = Constants。accessKeyId; String accessKeySecret = Constants。accessKeySecret; String roleArn = ”acs:ram::1567235516853620:role/ram-oss-access“; String roleSessionName = ”oss_access_session“; String policy = ”{\n“ + ” \“Version\”: \“1\”, \n“ + ” \“Statement\”: [\n“ + ” {\n“ + ” \“Action\”: [\n“ + ” \“oss:*\”\n“ + ” ], \n“ + ” \“Resource\”: [\n“ + ” \“acs:oss:*:*:*\” \n“ + ” ], \n“ + ” \“Effect\”: \“Allow\”\n“ + ” }\n“ + ” ]\n“ + ”}“; try { // 新增endpoint(直接使用STS endpoint,前兩個引數留空,無需新增region ID) DefaultProfile。addEndpoint(”“, ”“, ”Sts“, endpoint); // 構造default profile(引數留空,無需新增region ID) IClientProfile profile = DefaultProfile。getProfile(”“, AccessKeyId, accessKeySecret); // 用profile構造client DefaultAcsClient client = new DefaultAcsClient(profile); final AssumeRoleRequest request = new AssumeRoleRequest(); request。setMethod(MethodType。POST); request。setRoleArn(roleArn); request。setRoleSessionName(roleSessionName); request。setPolicy(policy); // 若policy為空,則使用者將獲得該角色下所有許可權 request。setDurationSeconds(1000L); // 設定憑證有效時間 final AssumeRoleResponse response = client。getAcsResponse(request); System。out。println(”Expiration: “ + response。getCredentials()。getExpiration()); System。out。println(”Access Key Id: “ + response。getCredentials()。getAccessKeyId()); System。out。println(”Access Key Secret: “ + response。getCredentials()。getAccessKeySecret()); System。out。println(”Security Token: “ + response。getCredentials()。getSecurityToken()); System。out。println(”RequestId: “ + response。getRequestId()); } catch (ClientException e) { System。out。println(”Failed:“); System。out。println(”Error code: “ + e。getErrCode()); System。out。println(”Error message: “ + e。getErrMsg()); System。out。println(”RequestId: “ + e。getRequestId()); } }}

返回結果:

Expiration: 2020-11-15T06:37:51ZAccess Key Id: STS。NT2Mshx5eaKbLScAzcwXLLK5VAccess Key Secret: 7buxRohgRr6vT1EVAqq4FWjxaUFRQMuC4vvV55utenkJSecurity Token: CAISjwJ1q6Ft5B2yfSjIr5eHBsnclepE1omJTnXSpXo2e9dgo46etDz2IHxMenFgA+sfv/0ynGBR5/YSlrt0UIRyTEfPYNBr2Y9a6higZIyZdz4iUQhC2vOfAmG2J0PR7q27OpfELr70fvOqdCqz9Etayqf7cjOPRkGsNYbz57dsctUQWHvXD1dBH8wEZHEhyqkgOGDWKOymPzPzn2PUFzAIgAdnjn5l4qnNpa/54xHF3lrh0b1X9cajYLrcNpQyY80kDorsgrwrLfSbiBQ9sUYaqP1E64Vf4irCs92nBF1c3g6LKeK88Kc0cFcnPvhgQPcV9aWkxaQp6rzJ8Z7+zlNKJvoQWi/USZu70Fd2+ykG8lpTGoABiIGFt+WCBkX/yLkY3uHDiWq4Uud32DzXWQAQpGmOWXwYzPRepi0XCcC029hPoXwCsj6mWbd/Ls2bUQsLUPtG3ozr6WawG2XUBXgZI5dNip8dZJCWZSet9qGsNXubhA3hTC+Wi7MNOariEkmr1kjqnG6N/YNaWuMYJ3BUobvLL4g=RequestId: 480E0B98-ACA5-4C98-AA82-6D9901CD7EE4

表單上傳

FormPostApplication程式碼:

public class FormPostApplication { // The local file path to upload。 private String localFilePath = ”d:/trade_stock。sql“; // OSS domain, such as http://oss-cn-hangzhou。aliyuncs。com private String endpoint = Constants。endpoint; // Access key Id。 Please get it from https://ak-console。aliyun。com private String accessKeyId = ”STS。NTcqigyooFzFUeV2GRZPWDLt8“; private String accessKeySecret = ”HwdZYJ8wVUopdNscwDYFf7oPgBpA4WXgG6K4JggztqW9“; private String oss_security_token= ”CAISjwJ1q6Ft5B2yfSjIr5fWOtPTlLBO8bitV0Pn1kcHVt97q4nf2jz2IHxMenFgA+sfv/0ynGBR5/YSlrt0UIRyTEfPYNBr2Y9a6higZIyZW2tYUAhC2vOfAmG2J0PR7q27OpfELr70fvOqdCqz9Etayqf7cjOPRkGsNYbz57dsctUQWHvXD1dBH8wEZHEhyqkgOGDWKOymPzPzn2PUFzAIgAdnjn5l4qnNpa/54xHF3lrh0b1X9cajYLrcNpQyY80kDorsgrwrLfSbiBQ9sUYaqP1E64Vf4irCs92nBF1c3g6LKeK88Kc0cFcnPvhgQPcV9aWkxaQp6rzJ8Z7+zlNKJvoQWi/USZu70Fd2+ykG8lpTGoABUJly6VzNT0fNrAW2uTyuuGX+PI/PaV7df5cewy7WoAnvtjDe0PM8vBWuD6zY3dQFgQOPFkY8RxxQUrSkZ9wpS3E7FBjzTfkFGlRHmmc+ad8uCLPaWIb/B9QGI6uKidSXnEnLqcK+8xsB1HBsyCkL600PJfcuSWBs9CHh9uiJTG0=“; // The existing bucket name private String bucketName = Constants。bucketName; // The key name for the file to upload。 private String key = ”trade_stock“; private void postObject() throws Exception { // append the ‘bucketname。’ prior to the domain, such as http://bucket1。oss-cn-hangzhou。aliyuncs。com。 String urlStr = endpoint。replace(”http://“, ”http://“ + bucketName + ”。“); // form fields Map formFields = new LinkedHashMap(); // key formFields。put(”key“, this。key); // Content-Disposition formFields。put(”Content-Disposition“, ”attachment;filename=“ + localFilePath); // OSSAccessKeyId formFields。put(”OSSAccessKeyId“, accessKeyId); // policy String policy = ”{\“expiration\”: \“2120-01-01T12:00:00。000Z\”,\“conditions\”: [[\“content-length-range\”, 0, 104857600]]}“; String encodePolicy = new String(Base64。encodeBase64(policy。getBytes())); formFields。put(”policy“, encodePolicy); // Signature String signaturecom = computeSignature(accessKeySecret, encodePolicy); formFields。put(”Signature“, signaturecom); // Set security token。 formFields。put(”x-oss-security-token“, oss_security_token); String ret = formUpload(urlStr, formFields, localFilePath); System。out。println(”Post Object [“ + this。key + ”] to bucket [“ + bucketName + ”]“); System。out。println(”post reponse:“ + ret); } private static String computeSignature(String accessKeySecret, String encodePolicy) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException { // convert to UTF-8 byte[] key = accessKeySecret。getBytes(”UTF-8“); byte[] data = encodePolicy。getBytes(”UTF-8“); // hmac-sha1 Mac mac = Mac。getInstance(”HmacSHA1“); mac。init(new SecretKeySpec(key, ”HmacSHA1“)); byte[] sha = mac。doFinal(data); // base64 return new String(Base64。encodeBase64(sha)); } private static String formUpload(String urlStr, Map formFields, String localFile) throws Exception { String res = ”“; HttpURLConnection conn = null;// String boundary = ”9431149156168“; String boundary = ”abc“; try { URL url = new URL(urlStr); conn = (HttpURLConnection)url。openConnection(); conn。setConnectTimeout(5000); conn。setReadTimeout(30000); conn。setDoOutput(true); conn。setDoInput(true); conn。setRequestMethod(”POST“); conn。setRequestProperty(”User-Agent“, ”Mozilla/5。0 (Windows; U; Windows NT 6。1; zh-CN; rv:1。9。2。6)“); // Set Content-MD5。 The MD5 value is calculated based on the whole message body。// conn。setRequestProperty(”Content-MD5“, ”“); conn。setRequestProperty(”Content-Type“, ”multipart/form-data; boundary=“ + boundary); OutputStream out = new DataOutputStream(conn。getOutputStream()); // text if (formFields != null) { StringBuffer strBuf = new StringBuffer(); Iterator> iter = formFields。entrySet()。iterator(); int i = 0; while (iter。hasNext()) { Entry entry = iter。next(); String inputName = entry。getKey(); String inputValue = entry。getValue(); if (inputValue == null) { continue; } if (i == 0) { strBuf。append(”——“)。append(boundary)。append(”\r\n“); strBuf。append(”Content-Disposition: form-data; name=\“” + inputName + “\”\r\n\r\n“); strBuf。append(inputValue); } else { strBuf。append(”\r\n“)。append(”——“)。append(boundary)。append(”\r\n“); strBuf。append(”Content-Disposition: form-data; name=\“” + inputName + “\”\r\n\r\n“); strBuf。append(inputValue); } i++; } out。write(strBuf。toString()。getBytes()); } // file File file = new File(localFile); String filename = file。getName(); String contentType = new MimetypesFileTypeMap()。getContentType(file); if (contentType == null || contentType。equals(”“)) { contentType = ”application/octet-stream“; } StringBuffer strBuf = new StringBuffer(); strBuf。append(”\r\n“)。append(”——“)。append(boundary) 。append(”\r\n“); strBuf。append(”Content-Disposition: form-data; name=\“file\”; “ + ”filename=\“” + filename + “\”\r\n“); strBuf。append(”Content-Type: “ + contentType + ”\r\n\r\n“); out。write(strBuf。toString()。getBytes()); DataInputStream in = new DataInputStream(new FileInputStream(file)); int bytes = 0; byte[] bufferOut = new byte[1024]; while ((bytes = in。read(bufferOut)) != -1) { out。write(bufferOut, 0, bytes); } in。close(); byte[] endData = (”\r\n——“ + boundary + ”——\r\n“)。getBytes(); out。write(endData); out。flush(); out。close(); // Gets the file data strBuf = new StringBuffer(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn。getInputStream())); String line = null; while ((line = reader。readLine()) != null) { strBuf。append(line)。append(”\n“); } res = strBuf。toString(); reader。close(); reader = null; } catch (Exception e) { System。err。println(”Send post request exception: “ + e); throw e; } finally { if (conn != null) { conn。disconnect(); conn = null; } } return res; } public static void main(String[] args) throws Exception { FormPostApplication ossPostObject = new FormPostApplication(); ossPostObject。postObject(); }}

將上面所獲取的key,secret和token填入。

bucket名稱要和上面授權對應的bucket一致。

這裡是模擬form表單提交,編碼採用UTF-8。

policy裡面可以配置超時時間, 內容長度範圍等。

如果出現403錯誤,檢查token等許可權資訊的配置是否正確。

如果出現400錯誤, 檢查引數配置是否正確, 比如說MD5引數如果傳遞, 但沒配置正確, 會出現此錯誤。

conn。setRequestProperty(”Content-MD5“, ”“);

操作成功後, 能夠在後臺看到對應的檔案資訊。

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

4。 服務上傳驗證

程式碼:

新增阿里雲依賴。

新增阿里雲配置資訊。

採用表單方式上傳, 直接將資料存至OSS服務中。實現類: FormFileUploadServiceImpl。

打包app-file服務

maven clean install

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

上傳至雲伺服器

執行:

java -jar app-file。jar

功能驗證

對檔案上傳和下載進行驗證。

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

5。 雲資料庫

雲資料庫 VS 傳統資料庫

雲資料庫和傳統資料庫在搭建、運維、管理層面,雲資料庫提升了一個層次,實現了較高程度的智慧化和自動化,極大地提升了使用者友好度,降低了使用門檻。比如靈活的效能等級調整、詳盡的監控體系、攻擊防護機制等等。

雲資料庫的高階特性:

讀寫分離

提供視覺化的讀寫分離配置管理功能。從資料庫例項的建立, 到同步關係以及讀寫流量分發, 雲資料庫都能自動化完成。

![file](http://cloudstorage-test。oss-cn-beijing。aliyuncs。com/image-1628230727165。png)

自動調優

雲資料庫都自帶效能分析和改進的模組, 能夠自動地發現效能熱點,還能夠智慧地給出調整建議,比如進行個別語句的調整,新增額外的索引等等。雲資料庫的效能分析和自動調優的能力,是將生產執行資料和服務內建的 AI 模型進行了結合,做到了真正的智慧化運維, 極大的節省了成本。

阿里雲的資料庫自治服務DAS:

自治服務DAS是一種基於機器學習和專家經驗實現資料庫自感知、自修復、自最佳化、自運維及自安全的雲服務,使用了DAS之後您可以避免這樣的複雜性和人工操作引起的故障,有效保障資料庫服務的穩定、安全及高效。

![file](http://cloudstorage-test。oss-cn-beijing。aliyuncs。com/image-1628230737868。png)

監控維護

雲資料庫提供了全面強大的監控維護功能, 提供了豐富的效能監控項,能夠及時發現並預警。

![file](http://cloudstorage-test。oss-cn-beijing。aliyuncs。com/image-1628230749023。png)

監控包含CPU和記憶體使用率、磁碟空間、IOPS、連線數、CPU記憶體使用率和網路流量等。

報警功能:

![file](http://cloudstorage-test。oss-cn-beijing。aliyuncs。com/image-1628230762598。png)

可以根據不同的規則來組合設定預警條件:

![file](http://cloudstorage-test。oss-cn-beijing。aliyuncs。com/image-1628230774697。png)

6。 雲資料庫操作

建立雲資料庫例項

根據自身需要, 選擇相應配置:

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

訪問許可權配置

申請外網訪問地址:

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

這裡提供了內網和外網不同訪問地址。

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

需要設定白名單, 0。0。0。0/0是允許所有主機訪問, 在實際應用中, 最好要指定具體的IP。

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

hdm_security_ips是DAS服務白名單, 自動生成。

資料庫賬號配置

建立訪問資料庫的賬號密碼。

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

服務授權標籤可以開通配置許可權與資料許可權。

連線配置

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

SQL洞察

連入資料庫後, 做一些SQL操作, 透過SQL洞察就能看到詳細的資訊:

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

全量SQL統計

這裡面會側重效能分析, 並給出自動最佳化提示。

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

7。 服務連線雲資料庫

程式碼

編寫下單與查詢訂單的介面。

配置資料來源連線, 指向雲資料庫。

採用JPA方式對資料進行操作。

修改連線配置

修改application。yml配置檔案:

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

服務打包

maven clean install

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

上傳至雲伺服器

執行:

java -jar app-server。jar

功能驗證

測試資料庫的新增與查詢功能。

新增: http://47。104。9。75:10692/addOrder?accountNo=1&execPrice=2

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

查詢:http://47。104。9。75:10692/getAllOrders

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

8。 新一代原生資料庫

新一代原生資料庫 VS 雲資料庫

更強的效能與擴充套件性

雲原生資料庫由於原生設計, 專門為雲設計的專業化儲存架構, 可以支撐更大規模的資料量,關係型雲原生資料庫能夠脫離典型的數 TB 的容量上限,達到單庫數十 TB 甚至百 TB 的級別。

雲原生資料庫可以利用雲快速地進行水平擴充套件,迅速調整、提升資料庫的處理能力, 能夠有效應對高併發場景。

更高的可用性與可靠性

雲原生資料庫預設就具備多副本高可用的,資料同步、讀寫分離等高階特性,比如Amazon Aurora雲原生資料庫, 就自動包含了分佈在 3 個可用區、多達 6 份的資料副本。

對於多種資料模型也有很好的支援, 除了相容關係型資料庫外, 還會推出適合不同形態和查詢正規化的雲資料庫,與 NoSQL 資料庫形成競爭, 比如說AWS的圖資料庫 Neptune,Azure Cosmos DB的NoSQL 資料庫服務。

低成本與易維護性

大部分雲原生資料庫, 在儲存上不需要預先設定大小, 會隨著儲存佔用自動擴充套件;在計算上, 也有部分雲資料庫推出了無伺服器版本,比如 亞馬遜 的 Aurora Serverless,在面對間歇偶發性工作負載時,都能節省較多的成本。

阿里雲PolarDB

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

阿里雲 PolarDB 放棄了通用分散式資料庫OLTP多路併發寫的支援,採用一寫多讀的架構設計,儲存與計算分離的技術架構,簡化了分散式系統難以兼顧的理論模型,又能滿足絕大多數OLTP的應用場景和效能要求。

PolarDB 的設計革新:

透過重新設計特定的檔案系統來存取 Redo log 這種特定的 WAL I/O 資料。

透過高速網路和高效協議將資料庫檔案和 Redo log 檔案放在共享儲存裝置上,避免了多次長路徑 I/O 的重複操作,並且針對 Redolog的I/O 路徑,專門設計了多副本共享儲存塊裝置。

產品架構設計

基於阿里雲的基礎架構設施保障(二)IAAS雲端儲存

一寫多讀

主節點處理讀寫請求,只讀節點僅處理讀請求。一個叢集版叢集包含一個主節點和最多15個只讀節點。

計算與儲存分離

計算與儲存分離的設計,計算節點僅儲存元資料, 儲存節點負責資料檔案、Redo Log等儲存。

共享分散式儲存

多個計算節點共享一份資料,並非每個計算節點都儲存一份資料, 降低儲存成本。儲存節點的資料採用多副本形式,確保資料的可靠性,並透過Parallel-Raft協議保證資料一致性。基於全新設計的分散式塊儲存和檔案系統,儲存容量可以線上平滑擴充套件。

POLARDB 2。0 vs POLARDB 1。0

PolarDB-X 1。0 是基於DRDS + RDS 的分散式雲資料庫服務, 產品的特徵是採用 Share-Nothing 架構、以解決儲存擴充套件性為出發點、提供面向使用者的產品化交付能力。

PolarDB-X 2。0 主要是解決企業的各種複雜需求:

在功能性方面, 既要保障SQL通用性, 又要具備NoSQL的擴充套件性;既要高併發, 又要支援實時複雜分析。

企業的歷史沉澱資料是一大痛點, 要以最少的成本保障資料能夠順利穩定的遷移, 並且不影響現有服務的穩定性。

各種應用對GIS資料的處理需求會越來越旺盛,使用開源版本GIS效能、功能無法滿足,需要有一個功能強大的儲存介質。

海量資料的運維管理, 高階DBA非常欠缺,在維護方面需要高昂的成本。

針對以上問題, POLARDB2。0應運而生,不但完全繼承了1。0的架構體系,同時相容了另外兩個流行資料庫Oracle與PostgreSQL。POLARDBv2。0forOracle,高度相容Oracle;POLARDBv2。0 for PostgreSQL,完全相容PostgreSQL。

本文由mirson創作分享, 歡迎關注, 謝謝