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-yinstallfio
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=128:1(f=1):[r(1)][100.0%][r=8560KiB/s,w=0KiB/s][r=2140,w=0IOPS][eta00m:00s]disktest:(groupid=0,jobs=1):err=0:pid=1417:ThuNov1222:09:252020read: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.03clatpercentiles(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=163IOdepths: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%issuedrwts:total=10826,0,0,0short=0,0,0,0dropped=0,0,0,0latency:target=0,window=0,percentile=100.00%,depth=128Runstatusgroup0(alljobs):READ:bw=8606KiB/s(8812kB/s),8606KiB/s-8606KiB/s(8812kB/s-8812kB/s),io=42.3MiB(44.3MB),run=5032-5032msecDiskstats(read/write):vda:ios=10486/0,merge=0/1,ticks=614779/0,in_queue=485314,util=75.89%
iops平均达到2139.60,与高效云盘标示的2120基本是一致。
也可以挂在动态硬盘进行测试,不同的类型和存储空间,IOPS是不一样:

AmazonS3vs阿里云OSS
AmazonS3,全称亚马逊简易存储服务(AmazonSimpleStorageService)
阿里云OSS(ObjectStorageService,简称OSS),是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务。
对比:
功能特性AmazonS3阿里云OSS存储对象对象对象对象ACL支持支持最大对象大小5T48.8T数据可靠性99.999999999(11个9)99.999999999(11个9)对象元数据元数据对象元对象生命周期管理支持支持对象版本控制支持支持(可选)更新事件通知支持支持跨地域复制支持支持对象追加写入不支持支持并行或分段上传支持支持高一致性支持支持数据加密在客户端和服务端加密在客户端和服务端加密请求协议HTTP/HTTPSHTTP/HTTPS/BitTorrent图片处理不支持支持对象存储VS云硬盘
提供接口访问
对象存储本质是一个网络化的服务,云硬盘是挂载到虚拟机的虚拟硬盘,必须连接到虚拟机才能操作。
存储结构不一致
云硬盘是一个可以作为一个真正的文件系统,而云存储是一个近似键值(key和value)的存储服务。
海量数据存储
云硬盘一般会受自身容量的限制,不能支撑海量数据存储,对象存储得益于其底层设计,天生就能够支撑大数据存储。对象存储服务不仅可以支持海量的小文件,也适合处理大型文件。
实践操作
流程:

开通OSS服务OSS产品详情页
创建存储空间,Bucket名称要具备唯一性。
开通对应的访问权限
不要采用主账号,会存在安全隐患,授权给RAM用户。
添加依赖
/groupIdartifactIdaliyun-sdk-oss//version/depency
上传文件
UploadApplication:
publicclassUploadApplication{publicstaticvoidmain(String[]args)throwsException{//创建OSSClient实例。OSSossClient=newOSSClientBuilder().build(,,);//创建PutObjectRequest对象。PutObjectRequestputObjectRequest=newPutObjectRequest(,"readme",newFile("d:/"));//上传文件。PutObjectResultresult=(putObjectRequest);("uploadcomplete.");//关闭OSSClient。();}}下载文件
DownloadApplication:
publicclassDownloadApplication{publicstaticvoidmain(String[]args){//point以杭州为例,其它Region请按实际情况填写。Stringpoint=;//阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录。StringaccessKeyId=;StringaccessKeySecret=;StringbucketName=;StringobjectName="readme";//创建OSSClient实例。OSSossClient=newOSSClientBuilder().build(point,accessKeyId,accessKeySecret);//下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。(newGetObjectRequest(bucketName,objectName),newFile("e:/"+objectName));//关闭OSSClient。();("downloadcomplete.");}}3.表单上传案例应用场景
表单上传非常适合嵌入在HTML网页中来上传Object,比较常见的场景是网站应用,以招聘网站为例,流程比对:
不使用表单上传
网站用户上传简历。
网站服务器回应上传页面。
简历被上传到网站服务器。
网站服务器再将简历上传到OSS。
采用表单上传
网站用户上传简历。
网站服务器回应上传页面。
简历上传到OSS。
使用表单上传,少了一步转发流程,并且在上传量过大时,减少了业务应用方服务扩容的压力。
通过STS临时授权访问OSS
通过阿里云STS(SecurityTokenService)进行临时授权访问,可以为第三方应用颁发一个自定义时效和权限的访问凭证,用以保障服务安全性(类似于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,例如:
创建访问角色
接下来输入角色名称,选择当前云账号;添加上面所创建的权限策略“oss_access”。

配置完成后,会生成一个ARN值,需要将它记录下来。
申请STS的访问TOKEN信息
StsServiceApplication代码:
publicclassStsServiceApplication{publicstaticvoidmain(String[]args){Stringpoint="";StringAccessKeyId=;StringaccessKeySecret=;StringroleArn="acs:ram::53620:role/ram-oss-access";StringroleSessionName="oss_access_session";Stringpolicy="{\n"+"\"Version\":\"1\",\n"+"\"Statement\":[\n"+"{\n"+"\"Action\":[\n"+"\"oss:*\"\n"+"],\n"+"\"Resource\":[\n"+"\"acs:oss:*:*:*\"\n"+"],\n"+"\"Effect\":\"Allow\"\n"+"}\n"+"]\n"+"}";try{//添加point(直接使用STSpoint,前两个参数留空,无需添加regionID)("","","Sts",point);//构造defaultprofile(参数留空,无需添加regionID)IClientProfileprofile=("",AccessKeyId,accessKeySecret);//用profile构造clientDefaultAcsClientclient=newDefaultAcsClient(profile);finalAssumeRoleRequestrequest=newAssumeRoleRequest();();(roleArn);(roleSessionName);(policy);//若policy为空,则用户将获得该角色下所有权限(1000L);//设置凭证有效时间finalAssumeRoleResponseresponse=(request);("Expiration:"+().getExpiration());("AccessKeyId:"+().getAccessKeyId());("AccessKeySecret:"+().getAccessKeySecret());("SecurityToken:"+().getSecurityToken());("RequestId:"+());}catch(ClientExceptione){("Failed:");("Errorcode:"+());("Errormessage:"+());("RequestId:"+());}}}返回结果:
Expiration:2020-11-15T06:37:51ZAccessKeyId::7buxRohgRr6vT1EVAqq4FWjxaUFRQMuC4vvV55utenkJSecurityToken:CAISjwJ1q6Ft5B2yfSjIr5eHBsnclepE1omJTnXSpXo2e9dgo46etDz2IHxMenFgA+sfv/0ynGBR5/YSlrt0UIRyTEfPYNBr2Y9a6higZIyZdz4iUQhC2vOfAmG2J0PR7q27OpfELr70fvOqdCqz9Etayqf7cjOPRkGsNYbz57dsctUQWHvXD1dBH8wEZHEhyqkgOGDWKOymPzPzn2PUFzAIgAdnjn5l4qnNpa/54xHF3lrh0b1X9cajYLrcNpQyY80kDorsgrwrLfSbiBQ9sUYaqP1E64Vf4irCs92nBF1c3g6LKeK88Kc0cFcnPvhgQPcV9aWkxaQp6rzJ8Z7+zlNKJvoQWi/USZu70Fd2+ykG8lpTGoABiIGFt+WCBkX/yLkY3uHDiWq4Uud32DzXWQAQpGmOWXwYzPRepi0XCcC029hPoXwCsj6mWbd/Ls2bUQsLUPtG3ozr6WawG2XUBXgZI5dNip8dZJCWZSet9qGsNXubhA3hTC+Wi7MNOariEkmr1kjqnG6N/YNaWuMYJ3BUobvLL4g=RequestId:480E0B98-ACA5-4C98-AA82-6D9901CD7EE4
表单上传
FormPostApplication代码:
publicclassFormPostApplication{//="d:/trade_";//OSSdomain,suchas;//"";privateStringaccessKeySecret="HwdZYJ8wVUopdNscwDYFf7oPgBpA4WXgG6K4JggztqW9";privateStringoss_security_token="CAISjwJ1q6Ft5B2yfSjIr5fWOtPTlLBO8bitV0Pn1kcHVt97q4nf2jz2IHxMenFgA+sfv/0ynGBR5/YSlrt0UIRyTEfPYNBr2Y9a6higZIyZW2tYUAhC2vOfAmG2J0PR7q27OpfELr70fvOqdCqz9Etayqf7cjOPRkGsNYbz57dsctUQWHvXD1dBH8wEZHEhyqkgOGDWKOymPzPzn2PUFzAIgAdnjn5l4qnNpa/54xHF3lrh0b1X9cajYLrcNpQyY80kDorsgrwrLfSbiBQ9sUYaqP1E64Vf4irCs92nBF1c3g6LKeK88Kc0cFcnPvhgQPcV9aWkxaQp6rzJ8Z7+zlNKJvoQWi/USZu70Fd2+ykG8lpTGoABUJly6VzNT0fNrAW2uTyuuGX+PI/PaV7df5cewy7WoAnvtjDe0PM8vBWuD6zY3dQFgQOPFkY8RxxQUrSkZ9wpS3E7FBjzTfkFGlRHmmc+ad8uCLPaWIb/B9QGI6uKidSXnEnLqcK+8xsB1HBsyCkL600PJfcuSWBs9CHh9uiJTG0=";//TheexistingbucketnameprivateStringbucketName=;//="trade_stock";privatevoidpostObject()throwsException{//appthe'bucketname.'priortothedomain,suchas("http://","http://"+bucketName+".");//formfieldsMapString,StringformFields=newLinkedHashMapString,String();//("key",);//("Content-Disposition","attachment;filename="+localFilePath);//("OSSAccessKeyId",accessKeyId);//policyStringpolicy="{\"expiration\":\"2120-01-01T12:00:00.000Z\",\"conditions\":[[\"content-length-range\",0,104857600]]}";StringencodePolicy=newString((()));("policy",encodePolicy);//SignatureStringsignaturecom=computeSignature(accessKeySecret,encodePolicy);("Signature",signaturecom);//("x-oss-security-token",oss_security_token);Stringret=formUpload(urlStr,formFields,localFilePath);("PostObject["++"]tobucket["+bucketName+"]");("postreponse:"+ret);}privatestaticStringcomputeSignature(StringaccessKeySecret,StringencodePolicy)throwsUnsupportedEncodingException,NoSuchAlgorithmException,InvalidKeyException{//converttoUTF-8byte[]key=("UTF-8");byte[]data=("UTF-8");//hmac-sha1Macmac=("HmacSHA1");(newSecretKeySpec(key,"HmacSHA1"));byte[]sha=(data);//base64returnnewString((sha));}privatestaticStringformUpload(StringurlStr,MapString,StringformFields,StringlocalFile)throwsException{Stringres="";HttpURLConnectionconn=null;//Stringboundary="9431149156168";Stringboundary="abc";try{URLurl=newURL(urlStr);conn=(HttpURLConnection)();(5000);(30000);(true);(true);("POST");("User-Agent","Mozilla/5.0(Windows;U;;zh-CN;rv:1.9.2.6)");////("Content-MD5","yourContentMD5");("Content-Type","multipart/form-data;boundary="+boundary);OutputStreamout=newDataOutputStream(());//textif(formFields!=null){StringBufferstrBuf=newStringBuffer();IteratorEntryString,Stringiter=().iterator();inti=0;while(()){EntryString,Stringentry=();StringinputName=();StringinputValue=();if(inputValue==null){continue;}if(i==0){("--").app(boundary).app("\r\n");("Content-Disposition:form-data;name=\""+inputName+"\"\r\n\r\n");(inputValue);}else{("\r\n").app("--").app(boundary).app("\r\n");("Content-Disposition:form-data;name=\""+inputName+"\"\r\n\r\n");(inputValue);}i++;}(().getBytes());}//fileFilefile=newFile(localFile);Stringfilename=();StringcontentType=newMimetypesFileTypeMap().getContentType(file);if(contentType==null||("")){contentType="application/octet-stream";}StringBufferstrBuf=newStringBuffer();("\r\n").app("--").app(boundary).app("\r\n");("Content-Disposition:form-data;name=\"file\";"+"filename=\""+filename+"\"\r\n");("Content-Type:"+contentType+"\r\n\r\n");(().getBytes());DataInputStreamin=newDataInputStream(newFileInputStream(file));intbytes=0;byte[]bufferOut=newbyte[1024];while((bytes=(bufferOut))!=-1){(bufferOut,0,bytes);}();byte[]Data=("\r\n--"+boundary+"--\r\n").getBytes();(Data);();();//GetsthefiledatastrBuf=newStringBuffer();BufferedReaderreader=newBufferedReader(newInputStreamReader(()));Stringline=null;while((line=())!=null){(line).app("\n");}res=();();reader=null;}catch(Exceptione){("Spostrequestexception:"+e);throwe;}finally{if(conn!=null){();conn=null;}}returnres;}publicstaticvoidmain(String[]args)throwsException{FormPostApplicationossPostObject=newFormPostApplication();();}}将上面所获取的key,secret和token填入。
bucket名称要和上面授权对应的bucket一致。
这里是模拟form表单提交,编码采用UTF-8。
policy里面可以配置超时时间,内容长度范围等。
如果出现403错误,检查token等权限信息的配置是否正确。
如果出现400错误,检查参数配置是否正确,比如说MD5参数如果传递,但没配置正确,会出现此错误。
("Content-MD5","yourContentMD5");操作成功后,能够在后台看到对应的文件信息。

代码:
添加阿里云依赖。
添加阿里云配置信息。
采用表单方式上传,直接将数据存至OSS服务中。实现类:FormFileUploadServiceImpl。
打包app-file服务
mavencleaninstall

上传至云服务器
运行:
功能验证
对文件上传和下载进行验证。

云数据库VS传统数据库
云数据库和传统数据库在搭建、运维、管理层面,云数据库提升了一个层次,实现了较高程度的智能化和自动化,极大地提升了用户友好度,降低了使用门槛。比如灵活的性能等级调整、详尽的监控体系、攻击防护机制等等。
云数据库的高级特性:
读写分离
提供可视化的读写分离配置管理功能。从数据库实例的创建,到同步关系以及读写流量分发,云数据库都能自动化完成。
![file]()
自动调优
云数据库都自带性能分析和改进的模块,能够自动地发现性能热点,还能够智能地给出调整建议,比如进行个别语句的调整,添加额外的索引等等。云数据库的性能分析和自动调优的能力,是将生产运行数据和服务内置的AI模型进行了结合,做到了真正的智能化运维,极大的节省了成本。
阿里云的数据库自治服务DAS:
自治服务DAS是一种基于机器学习和专家经验实现数据库自感知、自修复、自优化、自运维及自安全的云服务,使用了DAS之后您可以避免这样的复杂性和人工操作引起的故障,有效保障数据库服务的稳定、安全及高效。
![file]()
监控维护
云数据库提供了全面强大的监控维护功能,提供了丰富的性能监控项,能够及时发现并预警。
![file]()
监控包含CPU和内存使用率、磁盘空间、IOPS、连接数、CPU内存使用率和网络流量等。
报警功能:
![file]()
可以根据不同的规则来组合设定预警条件:
![file]()6.云数据库操作
创建云数据库实例
根据自身需要,选择相应配置:

访问权限配置
申请外网访问地址:

这里提供了内网和外网不同访问地址。

需要设定白名单,0.0.0.0/0是允许所有主机访问,在实际应用中,最好要指定具体的IP。

hdm_security_ips是DAS服务白名单,自动生成。
数据库账号配置
创建访问数据库的账号密码。

服务授权标签可以开通配置权限与数据权限。
连接配置

SQL洞察
连入数据库后,做一些SQL操作,通过SQL洞察就能看到详细的信息:

全量SQL统计
这里面会侧重性能分析,并给出自动优化提示。

代码
编写下单与查询订单的接口。
配置数据源连接,指向云数据库。
采用JPA方式对数据进行操作。
修改连接配置
修改配置文件:

服务打包
mavencleaninstall

上传至云服务器
运行:
功能验证
测试数据库的新增与查询功能。
新增:;execPrice=2

查询:

新一代原生数据库VS云数据库
更强的性能与扩展性
云原生数据库由于原生设计,专门为云设计的专业化存储架构,可以支撑更大规模的数据量,关系型云原生数据库能够脱离典型的数TB的容量上限,达到单库数十TB甚至百TB的级别。
云原生数据库可以利用云快速地进行水平扩展,迅速调整、提升数据库的处理能力,能够有效应对高并发场景。
更高的可用性与可靠性
云原生数据库默认就具备多副本高可用的,数据同步、读写分离等高级特性,比如AmazonAurora云原生数据库,就自动包含了分布在3个可用区、多达6份的数据副本。
对于多种数据模型也有很好的支持,除了兼容关系型数据库外,还会推出适合不同形态和查询范式的云数据库,与NoSQL数据库形成竞争,比如说AWS的图数据库Neptune,AzureCosmosDB的NoSQL数据库服务。
低成本与易维护性
大部分云原生数据库,在存储上不需要预先设置大小,会随着存储占用自动扩展;在计算上,也有部分云数据库推出了无服务器版本,比如亚马逊的AuroraServerless,在面对间歇偶发性工作负载时,都能节省较多的成本。
阿里云PolarDB

阿里云PolarDB放弃了通用分布式数据库OLTP多路并发写的支持,采用一写多读的架构设计,存储与计算分离的技术架构,简化了分布式系统难以兼顾的理论模型,又能满足绝大多数OLTP的应用场景和性能要求。
PolarDB的设计革新:
通过重新设计特定的文件系统来存取Redolog这种特定的WALI/O数据。
通过高速网络和高效协议将数据库文件和Redolog文件放在共享存储设备上,避免了多次长路径I/O的重复操作,并且针对Redolog的I/O路径,专门设计了多副本共享存储块设备。
产品架构设计

一写多读
主节点处理读写请求,只读节点仅处理读请求。一个集群版集群包含一个主节点和最多15个只读节点。
计算与存储分离
计算与存储分离的设计,计算节点仅存储元数据,存储节点负责数据文件、RedoLog等存储。
共享分布式存储
多个计算节点共享一份数据,并非每个计算节点都存储一份数据,降低存储成本。存储节点的数据采用多副本形式,确保数据的可靠性,并通过Parallel-Raft协议保证数据一致性。基于全新设计的分布式块存储和文件系统,存储容量可以在线平滑扩展。
是基于DRDS+RDS的分布式云数据库服务,产品的特征是采用Share-Nothing架构、以解决存储扩展性为出发点、提供面向用户的产品化交付能力。
主要是解决企业的各种复杂需求:
在功能性方面,既要保障SQL通用性,又要具备NoSQL的扩展性;既要高并发,又要支持实时复杂分析。
企业的历史沉淀数据是一大痛点,要以最少的成本保障数据能够顺利稳定的迁移,并且不影响现有服务的稳定性。
各种应用对GIS数据的处理需求会越来越旺盛,使用开源版本GIS性能、功能无法满足,需要有一个功能强大的存储介质。
海量数据的运维管理,高级DBA非常欠缺,在维护方面需要高昂的成本。
针对以上问题,应运而生,不但完全继承了1.0的架构体系,同时兼容了另外两个流行数据库Oracle与PostgreSQL。,高度兼容Oracle;,完全兼容PostgreSQL。