金融科技和电子商务服务需要处理大量交易,对性能、可靠性和韧性有着苛刻的要求。在这些领域的服务中,特定一笔交易的数据存储量可能没有媒体或游戏等其他行业那么大,但企业必须严格遵守安全性、延迟和一致性标准。
本文概括介绍了一种分布式键值(Key-value,KV)存储架构,该架构能为全球化金融科技服务和银行系统间的用户注册提供支持。其中,存储的数据代表用户的信用卡信息,这些信息还会在存储系统中进行加密。这个键值存储采用了NATS和JetStream持久性引擎来实现,部署在Akamai Connected Cloud的11个核心计算区域。该系统能存储数亿个密钥,同时保证注册请求的低延迟,并提供了快速发布和更新键值数据的高韧性方法。
分布式键值存储工作流
从较高层面来看,键/值注册数据的存储和请求工作流程如下:
- 将键值数据加载到NATS主集群。
- NATS协议将数据传播到10个不同核心计算位置的10个NATS叶节点。
- 每个NATS叶节点前的HTTPS网关接受来自Akamai Global Load Balancer的注册请求。
- 用户向Global Traffic Manager提交注册请求。负载均衡器根据用户位置将请求路由到性能最好的NATS节点。
可应对的挑战
延迟敏感性
确定造成高延迟的源头,将这些组件的延迟影响降至最低。
为该用例设计的键值存储架构需要确保对所有请求的响应延迟不能超过60毫秒。在该架构的测试中,连接和TLS协商时间通常小于10毫秒,建立连接后的等待时间也小于10毫秒。实现这种性能的原因在于:存储架构可在广泛的地理区域内缓存数据,允许跨区域用户向附近的存储节点发出低延迟请求。
键值数据首先存储在主NATS集群中,然后再缓存到按地理位置分布的叶节点。NATS内置的JetStream持久层引擎可在主集群中创建键值持久层。如果不使用JetStream,核心NATS软件就无法提供这种持久性。
JetStream还使用NATS优化的RAFT仲裁算法使叶节点与主集群保持同步。这种算法可支持极高程度的水平扩展,从而使架构能够扩展到新区域。Akamai的计算区域遍布全球,为该服务的扩展提供了充分支持。由于所有这一切都是通过相同软件完成的,因此这种扩展的配置和操作都相对简单。
韧性
确保能够无差错地处理用户注册请求。
键值存储架构还要求在运行时尽量减少错误,无论是用户对服务提出的请求,还是接受新键值数据进入集群的更新操作,都是如此。
由于数据是在一系列不同计算区域缓存的,因此一个或多个叶节点出现故障不会导致服务中断。基于DNS的Akamai Global Traffic Manager会将用户请求路由到宕机时仍然可用的叶节点。当某个叶节点在停机后恢复服务后,JetStream仲裁算法会将其数据恢复到与其他节点一致的状态。
优先存储了键值数据的主集群本身由三个节点组成。如果其他两个节点宕机,该集群只需一个节点就能继续运行。与叶节点一样,JetStream仲裁算法将在其他主集群节点恢复服务时恢复它们的数据。
数据一致性
在分布式存储集群中快速传播对用户数据进行的更改。
键值数据缓存在多个核心计算区域内,对任何两个位置发起的相同请求都必须能返回一致的数据。当主集群中的数据更新在网络上传播时,不同叶节点存储的数据可能会出现差异。
因此快速传播这些更新操作就成了一个重要的前提要求。在测试这种架构时,JetStream使用的仲裁算法能在不到100毫秒的时间内实现全网一致性。
分布式键值存储设计示意图
该解决方案在Akamai Connected Cloud上创建了一个键值存储服务。这个服务由一个计算区域的主存储集群和安装在其他十个计算区域的十个存储叶节点组成。Akamai Global Traffic Management负责将用户请求路由到叶节点。
- 发布键值数据:键值数据通过NATS客户端软件异步加载到主存储集群中。
- JetStream使用NATS优化的Raft仲裁算法在主集群的三个节点上更新数据。
- JetStream的仲裁算法更新安装在其他Akamai计算区域的10个NATS叶节点上的数据。
- 用户请求:用户向存储服务发出HTTPS请求。请求中以编码的方式包含了用户希望检索的数据对应的键,例如https://example.com/kv/{key}
- Akamai Global Traffic Management使用DNS将请求路由到存储叶节点。对叶节点进行有效性检查,以便只将请求路由到可用节点。根据用户所在位置,选择延迟最低、性能最佳的节点。
- HTTPS/NATS网关NGINX收到请求,并使用请求URL中编码的键从叶节点检索键值数据。
涉及的系统和组件
- 一个主NATS集群:由安装在核心计算区域的3个节点组成。NATS是一种数据通信技术,用于以“发布-订阅”模式在服务间发送消息。核心NATS不为这些数据提供持久性。
- 内置的JetStream持久引擎用于在集群上实现键值存储。JetStream的仲裁算法可保持三个节点间键值数据的一致性。
- 键值数据首先通过NATS协议上传到主集群。
- 十个NATS叶节点安装在十个计算区域。当主集群更新键值数据时,JetStream的仲裁算法会更新这些节点上的数据。
- 每个NATS叶节点都有一个HTTPS网关,安装在与叶节点相同的计算区域。这些网关会侦听包含键值对的键文本的URL请求,例如:https://example.com/kv/{key}
- 网关从相应的NATS叶节点检索键值。
- Akamai Global Traffic Management负责接受用户对服务的请求,并将请求路由到可用叶节点,为用户所在位置提供最低的延迟。
通过这样的设计,这套高性能键值存储解决方案即可在全球范围内为不同位置的用户提供快速、可靠、一致的数据访问。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。