云原生项目正确的数据库选择

数据库
0
0
{"value":"### **项目痛点**\n本项目为和 Amazon Proserve 合作自研云原生开发的一期项目:网点价的自动计算,项目痛点:网点价受产品的多种参数影响:包含但不限于具体出轴类型、型号规格、传动比、安装形式、装配形式、电机类型、强度、速比、功率、品牌、零部件材质、运输成本距离等等,业务部门会随着新产品的落地,搭配不同的价格政策且随着市场的各项成本波动,周期性的调整产品的整体价格;\n[https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all&trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&sc_channel=el](https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all&trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&sc_channel=el)\n### **数据库选型**\n1.不同的选择:从团队角度出发,作为一个甲方内部的团队我们更熟悉直接部署在服务器上的传统关系型数据库 SQL SEVER,选择 SQL SEVER \n 我们的数据库工程师无疑更得心应手,无论是性能上的优化,备份的设置都会更顺畅;出于成本上的考虑,考虑到这个项目上线后的使用频率和容量,我们必须选择做出取舍,我们更倾向于“以战代练”,毕竟我们邀请了 Amazon Proserve 团队的数据库专家 James 老师,我们为什么不选择一个最适合这个项目,能满足我们自拓展字段需求的数据库呢 ;\n2.运维及开发上的考虑:因项目痛点,PO明确指出:网点价参数是不断变化的,这就带来了第一个技术穿刺点:我们是选择传统关系型数据库 SQL SERVER / ORACLE 等等,还是选择 no sql 等数据库都是可选范围之内;选择 SQL SERVER 开发人员和数据库管理人员就要直面网点价参数是不断变化带来的字段增加,出于这一点 DynamoDB 成为了我们做技术穿刺的首选;\n3.技术上:Amazon DynamoDB 是一个完全托管的 NoSQL 数据库服务,可以提供快速的、可预期的性能,并且可以实现无缝扩展。由于 DynamoDB 并可以根据实际需求对表进行扩展和收缩,这个过程既不需要停止对外服务,也不会降低服务性能;\n4.成本上:按需容量模式的定价策略,无论从写入读写频次和存储空间上的预估结合我司的使用场景,前台大量的销售、财务、销售内勤的频繁调用,按需容量模式的定价策略让我们不会产生额外的成本上的浪费,而且这种模式也能直接通过内部审计的采购选型,相比于去购买云上 SQL SERVER 的 lisence,这无疑节省了巨额的预期成本;\n\n![image.png](https://dev-media.amazoncloud.cn/e9ebfb42d5eb4708aed102316bdb47e2_image.png)\n![image.png](https://dev-media.amazoncloud.cn/3f9bc65a20964c08ab106d834c6b9755_image.png)\n\n### **DynamoDB 架构介绍**\n#### **三个核心概念**\nTable(表),Item(项目/记录/行),Attribute(属性/字段/列),Table 是数据的集合,包含零个或者多个 Item,Item 是一组属性,包含一个或者多个 Attribute。一个Item必须通过主键和其他 Item 区分开来,主键在创建表的时候需要指定,其他非主键的 Attribute 无须提前指定。\n 举例:见下图,表名:People,有3个 Item:\n 第1个 Item 有4个 Attribute,分别是 PersonID、LastName、FirstName、Phone。\n 第2个 Item 有4个 Attribute,分别是 PersonID、LastName、FirstName、Address。\n 第3个 Item 有5个 Attribute,分别是 PersonID、LastName、FirstName、Address、FavoriteColor。\n 以上 Attribute 中,PersonID、LastName、FirstName、FavoriteColor 都是单值,Address 是嵌套字段,里面分别还有4个字段,分别是 Street、City、State、ZIPCode,DynamoDB 支持最高 32 级深度的嵌套属性,层数不要太多。\n 在这个 People,PersonID 为主键,通过此 Attribute 即可区分不同的 Item。\n\n![image.png](https://dev-media.amazoncloud.cn/595792487c6e40ea94c6ef7e208e5690_image.png)\n\n在下面的 Music 中,Artist 和 SongTitle 两个字段构成主键,是一个复合主键,用这两个字段区分不同的 Item,其中 Artist 叫分区键,SongTitle 是排序键。\n\n![image.png](https://dev-media.amazoncloud.cn/5ea0a8622d99418fa8d6697766fb32f0_image.png)\n\n1)只有一个属性的主键\n\n![image.png](https://dev-media.amazoncloud.cn/6df959a24ffb45c997ccf2cb682c807f_image.png)\n\n2)包含2个属性的主键,第一个是分区键,第二个是排序键\n\n![image.png](https://dev-media.amazoncloud.cn/072e7a4dd6dc454c8a2a6dc48aa397a8_image.png)\n\n#### **二级索引**\n所谓“二级”,是相对于上面提到的主键而言的,通过二级索引,可以加快以其他属性(非主键属性)为条件的查询速度。包括两种二级索引,分别是:\n- 全局二级索引 – 一种带有可能与表中不同的分区键和排序键的索引,不支持强一致性读取。\n- 本地二级索引 – 分区键与表中的相同但排序键与表中的不同的索引。\nDynamoDB 中的每个表具有 20 个全局二级索引(默认配额)和 5 个本地二级索引的配额。\n下图显示了示例 Music 表,该表包含一个名为 GenreAlbumTitle 的新索引。在索引中,Genre 是分区键,AlbumTitle 是排序键。\n- 每个索引属于一个表(称为索引的基表)。在上述示例中,Music 是 GenreAlbumTitle 索引的基表。\n- DynamoDB 将自动维护索引。当您添加、更新或删除基表中的某个项目时,DynamoDB 会添加、更新或删除属于该表的任何索引中的对应项目。\n- 当您创建索引时,可指定哪些属性将从基表复制或投影 到索引。DynamoDB 至少会将键属性从基表投影到索引中。对于 ```GenreAlbumTitle``` 也是如此,只不过此时只有``` Music``` 表中的键属性会投影到索引中。\n\n![image.png](https://dev-media.amazoncloud.cn/12cb7ad041db4e07be83edd8f7c25a24_image.png)\n\n1)下面是创建本地二级索引,若将 checkbox “以本地二级索引的形式创建”去掉,则是创建的全局二级索引。\n\n![image.png](https://dev-media.amazoncloud.cn/5458b4051a1a4765974ba1983a0fcdd1_image.png)\n\n2)下面是创建全局二级索引\n\n![image.png](https://dev-media.amazoncloud.cn/d0205e61935e478f9ab401148c1751cd_image.png)\n\n#### **读取一致性**\n当应用程序向 DynamoDB 表写入数据并收到 HTTP 200 响应 (OK) 时,Amazon DynamoDB 保证该写入已发生并且持久。该数据最终将在所有存储位置中保持一致,通常只需一秒或更短时间。\nDynamoDB 支持最终一致性 和强一致性 读取:\n- 最终一致性,当从 DynamoDB 表中读取数据时,响应反映的可能不是刚刚完成的写入操作的结果。响应可能包含某些陈旧数据。默认采用最终一致性读取,读取操作(例如 ```GetItem```、 ```Query``` 和 ```Scan```)提供 ```ConsistentRead``` 参数,设置为 true 则采用强一致性读取。\n- 强一致性读取,当请求强一致性读取时,DynamoDB 会返回具有最新数据的响应,从而反映来自所有已成功的之前写入操作的更新。\n#### **读/写容量模式**\n- 按需模式,按需 Amazon DynamoDB 是一个灵活的结算选项,可以每秒处理数千个请求而不需要进行容量规划。按需 DynamoDB 针对读写请求提供按需支付定价,以便您只需为您使用的资源付费。\n- 预置模式,如果您选择预置模式,则指定您的应用程序需要的每秒读取和写入次数。您可以使用 Auto Scaling 根据流量变化自动调整表的预置容量。这可帮助您控制您对 DynamoDB 的使用,使之保持或低于定义的请求速率,以便获得成本可预测性。\n#### **读写容量单位的举例**\n假设您创建一个具有 6 个读取容量单位和 6 个写入容量单位的预置表。使用这些设置,您的应用程序可以执行以下操作:\n- 执行高达每秒 24KB 的强一致性读取(4 KB × 6 个读取容量单位)。\n- 执行高达每秒 48KB 的最终一致性读取(读取吞吐量的两倍)。\n- 执行高达每秒 12 KB 的事务读取请求。\n- 每秒写入高达 6KB(1 KB × 6 个写入容量单位)。\n- 执行高达每秒 3KB 的事务写入请求。\n#### **使用场景**\n当至少需要以下一项时,DynamoDB 是最佳用例:\n1. 通过key查询数据,或者主键和排序键一起查询(如 customer_id 和order_date)。\n2. 希望数据轻松与其他 Amazon 服务集成,例如 Lambda 和 RedShift\n3. 每秒需要数百万次读取,可以添加 DAX 来缓存您的数据。\n4. 需要从联合用户访问数据库,可以按字段级别微调用户访问。\n另一方面,如果以下任一情况属实,则**不应使用** DynamoDB:\n1. 需要高级查询和聚合。例如,不能使用连接、子查询、排序、批量选择、分组依据(平均、计数……等)、有子句、更改选择中的属性名称……\n2. 并不完全了解它的分区是如何工作的。Dynamo db 以数据库即服务的形式销售,无需担心其底层机制。但是你可以很容易地设计出简单地导致性能严重下降的索引策略。[https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html)\n3. 需要在 1 条记录中存储超过 400 KB 的数据。检查其他 [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html#default-limits-throughput-capacity-modes) 限制\n#### **优缺点**\n优点:\n1. 宽松一致性和强一致性之间的权衡\n这里的游戏规则是不需要在应用程序中对值的复制进行硬编码。在做出选择之后,一切都会正常运行。读写单位可根据实际应用使用情况随时调整。市场上没有任何东西可以与此相媲美。\n2. 分析\n将应用程序扩展到数据库并没有想象中那么容易。在一个完美的世界中,只需将一个 javascript 函数发送到数据库并让它在准备好时产生一个答案。迄今为止,每个 nosql 数据库在集成分析方面都确实下降了。在运行 map-reduce 作业时,Mongodb 有很大的限制。另一方面,Riak 将其 map-reduce 功能用于查询而不是生成新数据。我认为这很有趣,但不适合很多用例。\n与 Elastic Map Reduce 的集成消除了分析存储数据的复杂性。只需几个命令即可开始执行 map reduce 作业,而无需 Hadoop 的凌乱“适配器”。\n3.性能和管理\n数据库基础设施性能和管理的整个复杂性在dynamoDB中消失了。在云中调整分布式数据库的噩梦已成为过去。我应该选择 EC2 临时存储还是 EBS?如果是 EBS,希望实例的性能可以接受并且已经正确地对磁盘进行了 RAID。还必须在主机出现故障时对其进行管理和恢复。在许多情况下,这不是一个可以轻松自动化的过程。一旦所有这些都完成了,调整过程就可以开始了。在寻找单个值时,临时磁盘和 EBS 磁盘都不能提供低延迟性能。在随机读取和更新方面,SSD 是真正的规则。这些都不意味着云托管数据库不可行,但DynamoDB易用性显然更胜一筹, DynamoDB比简单的无模式宽松一致性存储更好。该产品非常接近于实现 NoSQL 的承诺:易于使用结构化存储,无需管理 SQL 服务器的复杂性以及横向扩展的可靠性和性能优势。\n缺点:\n1.如果您真的需要强一致性和事务,那么您可能已经在使用 SQL 数据库,DynamoDB 是一个 NoSQL 数据库。这意味着您不能在 dynamoDB 上进行连接或复杂查询。也没有 ACID,因为它不是 RDBMS;\n2.不能将大对象 (BLOBS) 写入 dynamo DB。您绝对可以将 BLOBS 的元数据存储在 dynamoDB 中,但您可以将实际对象存储在 S3 中。从 S3 调优中检索是为了获得更好的性能而需要考虑的另一件事,例如使用字典顺序、使用随机性和 GET 的并行化\n -放入 Dynamo DB 表中的每个属性也有 400Kb 对象大小的限制;\n#### **安全检查**\n1.本地环境是通过 aws_access_key_id,aws_secret_access_key 来访问 dynamodb 的, 为了安全考虑,改成 IAMrole 和 eks 服务账号关联的方式\n2.无 RDS,dynamoDB 暂未发现security issue\n#### **项目架构样例**\n基础架构: \n- 生产环境EKS: master+2 workers(m5.xlarge, 4c16G)\n- 开发环境EKS: master+2 workers(m5.large, 2c8G)\n- UAT环境EKS: master+2 workers (m5.large, 2c8G)\nCICD: \n- CICD工具选择: \n - 持续集成:jenkins on EKS\n - 代码仓库:Codecommit\n - 镜像仓库:ECR\n- EKS: master+2 workers (m5.large, 2c8G)\n数据库:\n- Dynamodb\n\n![image.png](https://dev-media.amazoncloud.cn/5a0fccda819645ed9ca2299349e2bfda_image.png)\n\n#### **应用样例**\n##### **SalePolicy**\n描述: 核心的销售政策表\n分区键:salePolicyId (String)\n排序键: modifyTime (String)\n样例:\n```\n{\n2 \"id\": { \"S\": \"1d6f1b67-5007-44fa-8025-43985cb8d393\"},\n3 \"approveTime\": { \"S\": \"2021-04-23 14:03:14\"},\n4 \"version\": {\"N\": \"13\"},\n5 \"approvePersonCode\": { \"S\": \"2010038\"},\n6 \"formula\": { \"S\": \"4.23测试-1-修改1-修改1-审核\"},\n7 \"businessStatus\": {\"S\": \"APPROVED\"},\n8 \"status\": {\"S\": \"INVALID\" },\n9 \"priority\": {\"N\": \"30\" },\n10 \"createTime\": {\"S\": \"2021-04-23 13:58:58\"},\n11 \"name\": {\"S\": \"4.23测试-1-修改1-修改1-审核\"},\n12 \"modifyPersonName\": {\"S\": \"于浩洋\"},\n13 \"saleSeriesId\": {\"S\": \"1\"},\n14 \"startTime\": {\"S\": \"2021-04-01 00:00:00\"},\n15 \"modifyTime\": {\"S\": \"2021-04-23 14:05:15\"},\n16 \"saleSeriesType\": {\"S\": \"STANDARD\"},\n17 \"code\": {\"S\": \"4.23测试-1-修改1-修改1-审核\"},\n18 \"approvePerson\": {\"S\": \"于浩洋\"},\n19 \"endTime\": { \"S\": \"2021-05-31 00:00:00\"},\n20 \"createPersonName\": {\"S\": \"于浩洋\"},\n21 \"createPersonCode\": {\"S\": \"2010038\"},\n22 \"modifyPersonCode\": {\"S\": \"2010038\"},\n23 \"description\": {\"S\": \"4.23测试-1-修改1-修改1-审核\"}\n24}\n```\n索引信息:\n\n![image.png](https://dev-media.amazoncloud.cn/c8e57146adb041f9ab7f4779f8ac1930_image.png)\n\n### **总结**\n那么什么时候采用 DynamoDB,什么时候采用关系型数据库呢?根据本次项目经验,DynamoDB 好处如下:\n1. 对于海量数据,DynamoDB表现要好。由于 DynamoDB 是 nosql,也就意味着没有传统数据库的诸多限制,在海量数据的方面无论是查询还是存储都比传统数据库要高。\n2. 数据库的 schema 方便调整。传统数据库的一个重大的问题就是调整表的结构,调整表结构会引起一些列的问题,甚至有重新设计数据库的可能,而对于 nosql 来说,因为其是通过文档进行存储的,所有没有严格意义上的 [schema](https://www.zhihu.com/search?q=schema&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22article%22%2C%22sourceId%22%3A%22101965292%22%7D),所以当后期进行扩展时,影响较小。\n相对来说,DynamoDB 缺点也十分明显,在没有传统数据库限制的同时,代价是其丧失了很多重要功能,比如说外键,表连接,数据有效性检查等等。总而言之,如果项目极度依赖表和表之间的关系,且关系及其复杂,那么建议用传统关系型数据库,否则可以尝试 DynamoDB。\n粉丝福利\n亚马逊云科技专为开发者们打造了多种学习平台:\n1. 入门资源中心:从0到1 轻松上手云服务,内容涵盖:成本管理,上手训练,开发资源。[https://aws.amazon.com/cn/getting-started/?nc1=h_ls&trk=32540c74-46f0-46dc-940d-621a1efeedd0&sc_channel=el](https://aws.amazon.com/cn/getting-started/?nc1=h_ls&trk=32540c74-46f0-46dc-940d-621a1efeedd0&sc_channel=el)\n2. 架构中心:亚马逊云科技架构中心提供了云平台参考架构图表、经过审查的架构解决方案、Well-Architected 最佳实践、模式、图标等。[https://aws.amazon.com/cn/architecture/?intClick=dev-center-2021_main&trk=3fa608de-d954-4355-a20a-324daa58bbeb&sc_channel=el](https://aws.amazon.com/cn/architecture/?intClick=dev-center-2021_main&trk=3fa608de-d954-4355-a20a-324daa58bbeb&sc_channel=e)\n3. 构建者库:了解亚马逊云科技如何构建和运营软件。[https://aws.amazon.com/cn/builders-library/?cards-body.sort-by=item.additionalFields.sortDate&cards-body.sort-order=desc&awsf.filter-content-category=*all&awsf.filter-content-type=*all&awsf.filter-content-level=*all&trk=835e6894-d909-4691-aee1-3831428c04bd&sc_channel=el](https://aws.amazon.com/cn/builders-library/?cards-body.sort-by=item.additionalFields.sortDate&cards-body.sort-order=desc&awsf.filter-content-category=*all&awsf.filter-content-type=*all&awsf.filter-content-level=*all&trk=835e6894-d909-4691-aee1-3831428c04bd&sc_channel=el)\n4. 用于在亚马逊云科技平台上开发和管理应用程序的工具包:[https://aws.amazon.com/cn/tools/?intClick=dev-center-2021_main&trk=972c69e1-55ec-43af-a503-d458708bb645&sc_channel=el](https://aws.amazon.com/cn/tools/?intClick=dev-center-2021_main&trk=972c69e1-55ec-43af-a503-d458708bb645&sc_channel=el)","render":"<h3><a id=\"_0\"></a><strong>项目痛点</strong></h3>\n<p>本项目为和 Amazon Proserve 合作自研云原生开发的一期项目:网点价的自动计算,项目痛点:网点价受产品的多种参数影响:包含但不限于具体出轴类型、型号规格、传动比、安装形式、装配形式、电机类型、强度、速比、功率、品牌、零部件材质、运输成本距离等等,业务部门会随着新产品的落地,搭配不同的价格政策且随着市场的各项成本波动,周期性的调整产品的整体价格;<br />\n<a href=\"https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&amp;all-free-tier.sort-by=item.additionalFields.SortRank&amp;all-free-tier.sort-order=asc&amp;awsf.Free%20Tier%20Types=*all&amp;awsf.Free%20Tier%20Categories=*all&amp;trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&amp;sc_channel=el\" target=\"_blank\">https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&amp;all-free-tier.sort-by=item.additionalFields.SortRank&amp;all-free-tier.sort-order=asc&amp;awsf.Free%20Tier%20Types=*all&amp;awsf.Free%20Tier%20Categories=*all&amp;trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&amp;sc_channel=el</a></p>\n<h3><a id=\"_3\"></a><strong>数据库选型</strong></h3>\n<p>1.不同的选择:从团队角度出发,作为一个甲方内部的团队我们更熟悉直接部署在服务器上的传统关系型数据库 SQL SEVER,选择 SQL SEVER<br />\n我们的数据库工程师无疑更得心应手,无论是性能上的优化,备份的设置都会更顺畅;出于成本上的考虑,考虑到这个项目上线后的使用频率和容量,我们必须选择做出取舍,我们更倾向于“以战代练”,毕竟我们邀请了 Amazon Proserve 团队的数据库专家 James 老师,我们为什么不选择一个最适合这个项目,能满足我们自拓展字段需求的数据库呢 ;<br />\n2.运维及开发上的考虑:因项目痛点,PO明确指出:网点价参数是不断变化的,这就带来了第一个技术穿刺点:我们是选择传统关系型数据库 SQL SERVER / ORACLE 等等,还是选择 no sql 等数据库都是可选范围之内;选择 SQL SERVER 开发人员和数据库管理人员就要直面网点价参数是不断变化带来的字段增加,出于这一点 DynamoDB 成为了我们做技术穿刺的首选;<br />\n3.技术上:Amazon DynamoDB 是一个完全托管的 NoSQL 数据库服务,可以提供快速的、可预期的性能,并且可以实现无缝扩展。由于 DynamoDB 并可以根据实际需求对表进行扩展和收缩,这个过程既不需要停止对外服务,也不会降低服务性能;<br />\n4.成本上:按需容量模式的定价策略,无论从写入读写频次和存储空间上的预估结合我司的使用场景,前台大量的销售、财务、销售内勤的频繁调用,按需容量模式的定价策略让我们不会产生额外的成本上的浪费,而且这种模式也能直接通过内部审计的采购选型,相比于去购买云上 SQL SERVER 的 lisence,这无疑节省了巨额的预期成本;</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/e9ebfb42d5eb4708aed102316bdb47e2_image.png\" alt=\"image.png\" /><br />\n<img src=\"https://dev-media.amazoncloud.cn/3f9bc65a20964c08ab106d834c6b9755_image.png\" alt=\"image.png\" /></p>\n<h3><a id=\"DynamoDB__13\"></a><strong>DynamoDB 架构介绍</strong></h3>\n<h4><a id=\"_14\"></a><strong>三个核心概念</strong></h4>\n<p>Table(表),Item(项目/记录/行),Attribute(属性/字段/列),Table 是数据的集合,包含零个或者多个 Item,Item 是一组属性,包含一个或者多个 Attribute。一个Item必须通过主键和其他 Item 区分开来,主键在创建表的时候需要指定,其他非主键的 Attribute 无须提前指定。<br />\n举例:见下图,表名:People,有3个 Item:<br />\n第1个 Item 有4个 Attribute,分别是 PersonID、LastName、FirstName、Phone。<br />\n第2个 Item 有4个 Attribute,分别是 PersonID、LastName、FirstName、Address。<br />\n第3个 Item 有5个 Attribute,分别是 PersonID、LastName、FirstName、Address、FavoriteColor。<br />\n以上 Attribute 中,PersonID、LastName、FirstName、FavoriteColor 都是单值,Address 是嵌套字段,里面分别还有4个字段,分别是 Street、City、State、ZIPCode,DynamoDB 支持最高 32 级深度的嵌套属性,层数不要太多。<br />\n在这个 People,PersonID 为主键,通过此 Attribute 即可区分不同的 Item。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/595792487c6e40ea94c6ef7e208e5690_image.png\" alt=\"image.png\" /></p>\n<p>在下面的 Music 中,Artist 和 SongTitle 两个字段构成主键,是一个复合主键,用这两个字段区分不同的 Item,其中 Artist 叫分区键,SongTitle 是排序键。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/5ea0a8622d99418fa8d6697766fb32f0_image.png\" alt=\"image.png\" /></p>\n<p>1)只有一个属性的主键</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/6df959a24ffb45c997ccf2cb682c807f_image.png\" alt=\"image.png\" /></p>\n<p>2)包含2个属性的主键,第一个是分区键,第二个是排序键</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/072e7a4dd6dc454c8a2a6dc48aa397a8_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"_37\"></a><strong>二级索引</strong></h4>\n<p>所谓“二级”,是相对于上面提到的主键而言的,通过二级索引,可以加快以其他属性(非主键属性)为条件的查询速度。包括两种二级索引,分别是:</p>\n<ul>\n<li>全局二级索引 – 一种带有可能与表中不同的分区键和排序键的索引,不支持强一致性读取。</li>\n<li>本地二级索引 – 分区键与表中的相同但排序键与表中的不同的索引。<br />\nDynamoDB 中的每个表具有 20 个全局二级索引(默认配额)和 5 个本地二级索引的配额。<br />\n下图显示了示例 Music 表,该表包含一个名为 GenreAlbumTitle 的新索引。在索引中,Genre 是分区键,AlbumTitle 是排序键。</li>\n<li>每个索引属于一个表(称为索引的基表)。在上述示例中,Music 是 GenreAlbumTitle 索引的基表。</li>\n<li>DynamoDB 将自动维护索引。当您添加、更新或删除基表中的某个项目时,DynamoDB 会添加、更新或删除属于该表的任何索引中的对应项目。</li>\n<li>当您创建索引时,可指定哪些属性将从基表复制或投影 到索引。DynamoDB 至少会将键属性从基表投影到索引中。对于 <code>GenreAlbumTitle</code> 也是如此,只不过此时只有<code> Music</code> 表中的键属性会投影到索引中。</li>\n</ul>\n<p><img src=\"https://dev-media.amazoncloud.cn/12cb7ad041db4e07be83edd8f7c25a24_image.png\" alt=\"image.png\" /></p>\n<p>1)下面是创建本地二级索引,若将 checkbox “以本地二级索引的形式创建”去掉,则是创建的全局二级索引。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/5458b4051a1a4765974ba1983a0fcdd1_image.png\" alt=\"image.png\" /></p>\n<p>2)下面是创建全局二级索引</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/d0205e61935e478f9ab401148c1751cd_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"_57\"></a><strong>读取一致性</strong></h4>\n<p>当应用程序向 DynamoDB 表写入数据并收到 HTTP 200 响应 (OK) 时,Amazon DynamoDB 保证该写入已发生并且持久。该数据最终将在所有存储位置中保持一致,通常只需一秒或更短时间。<br />\nDynamoDB 支持最终一致性 和强一致性 读取:</p>\n<ul>\n<li>最终一致性,当从 DynamoDB 表中读取数据时,响应反映的可能不是刚刚完成的写入操作的结果。响应可能包含某些陈旧数据。默认采用最终一致性读取,读取操作(例如 <code>GetItem</code>、 <code>Query</code> 和 <code>Scan</code>)提供 <code>ConsistentRead</code> 参数,设置为 true 则采用强一致性读取。</li>\n<li>强一致性读取,当请求强一致性读取时,DynamoDB 会返回具有最新数据的响应,从而反映来自所有已成功的之前写入操作的更新。</li>\n</ul>\n<h4><a id=\"_62\"></a><strong>读/写容量模式</strong></h4>\n<ul>\n<li>按需模式,按需 Amazon DynamoDB 是一个灵活的结算选项,可以每秒处理数千个请求而不需要进行容量规划。按需 DynamoDB 针对读写请求提供按需支付定价,以便您只需为您使用的资源付费。</li>\n<li>预置模式,如果您选择预置模式,则指定您的应用程序需要的每秒读取和写入次数。您可以使用 Auto Scaling 根据流量变化自动调整表的预置容量。这可帮助您控制您对 DynamoDB 的使用,使之保持或低于定义的请求速率,以便获得成本可预测性。</li>\n</ul>\n<h4><a id=\"_65\"></a><strong>读写容量单位的举例</strong></h4>\n<p>假设您创建一个具有 6 个读取容量单位和 6 个写入容量单位的预置表。使用这些设置,您的应用程序可以执行以下操作:</p>\n<ul>\n<li>执行高达每秒 24KB 的强一致性读取(4 KB × 6 个读取容量单位)。</li>\n<li>执行高达每秒 48KB 的最终一致性读取(读取吞吐量的两倍)。</li>\n<li>执行高达每秒 12 KB 的事务读取请求。</li>\n<li>每秒写入高达 6KB(1 KB × 6 个写入容量单位)。</li>\n<li>执行高达每秒 3KB 的事务写入请求。</li>\n</ul>\n<h4><a id=\"_72\"></a><strong>使用场景</strong></h4>\n<p>当至少需要以下一项时,DynamoDB 是最佳用例:</p>\n<ol>\n<li>通过key查询数据,或者主键和排序键一起查询(如 customer_id 和order_date)。</li>\n<li>希望数据轻松与其他 Amazon 服务集成,例如 Lambda 和 RedShift</li>\n<li>每秒需要数百万次读取,可以添加 DAX 来缓存您的数据。</li>\n<li>需要从联合用户访问数据库,可以按字段级别微调用户访问。<br />\n另一方面,如果以下任一情况属实,则<strong>不应使用</strong> DynamoDB:</li>\n<li>需要高级查询和聚合。例如,不能使用连接、子查询、排序、批量选择、分组依据(平均、计数……等)、有子句、更改选择中的属性名称……</li>\n<li>并不完全了解它的分区是如何工作的。Dynamo db 以数据库即服务的形式销售,无需担心其底层机制。但是你可以很容易地设计出简单地导致性能严重下降的索引策略。<a href=\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html\" target=\"_blank\">https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html</a></li>\n<li>需要在 1 条记录中存储超过 400 KB 的数据。检查其他 <a href=\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html#default-limits-throughput-capacity-modes\" target=\"_blank\">DynamoDB</a> 限制</li>\n</ol>\n<h4><a id=\"_82\"></a><strong>优缺点</strong></h4>\n<p>优点:</p>\n<ol>\n<li>宽松一致性和强一致性之间的权衡<br />\n这里的游戏规则是不需要在应用程序中对值的复制进行硬编码。在做出选择之后,一切都会正常运行。读写单位可根据实际应用使用情况随时调整。市场上没有任何东西可以与此相媲美。</li>\n<li>分析<br />\n将应用程序扩展到数据库并没有想象中那么容易。在一个完美的世界中,只需将一个 javascript 函数发送到数据库并让它在准备好时产生一个答案。迄今为止,每个 nosql 数据库在集成分析方面都确实下降了。在运行 map-reduce 作业时,Mongodb 有很大的限制。另一方面,Riak 将其 map-reduce 功能用于查询而不是生成新数据。我认为这很有趣,但不适合很多用例。<br />\n与 Elastic Map Reduce 的集成消除了分析存储数据的复杂性。只需几个命令即可开始执行 map reduce 作业,而无需 Hadoop 的凌乱“适配器”。<br />\n3.性能和管理<br />\n数据库基础设施性能和管理的整个复杂性在dynamoDB中消失了。在云中调整分布式数据库的噩梦已成为过去。我应该选择 EC2 临时存储还是 EBS?如果是 EBS,希望实例的性能可以接受并且已经正确地对磁盘进行了 RAID。还必须在主机出现故障时对其进行管理和恢复。在许多情况下,这不是一个可以轻松自动化的过程。一旦所有这些都完成了,调整过程就可以开始了。在寻找单个值时,临时磁盘和 EBS 磁盘都不能提供低延迟性能。在随机读取和更新方面,SSD 是真正的规则。这些都不意味着云托管数据库不可行,但DynamoDB易用性显然更胜一筹, DynamoDB比简单的无模式宽松一致性存储更好。该产品非常接近于实现 NoSQL 的承诺:易于使用结构化存储,无需管理 SQL 服务器的复杂性以及横向扩展的可靠性和性能优势。<br />\n缺点:<br />\n1.如果您真的需要强一致性和事务,那么您可能已经在使用 SQL 数据库,DynamoDB 是一个 NoSQL 数据库。这意味着您不能在 dynamoDB 上进行连接或复杂查询。也没有 ACID,因为它不是 RDBMS;<br />\n2.不能将大对象 (BLOBS) 写入 dynamo DB。您绝对可以将 BLOBS 的元数据存储在 dynamoDB 中,但您可以将实际对象存储在 S3 中。从 S3 调优中检索是为了获得更好的性能而需要考虑的另一件事,例如使用字典顺序、使用随机性和 GET 的并行化<br />\n-放入 Dynamo DB 表中的每个属性也有 400Kb 对象大小的限制;</li>\n</ol>\n<h4><a id=\"_95\"></a><strong>安全检查</strong></h4>\n<p>1.本地环境是通过 aws_access_key_id,aws_secret_access_key 来访问 dynamodb 的, 为了安全考虑,改成 IAMrole 和 eks 服务账号关联的方式<br />\n2.无 RDS,dynamoDB 暂未发现security issue</p>\n<h4><a id=\"_98\"></a><strong>项目架构样例</strong></h4>\n<p>基础架构:</p>\n<ul>\n<li>生产环境EKS: master+2 workers(m5.xlarge, 4c16G)</li>\n<li>开发环境EKS: master+2 workers(m5.large, 2c8G)</li>\n<li>UAT环境EKS: master+2 workers (m5.large, 2c8G)<br />\nCICD:</li>\n<li>CICD工具选择:\n<ul>\n<li>持续集成:jenkins on EKS</li>\n<li>代码仓库:Codecommit</li>\n<li>镜像仓库:ECR</li>\n</ul>\n</li>\n<li>EKS: master+2 workers (m5.large, 2c8G)<br />\n数据库:</li>\n<li>Dynamodb</li>\n</ul>\n<p><img src=\"https://dev-media.amazoncloud.cn/5a0fccda819645ed9ca2299349e2bfda_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"_114\"></a><strong>应用样例</strong></h4>\n<h5><a id=\"SalePolicy_115\"></a><strong>SalePolicy</strong></h5>\n<p>描述: 核心的销售政策表<br />\n分区键:salePolicyId (String)<br />\n排序键: modifyTime (String)<br />\n样例:</p>\n<pre><code class=\"lang-\">{\n2 &quot;id&quot;: { &quot;S&quot;: &quot;1d6f1b67-5007-44fa-8025-43985cb8d393&quot;},\n3 &quot;approveTime&quot;: { &quot;S&quot;: &quot;2021-04-23 14:03:14&quot;},\n4 &quot;version&quot;: {&quot;N&quot;: &quot;13&quot;},\n5 &quot;approvePersonCode&quot;: { &quot;S&quot;: &quot;2010038&quot;},\n6 &quot;formula&quot;: { &quot;S&quot;: &quot;4.23测试-1-修改1-修改1-审核&quot;},\n7 &quot;businessStatus&quot;: {&quot;S&quot;: &quot;APPROVED&quot;},\n8 &quot;status&quot;: {&quot;S&quot;: &quot;INVALID&quot; },\n9 &quot;priority&quot;: {&quot;N&quot;: &quot;30&quot; },\n10 &quot;createTime&quot;: {&quot;S&quot;: &quot;2021-04-23 13:58:58&quot;},\n11 &quot;name&quot;: {&quot;S&quot;: &quot;4.23测试-1-修改1-修改1-审核&quot;},\n12 &quot;modifyPersonName&quot;: {&quot;S&quot;: &quot;于浩洋&quot;},\n13 &quot;saleSeriesId&quot;: {&quot;S&quot;: &quot;1&quot;},\n14 &quot;startTime&quot;: {&quot;S&quot;: &quot;2021-04-01 00:00:00&quot;},\n15 &quot;modifyTime&quot;: {&quot;S&quot;: &quot;2021-04-23 14:05:15&quot;},\n16 &quot;saleSeriesType&quot;: {&quot;S&quot;: &quot;STANDARD&quot;},\n17 &quot;code&quot;: {&quot;S&quot;: &quot;4.23测试-1-修改1-修改1-审核&quot;},\n18 &quot;approvePerson&quot;: {&quot;S&quot;: &quot;于浩洋&quot;},\n19 &quot;endTime&quot;: { &quot;S&quot;: &quot;2021-05-31 00:00:00&quot;},\n20 &quot;createPersonName&quot;: {&quot;S&quot;: &quot;于浩洋&quot;},\n21 &quot;createPersonCode&quot;: {&quot;S&quot;: &quot;2010038&quot;},\n22 &quot;modifyPersonCode&quot;: {&quot;S&quot;: &quot;2010038&quot;},\n23 &quot;description&quot;: {&quot;S&quot;: &quot;4.23测试-1-修改1-修改1-审核&quot;}\n24}\n</code></pre>\n<p>索引信息:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/c8e57146adb041f9ab7f4779f8ac1930_image.png\" alt=\"image.png\" /></p>\n<h3><a id=\"_150\"></a><strong>总结</strong></h3>\n<p>那么什么时候采用 DynamoDB,什么时候采用关系型数据库呢?根据本次项目经验,DynamoDB 好处如下:</p>\n<ol>\n<li>对于海量数据,DynamoDB表现要好。由于 DynamoDB 是 nosql,也就意味着没有传统数据库的诸多限制,在海量数据的方面无论是查询还是存储都比传统数据库要高。</li>\n<li>数据库的 schema 方便调整。传统数据库的一个重大的问题就是调整表的结构,调整表结构会引起一些列的问题,甚至有重新设计数据库的可能,而对于 nosql 来说,因为其是通过文档进行存储的,所有没有严格意义上的 <a href=\"https://www.zhihu.com/search?q=schema&amp;search_source=Entity&amp;hybrid_search_source=Entity&amp;hybrid_search_extra=%7B%22sourceType%22%3A%22article%22%2C%22sourceId%22%3A%22101965292%22%7D\" target=\"_blank\">schema</a>,所以当后期进行扩展时,影响较小。<br />\n相对来说,DynamoDB 缺点也十分明显,在没有传统数据库限制的同时,代价是其丧失了很多重要功能,比如说外键,表连接,数据有效性检查等等。总而言之,如果项目极度依赖表和表之间的关系,且关系及其复杂,那么建议用传统关系型数据库,否则可以尝试 DynamoDB。<br />\n粉丝福利<br />\n亚马逊云科技专为开发者们打造了多种学习平台:</li>\n<li>入门资源中心:从0到1 轻松上手云服务,内容涵盖:成本管理,上手训练,开发资源。<a href=\"https://aws.amazon.com/cn/getting-started/?nc1=h_ls&amp;trk=32540c74-46f0-46dc-940d-621a1efeedd0&amp;sc_channel=el\" target=\"_blank\">https://aws.amazon.com/cn/getting-started/?nc1=h_ls&amp;trk=32540c74-46f0-46dc-940d-621a1efeedd0&amp;sc_channel=el</a></li>\n<li>架构中心:亚马逊云科技架构中心提供了云平台参考架构图表、经过审查的架构解决方案、Well-Architected 最佳实践、模式、图标等。<a href=\"https://aws.amazon.com/cn/architecture/?intClick=dev-center-2021_main&amp;trk=3fa608de-d954-4355-a20a-324daa58bbeb&amp;sc_channel=e\" target=\"_blank\">https://aws.amazon.com/cn/architecture/?intClick=dev-center-2021_main&amp;trk=3fa608de-d954-4355-a20a-324daa58bbeb&amp;sc_channel=el</a></li>\n<li>构建者库:了解亚马逊云科技如何构建和运营软件。<a href=\"https://aws.amazon.com/cn/builders-library/?cards-body.sort-by=item.additionalFields.sortDate&amp;cards-body.sort-order=desc&amp;awsf.filter-content-category=*all&amp;awsf.filter-content-type=*all&amp;awsf.filter-content-level=*all&amp;trk=835e6894-d909-4691-aee1-3831428c04bd&amp;sc_channel=el\" target=\"_blank\">https://aws.amazon.com/cn/builders-library/?cards-body.sort-by=item.additionalFields.sortDate&amp;cards-body.sort-order=desc&amp;awsf.filter-content-category=*all&amp;awsf.filter-content-type=*all&amp;awsf.filter-content-level=*all&amp;trk=835e6894-d909-4691-aee1-3831428c04bd&amp;sc_channel=el</a></li>\n<li>用于在亚马逊云科技平台上开发和管理应用程序的工具包:<a href=\"https://aws.amazon.com/cn/tools/?intClick=dev-center-2021_main&amp;trk=972c69e1-55ec-43af-a503-d458708bb645&amp;sc_channel=el\" target=\"_blank\">https://aws.amazon.com/cn/tools/?intClick=dev-center-2021_main&amp;trk=972c69e1-55ec-43af-a503-d458708bb645&amp;sc_channel=el</a></li>\n</ol>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭
contact-us