如何将 YugabyteDB 设置为最终一致的分布式键值数据库?
How to setup YugabyteDB as eventually consistent distributed key-value database?
我正在创办一家提供 Web SaaS 的初创公司 (https://tuilder.com/)。大计划和潜力。
我对使用 YugaByte 进行全球复制很感兴趣。目前我已经在 BadgerDB 上构建了一个抽象,BadgerDB 是一个用 GoLang 编写的键值数据库。我们的抽象维护索引,有点像 graphql,而且非常快。是否可以使用具有全局复制功能的 YugaByte DB 作为键值存储?
我的目标是全球分布式 KeyValue 的性能。
据我所知,写入速度会随着每个额外的复制节点而降低。那正确吗?是否有可能转而支持速度并在节点之间建立最终一致的模型?
我们正在构建 JAM 堆栈。所以我们需要在 YugaByte 和客户端之间的服务器上建立一个身份验证层,理想情况下,这一层将提供我们目前在 Go 中编写的相同抽象。
将请求路由到最近的地理位置的节点之间的负载平衡如何?
YugaByte 平台可以做到这一切吗?
感谢您对 Yugabyte DB 的关注!这绝对是一个很好的用例。请查看内联答案。
I’m interested in global replication with YugaByte. At the moment I have built an abstraction over BadgerDB, a Key-Value database written in GoLang. Our abstraction maintains indexes, is kind of graphql-ish, and extremely FAST. Is it possible to use YugaByte DB with global replication as a Key Value store, instead of GoLang? I’m aiming for the performance of KeyValue, Globally Distributed.
是的,Yugabyte DB绝对可以实现高性能、全局分布式的key-value部署。您可以看到 globally distributed deployment here.
的示例
As I understand the speed of writes decreases with each additional replicated node. Is that right? Is it possible to instead favour speed and have an eventually-consistent model across the nodes instead?
作为一般规则,是的,延迟随着复制因子的增加而增加。复制因子主要是为了提高容错能力,但看起来您希望在靠近最终用户的地方提供读取服务。在这种情况下,您有两个选择:
只读副本 是集群中主要数据 的只读扩展。在这种场景下,集群的主数据部署在一个地域的多个可用区,或者相邻的地域。只读副本不会增加写入延迟,因为写入不会将数据同步复制到它们 - 数据会异步复制到只读副本。您可以写入副本,但写入会在内部重定向到真实来源。
多主机部署 目前正在作为我们 2.0 版测试版的一部分发布。此功能允许 independent 集群以 last writer wins 语义相互复制。这里有一个detailed design doc about multi-master deployments.
假设您想要全局读取和单个集群,我认为只读副本可能就是您要找的。
So we need an authentication layer on the server between YugaByte and the client, ideally this layer would provide the same abstraction we currently have written in Go.
是的,Yugabyte DB 在 Go 客户端驱动程序中支持 authentication and RBAC for authorization。
What about load-balancing between nodes routing requests to the closest geographical location?
YCQL API 目前支持从今天最近的地理区域读取,因此您应该已经能够轻松实现这一点。 YCQL API 是半关系型的,但对于键值应用程序而言,这应该足够了!
希望对您有所帮助,如果您还有其他问题,请告诉我!
As I understand the speed of writes decreases with each additional replicated node. Is that right?
之前的答案假定 additional replicated node
实际上是一个额外的副本。但是,如果它意味着集群中的新节点,那么答案是新节点不会增加写入延迟。一个新节点只是为集群提供更多的写入(和读取)吞吐量,因为它现在可以托管集群中存在的一些领导者和跟随者分片(也称为平板电脑)。键值写入操作的延迟由集群的复制因子 (RF) 控制,对于生产部署,典型的 RF 为 3。在这样的部署中,每个分片将有 3 个副本,位于集群的 3 个独立节点。在向应用程序客户端确认操作成功之前,写入必须在领导者副本和 2 个跟随者副本中的至少 1 个提交。综上所述,写操作的延迟只有在执行以下操作之一或同时执行时才会增加:
增加托管 3 个副本的节点之间的地理距离
将 RF 从 3 增加到 5(这将导致 4 个副本中有 3 个需要在客户端确认之前提交写入)。
Is it possible to instead favour speed and have an eventually-consistent model across the nodes instead?
在 Yugabyte DB 中不可能实现最终一致性,因为在处理写入请求的节点之间依赖于每个分片的分布式共识(使用 Raft 作为共识协议)。您可以在 "Paxos/Raft vs. Non-Consensus Replication Protocols" 部分下的 post How Does Consensus-Based Replication Work in Distributed Databases? 中查看 Raft 与最终一致性的不同之处。正如上一个答案中强调的那样,当跨区域写入延迟成为一个问题时,解决方案是使用只读副本集群(用于在远离接收写入请求的区域的区域中支持时间线一致的读取)或多区域使用异步复制-Master Clusters(用于通过 Last Writer Wins 解决冲突的写入请求来支持多个区域中的写入)。
我正在创办一家提供 Web SaaS 的初创公司 (https://tuilder.com/)。大计划和潜力。
我对使用 YugaByte 进行全球复制很感兴趣。目前我已经在 BadgerDB 上构建了一个抽象,BadgerDB 是一个用 GoLang 编写的键值数据库。我们的抽象维护索引,有点像 graphql,而且非常快。是否可以使用具有全局复制功能的 YugaByte DB 作为键值存储?
我的目标是全球分布式 KeyValue 的性能。
据我所知,写入速度会随着每个额外的复制节点而降低。那正确吗?是否有可能转而支持速度并在节点之间建立最终一致的模型? 我们正在构建 JAM 堆栈。所以我们需要在 YugaByte 和客户端之间的服务器上建立一个身份验证层,理想情况下,这一层将提供我们目前在 Go 中编写的相同抽象。
将请求路由到最近的地理位置的节点之间的负载平衡如何?
YugaByte 平台可以做到这一切吗?
感谢您对 Yugabyte DB 的关注!这绝对是一个很好的用例。请查看内联答案。
I’m interested in global replication with YugaByte. At the moment I have built an abstraction over BadgerDB, a Key-Value database written in GoLang. Our abstraction maintains indexes, is kind of graphql-ish, and extremely FAST. Is it possible to use YugaByte DB with global replication as a Key Value store, instead of GoLang? I’m aiming for the performance of KeyValue, Globally Distributed.
是的,Yugabyte DB绝对可以实现高性能、全局分布式的key-value部署。您可以看到 globally distributed deployment here.
的示例As I understand the speed of writes decreases with each additional replicated node. Is that right? Is it possible to instead favour speed and have an eventually-consistent model across the nodes instead?
作为一般规则,是的,延迟随着复制因子的增加而增加。复制因子主要是为了提高容错能力,但看起来您希望在靠近最终用户的地方提供读取服务。在这种情况下,您有两个选择:
只读副本 是集群中主要数据 的只读扩展。在这种场景下,集群的主数据部署在一个地域的多个可用区,或者相邻的地域。只读副本不会增加写入延迟,因为写入不会将数据同步复制到它们 - 数据会异步复制到只读副本。您可以写入副本,但写入会在内部重定向到真实来源。
多主机部署 目前正在作为我们 2.0 版测试版的一部分发布。此功能允许 independent 集群以 last writer wins 语义相互复制。这里有一个detailed design doc about multi-master deployments.
假设您想要全局读取和单个集群,我认为只读副本可能就是您要找的。
So we need an authentication layer on the server between YugaByte and the client, ideally this layer would provide the same abstraction we currently have written in Go.
是的,Yugabyte DB 在 Go 客户端驱动程序中支持 authentication and RBAC for authorization。
What about load-balancing between nodes routing requests to the closest geographical location?
YCQL API 目前支持从今天最近的地理区域读取,因此您应该已经能够轻松实现这一点。 YCQL API 是半关系型的,但对于键值应用程序而言,这应该足够了!
希望对您有所帮助,如果您还有其他问题,请告诉我!
As I understand the speed of writes decreases with each additional replicated node. Is that right?
之前的答案假定 additional replicated node
实际上是一个额外的副本。但是,如果它意味着集群中的新节点,那么答案是新节点不会增加写入延迟。一个新节点只是为集群提供更多的写入(和读取)吞吐量,因为它现在可以托管集群中存在的一些领导者和跟随者分片(也称为平板电脑)。键值写入操作的延迟由集群的复制因子 (RF) 控制,对于生产部署,典型的 RF 为 3。在这样的部署中,每个分片将有 3 个副本,位于集群的 3 个独立节点。在向应用程序客户端确认操作成功之前,写入必须在领导者副本和 2 个跟随者副本中的至少 1 个提交。综上所述,写操作的延迟只有在执行以下操作之一或同时执行时才会增加:
增加托管 3 个副本的节点之间的地理距离
将 RF 从 3 增加到 5(这将导致 4 个副本中有 3 个需要在客户端确认之前提交写入)。
Is it possible to instead favour speed and have an eventually-consistent model across the nodes instead?
在 Yugabyte DB 中不可能实现最终一致性,因为在处理写入请求的节点之间依赖于每个分片的分布式共识(使用 Raft 作为共识协议)。您可以在 "Paxos/Raft vs. Non-Consensus Replication Protocols" 部分下的 post How Does Consensus-Based Replication Work in Distributed Databases? 中查看 Raft 与最终一致性的不同之处。正如上一个答案中强调的那样,当跨区域写入延迟成为一个问题时,解决方案是使用只读副本集群(用于在远离接收写入请求的区域的区域中支持时间线一致的读取)或多区域使用异步复制-Master Clusters(用于通过 Last Writer Wins 解决冲突的写入请求来支持多个区域中的写入)。