首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《数据密集型应用系统设计》读书笔记(四)

应用程序不可避免地需要随时间而变化、调整。在大多数情况下,更改应用程序功能时,也需要更改其存储的数据:可能需要捕获新的字段或记录类型,或者需要以新的方式呈现已有数据。...(没有字符编码的字节序列) XML 和 JSON 都有可选的模式支持,这些模式语言相当强大,因此学习和实现起来也比较复杂 CSV 没有任何模式,因此应用程序需要定义每行和每列的含义,如果应用程序更改添加新的行或列...现在,如果数据库模式发生变化(例如添加了一列或删除了一列),可以从更新的数据库模式生成新的 Avro 模式,并使用新的 Avro 模式导出数据,数据导出过程不需要关注模式的变更——可以在每次运行时简单地进行模式转换...而在应用程序层面,如果没有这方面的意识,在将数据库值解码为应用程序的模型对象,再重新编码模型对象的过程中,可能会丢失这些字段,如下图所示(实际上成熟的 ORM 框架都会考虑到这点): 2.1.1 不同时间写入不同值...基于上述现象,大多数「关系型数据库」允许进行简单的模式更改,例如添加具有默认值为空的新列,而不重写现有数据(MySQL 经常会重写)。读取旧行时,数据库会为磁盘上编码数据缺失的所有列填充为空值。

1.9K20

图解Redis

主要来说,Redis 是一个内存数据库,用作另一个 “真实” 数据库(如 MySQL 或 PostgreSQL)前面的缓存,以帮助提高应用程序性能。...这为我们提供了一种在集群中传播数据的合理方式,当我们添加新的分片时,我们只需在系统之间移动哈希槽。...在许多用例中,如果你丢失了 Redis 存储的数据,这并不是世界末日。将其用作缓存或在其支持实时分析的情况下,如果发生数据丢失,则并非世界末日。...Forking 现在我们了解了持久化的类型,让我们讨论一下我们如何在像 Redis 这样的单线程应用程序中实际执行它。...Redis 是一个分配了大量内存的进程,那么它如何在不耗尽内存的情况下进行复制呢? 当你 fork 一个进程时,父进程和子进程共享内存,并且在该子进程中 Redis 开始快照(Redis)进程。

42220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    多图深入理解 Redis

    主要来说,Redis 是一个内存数据库,用作另一个“真实”数据库(如 MySQL 或 PostgreSQL)前面的缓存,以帮助提高应用程序性能。...首先,它确保当前的主实例和从实例正常运行并做出响应。这是必要的,因为哨兵(与其他哨兵进程)可以在主节点和/或从节点丢失的情况下发出警报并采取行动。...这为我们提供了一种在集群中传播数据的合理方式,当我们添加新的分片时,我们只需在系统之间移动哈希槽。...Forking 现在我们了解了持久化的类型,让我们讨论一下我们如何在像 Redis 这样的单线程应用程序中实际执行它。...Redis 是一个分配了大量内存的进程,那么它如何在不耗尽内存的情况下进行复制呢? 当你 fork 一个进程时,父进程和子进程共享内存,并且在该子进程中 Redis 开始快照(Redis)进程。

    70830

    与我一起学习微服务架构设计模式6—使用事件溯源开发业务逻辑

    EVENTS表添加一个列,以跟踪事件是否已发布。...基于非关系数据库事件存储库的幂等消息处理 NOSQL的事件存储库事务模型功能有限,简单的解决方案是消息的ID存储在处理它时生成的事件中,通过验证聚合的所有事件中是否有包含该消息的ID来做重复检测。...领域事件的演化 事件的结构经常随着时间的推移而变化,应用程序可能需要处理多个事件版本。 事件结构的演化 服务的领域模型随着时间的推移而发展,向事件添加字段,不大可能影响接收方。...如Eventuate Local包含一个存储事件的事件数据库(MySQL),一个向订阅者传递事件的事件代理(Kafka),以及一个将事件数据库中存储的事件发布到消息代理的事件中继。...当关系型数据库作为事件存储库时,应该如何创建Saga编排器 它可以在同一个ACID事务中更新事件存储库并创建Saga编排器。

    1.2K10

    敏捷持续集成持续交付DevOps基本理论全面解析

    在绿色环境处于活动状态时,仍然存在处理丢失的事务的问题,你可能能够以在绿色环境处于活动状态时将蓝色环境作为备份的方式向这两个环境提供交易。...另一种变化是使用相同的数据库,从而为Web和域层设置了蓝绿色的开关。使用这种技术,数据库通常可能是一个挑战,尤其是当您需要更改架构以支持软件的新版本时。技巧是将架构更改的部署与应用程序升级分开。...因此,首先应用数据库重构来更改架构以支持应用程序的新旧版本,进行部署,检查一切是否正常,以便您有一个回滚点,然后部署该应用程序的新版本。 (并且在升级失败后,删除对旧版本的数据库支持。)...通过应用“开关”技术,使用户在无感的情况下应用新特性的功能,软件提供商通过收集用户的实际操作记录来获得针对这个新特性的反馈数据。 当然,发布新特性,使用户无感还是比较难做到的。...对于可能需要轻松关掉的新功能(若发现有问题),开发人员可添加功能开关(feature toggles)。这是代码中的if-then软件功能开关,仅在设置数据值时才激活新代码。

    69810

    如何在服务器模式下安装和配置pgAdmin 4

    在您遵循本教程时,请务必创建一个新角色和数据库,因为您需要将pgAdmin连接到PostgreSQL实例。 在您的服务器上安装Python 3和venv。...在许多情况下,这可以提高安全性,但是在您希望外部程序(例如pgAdmin)连接到其中一个数据库的情况下,它也会导致问题。...该端口应设置为5432默认情况下,将这种设置的工作,因为这是PostgreSQL所使用的默认端口。 在“ 维护数据库”字段中,输入要连接的数据库的名称。请注意,必须已在服务器上创建此数据库。...添加列时,您需要为其指定名称和数据类型,如果您选择的数据类型需要,则可能需要选择长度。 此外,PostgreSQL官方文档指出,向表中添加主键通常是最佳做法。...在顶部,您将看到一个部分完成的INSERT语句,其中包含相应的表和列名称。继续使用一些虚拟数据替换问号(?),确保您添加的数据与您为每列选择的数据类型一致。

    9.5K41

    python3.7 的新特性

    Python这种语言旨在使复杂任务变得简单,最新版本Python 3.7已正式进入测试版发布阶段。...Python 3.7的最终版定于2018年6月发布,但此后不会为Python 3.7版本添加任何新功能。 Python 3.7最重要的添加和改进之处包括如下: 用类处理数据时减少样板代码的数据类。...最主要的原因是,在处理转换其他程序(比如数据库)记录的时间值时,可以避免丢失精度。 新的时间函数使用后缀_ns。...在POSIX语言环境中,UTF-8模式默认情况下已被启用,但在其他位置默认情况下被禁用,以免破坏向后兼容。...下面是你在使用最新版本的Python时可能会遇到的其他一些功能: 面向线程本地存储支持的C-API PEP 539中描述(https://www.python.org/dev/peps/pep-0539

    1.9K30

    关于Oracle Sharding,你想知道的都在这里

    数据库池作为单个逻辑数据库呈现给应用程序,应用程序通过在池中添加额外的数据库(分片),可以在任何平台上弹性扩展(数据,事务和用户)到任何级别, 使用Oracle数据库12.2.0.1的第一个版本支持扩展到...从应用程序开发人员的角度来看,SDB看起来像一个单一的数据库:分片的数量和跨越它们的数据的分布对数据库应用程序是完全透明的。 应用程序发出的SQL语句不引用分片,也不取决于分片数及其配置。...使用智能、数据相关的路由,实现卓越的运行时性能。 在不牺牲企业RDBMS功能的情况下实现分片的所有优点。...在以下情况下需要跨分片的数据迁移: 当一个或多个分片添加到SDB或从SDB中删除时 当跨分片的数据或工作负载分布存在偏差时 在由分片数量变化触发的分片之间重新分布数据的过程称为重新分片。...基于版本的重新定义在部署修改后端数据库对象的应用程序的新版本时提供了对分片的在线修补。 云上支持Oracle Sharding吗?

    1.9K80

    「首席架构师看敏捷数据」数据库重构:适应业务快速变化

    一旦你做了这些改变,你可以说你已经真正重构了你的代码,因为它仍然可以像以前一样再次运行。 重要的是要了解在重构时不添加功能。当您重构改进现有代码时,在添加功能时,您将添加新代码。...关于图4的一个有趣的事情是将Country列添加到Address。等一下,目录中没有添加列数据库重构。我们发现了一种新型的数据库重构吗?不。...在应用替换列数据库重构时,我们将包括用于添加PostCode列的DDL和用于实现触发器的数据定义语言(DDL),以在过渡期间维护PostCode和ZipCode列之间的值。 更新日志。...在我们的示例中,这将包括任何用于提高ZipCode列中值的质量的代码。 4.1.7更新外部程序 访问要重构的数据库模式部分的程序必须更新才能使用新版本的数据库模式。...图6.部署数据库重构的步骤。 ? 图7描述了如何安排应用程序预定义部署窗口的部署,如绿色所示。部署窗口(通常称为发布窗口)是允许将系统部署到生产中的特定时间点。

    1K20

    【安全设计】10种保护Spring Boot应用程序的绝佳方法

    SSL是不推荐的名称。TLS是一种通过计算机网络提供安全通信的加密协议。它的主要目标是确保计算机应用程序之间的隐私和数据完整性。 TLS/SSL证书过去很昂贵,HTTPS被认为很慢。...服务器使用名为Strict-Transport-Security的响应头字段将HSTS策略与浏览器通信。Spring Security在缺省情况下发送此头,以避免在开始时不必要的HTTP跳转。 2....升级是最安全的,就应用程序的整体健康而言,在您对应用程序进行任何必要的更改以使用新版本之后。 脆弱项目的补丁将从包中消除该漏洞,但通常会留下一个配置,该配置可能没有经过很好的测试。...要了解如何在Spring引导应用程序中使用OIDC,请参阅Spring Security 5.0和OIDC入门。要总结如何使用它,您需要向项目添加一些依赖项,然后在应用程序中配置一些属性。...它向您提供了一个报告,显示您的web应用程序可以在何处被利用,以及关于该漏洞的详细信息。 10. 您的安全团队是否进行了代码评审 代码评审对于任何高性能的软件开发团队都是必不可少的。

    3.8K30

    数据库分片(Database Sharding)详解

    但是在某些情况下,将某些表复制到每个分片中作为参考表是有意义的。例如,假设某个应用程序的数据库依赖于重量测量的固定转换率。...一旦你决定对数据库进行分片,接下来你需要弄清楚的是如何进行分片。在运行查询或将传入的数据分发到分片表或数据库时,关键是要将其分配到正确的分片。否则,它可能导致数据丢失或查询速度缓慢。...Key Based Sharding 基于键的分片 添加描述 为了确保数据记录以正确的方式被放置在正确的分片中,哈希函数中输入的值都应该来自同一列。此列称为分片键。...虽然基于键的分片是一种相当常见的分片架构,但在尝试动态添加或删除数据库中的其他服务器时,它会使事情变得棘手。...在添加服务器时,每个服务器都需要一个相应的哈希值,并且许多现有条目(如果不是全部)都需要重新映射到新的正确哈希值,然后迁移到相应的服务器。当您开始重新平衡数据时,新旧哈希函数都不会有效。

    11.4K72

    系统设计面试指南之分布式任务调度

    任务调度程序: 及时决定和分配资源给任务的过程称为任务调度。 当我们在 Facebook 发表评论时。我们不会让评论发布者等待直到那条评论被交付给所有关注者。...相反,我们有一组接收越来越多任务的节点。 ② Database(数据库) 任务提交者接收的所有任务都存储在分布式数据库。...使用关系数据库来存储: task IDs user IDs 所需资源 执行上限 客户端尝试总次数 延迟容忍度 ... 使用有向无环图(DAG)存储依赖任务的数据的图数据结构的非关系数据库。...我们不希望再次执行任务时最终结果发生更改。这在转账时对金融应用程序至关重要。我们要求任务是幂等的。幂等任务无论执行多少次都会产生相同的结果。...8.2 持久性 我们将任务存储在持久化分布式数据库中,并在接近执行时间时将任务推送到队列中。一旦提交任务,它就会在数据库中直到执行完成。

    19510

    系统设计面试指南之分布式任务调度

    任务调度程序: 及时决定和分配资源给任务的过程称为任务调度。 当我们在 Facebook 发表评论时。我们不会让评论发布者等待直到那条评论被交付给所有关注者。...相反,我们有一组接收越来越多任务的节点。 ② Database(数据库) 任务提交者接收的所有任务都存储在分布式数据库。...使用关系数据库来存储: task IDs user IDs 所需资源 执行上限 客户端尝试总次数 延迟容忍度 ... 使用有向无环图(DAG)存储依赖任务的数据的图数据结构的非关系数据库。...我们不希望再次执行任务时最终结果发生更改。这在转账时对金融应用程序至关重要。我们要求任务是幂等的。幂等任务无论执行多少次都会产生相同的结果。...8.2 持久性 我们将任务存储在持久化分布式数据库中,并在接近执行时间时将任务推送到队列中。一旦提交任务,它就会在数据库中直到执行完成。

    34510

    前沿观察 | 了解数据库分片(Database Sharding)

    但是在某些情况下,将某些表复制到每个分片中作为参考表是有意义的。例如,假设某个应用程序的数据库依赖于重量测量的固定转换率。...一些专业的数据库技术——如MySQL Cluster或某些数据库即服务产品(如MongoDB Atlas)确实包含自动分片功能,但这些数据库管理系统的普通版本却并不包含。...一旦你决定对数据库进行分片,接下来你需要弄清楚的是如何进行分片。在运行查询或将传入的数据分发到分片表或数据库时,关键是要将其分配到正确的分片。否则,它可能导致数据丢失或查询速度缓慢。...虽然基于键的分片是一种相当常见的分片架构,但在尝试动态添加或删除数据库中的其他服务器时,它会使事情变得棘手。...在添加服务器时,每个服务器都需要一个相应的哈希值,并且许多现有条目(如果不是全部)都需要重新映射到新的正确哈希值,然后迁移到相应的服务器。当您开始重新平衡数据时,新旧哈希函数都不会有效。

    91320

    Elasticsearch-深入理解索引原理

    类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。...这在一个index可以容纳的数据量和一个索引可以更新的频率上都是一个限制。 2.6.2动态更新索引 如何在不丢失不变形的好处下让倒序索引可以更改?答案是:使用不只一个的索引。...被”删除”的文档依旧可以被索引到,但是它将会在最终结果返回时被移除掉。 文档的更新同理:当文档更新时,旧版本的文档将会被标记为删除,新版本的文档在新的segment中建立索引。...2.6.4更新持久化 不使用fsync将数据flush到磁盘,我们不能保障在断电后或者进程死掉后数据不丢失。ES是可靠的,它可以保障数据被持久化到磁盘。...不希望丢失这些修改: 1.当一个文档被索引时,它会被添加到in-memory buffer,并且添加到Translog日志中,见Figure21. 2.refresh操作会让shard处于Figure22

    38220

    Ask Apple 2022 中与 Core Data 有关的问答

    在使用单 Container 的情况下,开发者可以通过 UserDefaults 的方式,控制应用程序在下次冷启动时,是否启用网络同步功能( 通过设置 cloudKitContainerOptions...是否必须添加新版本的 ModelQ:我们什么时候需要添加新的 CoreData model 版本?我看到关于轻量级迁移的相互矛盾的建议,为每个版本添加一个新版本是否更安全?...你的特定应用程序的写入速率可能需要不同的时间窗口,但是当使用 NSPersistentCloudKitContainer 清除历史记录时,可能会强制将存储文件数据全面同步到 CloudKit,因此不建议经常这样做...是否必须设置逆关系Q:在数据模型中设置关系的逆关系( 通常在创建关系时都会设置对应的逆关系 )有多重要?是否有可以不设置逆关系的相关例子?...从用户角度,旧版本将写入新版本从未见过的数据,而新版本将写入旧版本从未见过的数据。您将如何向您的用户解释这种差异?

    2.9K20

    MongoDB核心贡献者:不是MongoDB不行,而是你不懂!

    数据结构模型的弱化不等于没有数据结构模型 RDBMS一般都拥有一个预定义的数据结构模型:表格的行和列,每个字段都拥有名称和数据类型。如果你想给其中一行加一列,那么你必须给整个表格都添加一列。...总结:查询是区分大小写的,在牺牲速度的情况下可以利用正则表达式。 对输入的数据无容错性 当你尝试向传统数据库插入错误类型的数据,传统的数据库一般会把数据转换成预定义的类型。...Journaling MongoDB使用内存映射文件并且每60秒向磁盘输出一次通知,这就意味着最大程度上你可能丢失60秒加上向硬盘输出通知这段时间内所有的数据。...为了避免数据丢失,MongoDB从2.0版本起就添加了Journaling(默认情况下开启)。Journaling把时间从60秒更改为100ms。...而通过MongoDB发布的标准工具来恢复这些数据是件很容易的事情。查看官方文档以了解更多相关信息。 总结:故障恢复中丢失的数据将会出现在rollback目录里面。

    876100

    通过流式数据集成实现数据价值(3)- 实时持续数据收集

    让我们来讨论一下每种CDC方法的优点和缺点: 时间戳 通过使用现有的LAST_UPDATED或DATE_MODIFIED列,或者在应用程序中添加一个不可用的列,您可以在应用程序级创建自己的CDC解决方案...除了对应用程序的性能有重大影响之外,在应用程序更改时维护触发器还会导致管理负担。许多应用程序用户不希望在操作表中引入触发器,从而危及应用程序行为。...出于多种原因,流集成应该利用基于日志的CDC。它最小化了源系统的开销,减少了性能下降的机会。此外,它是非侵入性的。它不需要对应用程序进行更改,比如向表中添加触发器。...用户应该能够在移动数据时对其进行过滤,聚合,掩盖,转换和丰富其变化,而不会丢失交易环境。...修改源数据库架构并创建数据定义语言(DDL)语句后,流集成平台应能够在不暂停的情况下将模式更改应用于目标系统。

    1.2K30

    MongoDB 3.6中的新功能 (1) - 发展的速度

    作者:Mat Keep 翻译:TJ 我们都知道MongoDB 最新的版本3.6刚刚于去年12月发布,目前的最新版本是3.6.2。...在插入或修改文档时通过触发API调用来实现微服务架构中的数据同步。比如说,一条刚写入数据库的新客户订单可以自动触发生成发票和交货计划的操作。 数据变化时实时更新仪表板,分析系统及搜索引擎等。...可重试写入 向MongoDB添加可重写的写操作会将处理临时系统故障的复杂性从应用程序转移到数据库。...无法接受任何写入数据丢失的应用程序(如电子商务应用程序,交易交换和物联网传感器数据摄取)可立即受益于可重试写功能。...完整的数组更新能力 数组是MongoDB文档数据模型中的一个强大的数据结构,它允许开发人员在一个文档中表示复杂的对象,在一次调用数据库时就可以高效地检索这些对象。

    1.5K10

    【数据库设计和SQL基础语法】--表的创建与操作--表的修改和删除操作

    一、表结构修改 1.1 添加列 使用 ALTER TABLE 语句添加列 使用 ALTER TABLE 语句添加列是在现有表中引入新列的一种常见数据库操作。...一些数据库管理系统可能对修改约束条件有一些限制,例如,某些情况下可能需要先删除旧的约束再添加新的约束。在执行修改之前,请查阅数据库管理系统的文档以获取详细信息。...注意事项和潜在风险 在执行表的修改和删除操作时,有一些注意事项和潜在风险需要考虑: 数据丢失风险: 执行删除操作或修改表结构的操作可能导致数据丢失。...数据完整性: 在修改表结构或删除数据时,需要确保不破坏现有数据的完整性。例如,在删除列时,可能需要先迁移或删除相关的数据。 审计和监控: 在执行表的修改或删除操作之前,建议进行审计和监控。...执行这些操作需小心处理数据丢失、依赖关系、权限控制等问题,确保在低负载时操作,定期备份数据,以维护数据库的完整性和性能。

    38810
    领券