基于阿里云的基础架构设施保障(二)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 fioiops測試
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=libaio disktest: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=128 fio-3.7 Starting 1 process Jobs: 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 2020read: IOPS=2151, BW=8606KiB/s (8812kB/s)(42.3MiB/5032msec)slat (usec): min=2, max=166, avg= 6.54, stdev= 3.69clat (usec): min=794, max=157946, avg=59467.61, stdev=47971.33lat (usec): min=799, max=157950, avg=59474.73, stdev=47971.03clat 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=10iops : min= 2136, max= 2140, avg=2139.60, stdev= 1.26, samples=10lat (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=163IO 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,0latency : 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是不一樣:
2. 對象存儲
Amazon S3 vs 阿里云 OSS
Amazon S3,全稱亞馬遜簡易存儲服務(Amazon Simple Storage Service)
阿里云 OSS(Object Storage Service,簡稱OSS),是阿里云對外提供的海量、安全、低成本、高可靠的云存儲服務。
對比:
| 存儲對象 | 對象 | 對象 |
| 對象ACL | 支持 | 支持 |
| 最大對象大小 | 5T | 48.8T |
| 數據可靠性 | 99.999999999(11個9) | 99.999999999(11個9) |
| 對象元數據 | 元數據 | 對象元 |
| 對象生命周期管理 | 支持 | 支持 |
| 對象版本控制 | 支持 | 支持(可選) |
| 更新事件通知 | 支持 | 支持 |
| 跨地域復制 | 支持 | 支持 |
| 對象追加寫入 | 不支持 | 支持 |
| 并行或分段上傳 | 支持 | 支持 |
| 高一致性 | 支持 | 支持 |
| 數據加密 | 在客戶端和服務端加密 | 在客戶端和服務端加密 |
| 請求協議 | HTTP/HTTPS | HTTP/HTTPS/Bit Torrent |
| 圖片處理 | 不支持 | 支持 |
對象存儲VS云硬盤
提供接口訪問
對象存儲本質是一個網絡化的服務, 云硬盤是掛載到虛擬機的虛擬硬盤,必須連接到虛擬機才能操作。
存儲結構不一致
云硬盤是一個可以作為一個真正的文件系統, 而云存儲是一個近似鍵值(key和value)的存儲服務。
海量數據存儲
云硬盤一般會受自身容量的限制, 不能支撐海量數據存儲, 對象存儲得益于其底層設計, 天生就能夠支撐大數據存儲。對象存儲服務不僅可以支持海量的小文件, 也適合處理大型文件。
實踐操作
流程:
開通OSS服務OSS產品詳情頁
創建存儲空間, Bucket名稱要具備唯一性。
開通對應的訪問權限
不要采用主賬號,會存在安全隱患, 授權給RAM用戶。
添加依賴
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version> </dependency>上傳文件
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。
采用表單上傳
使用表單上傳,少了一步轉發流程, 并且在上傳量過大時, 減少了業務應用方服務擴容的壓力。
通過STS臨時授權訪問OSS
通過阿里云STS(Security Token Service)進行臨時授權訪問, 可以為第三方應用頒發一個自定義時效和權限的訪問憑證, 用以保障服務安全性(類似于OAuth2的授權碼訪問模式)。
實現機制:
RAM用戶STS授權配置
進入RAM訪問控制后臺->用戶->添加權限, 輸入框填寫"sts"過濾, 選擇AliyunSTSAssumeRoleAccess權限。
創建權限策略
輸入權限策略名稱, 可以選擇腳本配置, 更為靈活。
策略內容:
{"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”。
配置完成后, 會生成一個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構造clientDefaultAcsClient 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:51Z Access Key Id: STS.NT2Mshx5eaKbLScAzcwXLLK5V Access Key Secret: 7buxRohgRr6vT1EVAqq4FWjxaUFRQMuC4vvV55utenkJ Security 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.comprivate String endpoint = Constants.endpoint;// Access key Id. Please get it from https://ak-console.aliyun.comprivate 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 nameprivate 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 fieldsMap<String, String> formFields = new LinkedHashMap<String, String>();// keyformFields.put("key", this.key);// Content-DispositionformFields.put("Content-Disposition", "attachment;filename="+ localFilePath);// OSSAccessKeyIdformFields.put("OSSAccessKeyId", accessKeyId);// policyString 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);// SignatureString 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-8byte[] key = accessKeySecret.getBytes("UTF-8");byte[] data = encodePolicy.getBytes("UTF-8");// hmac-sha1Mac mac = Mac.getInstance("HmacSHA1");mac.init(new SecretKeySpec(key, "HmacSHA1"));byte[] sha = mac.doFinal(data);// base64return new String(Base64.encodeBase64(sha));}private static String formUpload(String urlStr, Map<String, String> 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", "<yourContentMD5>");conn.setRequestProperty("Content-Type","multipart/form-data; boundary=" + boundary);OutputStream out = new DataOutputStream(conn.getOutputStream());// textif (formFields != null) {StringBuffer strBuf = new StringBuffer();Iterator<Entry<String, String>> iter = formFields.entrySet().iterator();int i = 0;while (iter.hasNext()) {Entry<String, String> 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());}// fileFile 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 datastrBuf = 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", "<yourContentMD5>");操作成功后, 能夠在后臺看到對應的文件信息。
4. 服務上傳驗證
代碼:
添加阿里云依賴。
添加阿里云配置信息。
采用表單方式上傳, 直接將數據存至OSS服務中。實現類: FormFileUploadServiceImpl。
打包app-file服務
maven clean install
上傳至云服務器
運行:
java -jar app-file.jar功能驗證
對文件上傳和下載進行驗證。
5. 云數據庫
云數據庫 VS 傳統數據庫
云數據庫和傳統數據庫在搭建、運維、管理層面,云數據庫提升了一個層次,實現了較高程度的智能化和自動化,極大地提升了用戶友好度,降低了使用門檻。比如靈活的性能等級調整、詳盡的監控體系、攻擊防護機制等等。
云數據庫的高級特性:
讀寫分離
提供可視化的讀寫分離配置管理功能。從數據庫實例的創建, 到同步關系以及讀寫流量分發, 云數據庫都能自動化完成。
自動調優
云數據庫都自帶性能分析和改進的模塊, 能夠自動地發現性能熱點,還能夠智能地給出調整建議,比如進行個別語句的調整,添加額外的索引等等。云數據庫的性能分析和自動調優的能力,是將生產運行數據和服務內置的 AI 模型進行了結合,做到了真正的智能化運維, 極大的節省了成本。
阿里云的數據庫自治服務DAS:
自治服務DAS是一種基于機器學習和專家經驗實現數據庫自感知、自修復、自優化、自運維及自安全的云服務,使用了DAS之后您可以避免這樣的復雜性和人工操作引起的故障,有效保障數據庫服務的穩定、安全及高效。
監控維護
云數據庫提供了全面強大的監控維護功能, 提供了豐富的性能監控項,能夠及時發現并預警。
監控包含CPU和內存使用率、磁盤空間、IOPS、連接數、CPU內存使用率和網絡流量等。
報警功能:
可以根據不同的規則來組合設定預警條件:

6. 云數據庫操作
創建云數據庫實例
根據自身需要, 選擇相應配置:
訪問權限配置
申請外網訪問地址:
這里提供了內網和外網不同訪問地址。
需要設定白名單, 0.0.0.0/0是允許所有主機訪問, 在實際應用中, 最好要指定具體的IP。
hdm_security_ips是DAS服務白名單, 自動生成。
數據庫賬號配置
創建訪問數據庫的賬號密碼。
服務授權標簽可以開通配置權限與數據權限。
連接配置
SQL洞察
連入數據庫后, 做一些SQL操作, 通過SQL洞察就能看到詳細的信息:
全量SQL統計
這里面會側重性能分析, 并給出自動優化提示。
7. 服務連接云數據庫
代碼
- 編寫下單與查詢訂單的接口。
- 配置數據源連接, 指向云數據庫。
- 采用JPA方式對數據進行操作。
修改連接配置
修改application.yml配置文件:
服務打包
maven clean install
上傳至云服務器
運行:
java -jar app-server.jar功能驗證
測試數據庫的新增與查詢功能。
新增: http://47.104.9.75:10692/addOrder?accountNo=1&execPrice=2
查詢:http://47.104.9.75:10692/getAllOrders
8. 新一代原生數據庫
新一代原生數據庫 VS 云數據庫
更強的性能與擴展性
云原生數據庫由于原生設計, 專門為云設計的專業化存儲架構, 可以支撐更大規模的數據量,關系型云原生數據庫能夠脫離典型的數 TB 的容量上限,達到單庫數十 TB 甚至百 TB 的級別。
云原生數據庫可以利用云快速地進行水平擴展,迅速調整、提升數據庫的處理能力, 能夠有效應對高并發場景。
更高的可用性與可靠性
云原生數據庫默認就具備多副本高可用的,數據同步、讀寫分離等高級特性,比如Amazon Aurora云原生數據庫, 就自動包含了分布在 3 個可用區、多達 6 份的數據副本。
對于多種數據模型也有很好的支持, 除了兼容關系型數據庫外, 還會推出適合不同形態和查詢范式的云數據庫,與 NoSQL 數據庫形成競爭, 比如說AWS的圖數據庫 Neptune,Azure Cosmos DB的NoSQL 數據庫服務。
低成本與易維護性
大部分云原生數據庫, 在存儲上不需要預先設置大小, 會隨著存儲占用自動擴展;在計算上, 也有部分云數據庫推出了無服務器版本,比如 亞馬遜 的 Aurora Serverless,在面對間歇偶發性工作負載時,都能節省較多的成本。
阿里云PolarDB
阿里云 PolarDB 放棄了通用分布式數據庫OLTP多路并發寫的支持,采用一寫多讀的架構設計,存儲與計算分離的技術架構,簡化了分布式系統難以兼顧的理論模型,又能滿足絕大多數OLTP的應用場景和性能要求。
PolarDB 的設計革新:
產品架構設計
一寫多讀
主節點處理讀寫請求,只讀節點僅處理讀請求。一個集群版集群包含一個主節點和最多15個只讀節點。
計算與存儲分離
計算與存儲分離的設計,計算節點僅存儲元數據, 存儲節點負責數據文件、Redo Log等存儲。
共享分布式存儲
多個計算節點共享一份數據,并非每個計算節點都存儲一份數據, 降低存儲成本。存儲節點的數據采用多副本形式,確保數據的可靠性,并通過Parallel-Raft協議保證數據一致性。基于全新設計的分布式塊存儲和文件系統,存儲容量可以在線平滑擴展。
POLARDB 2.0 vs POLARDB 1.0
PolarDB-X 1.0 是基于DRDS + RDS 的分布式云數據庫服務, 產品的特征是采用 Share-Nothing 架構、以解決存儲擴展性為出發點、提供面向用戶的產品化交付能力。
PolarDB-X 2.0 主要是解決企業的各種復雜需求:
針對以上問題, POLARDB2.0應運而生,不但完全繼承了1.0的架構體系,同時兼容了另外兩個流行數據庫Oracle與PostgreSQL。POLARDBv2.0forOracle,高度兼容Oracle;POLARDBv2.0 for PostgreSQL,完全兼容PostgreSQL。
本文由mirson創作分享,如需進一步交流,請加QQ群:19310171或訪問www.softart.cn
總結
以上是生活随笔為你收集整理的基于阿里云的基础架构设施保障(二)IAAS云存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WDF VIOLATION 你的电脑遇到
- 下一篇: MediaCoder压缩参数设置