根据CAP理论,Cassandra最终只能具有一致性.更糟糕的是,如果我们在一次请求中有多次读写而没有正确处理,我们甚至可能失去逻辑一致性.换句话说,如果我们快速做事,我们可能做错了.
同时,为Cassandra设计数据模型的最佳实践是考虑我们将要拥有的查询,然后添加一个CF. 通过这种方式,添加/更新一个实体意味着在许多情况下更新许多视图/ CF. 没有原子事务功能,很难做到正确.但有了它,我们又失去了A和P部分.
我不认为这涉及很多人,因此我想知道为什么.
我的团队需要找到以下问题的解决方案:
我们的应用程序允许用户查看企业的总销售额,按产品划分的总计,按地区划分的总数,按地区x产品划分的总数,按地区划分的总数等.您可以了解相关信息.有许多值需要聚合以获得许多无法动态计算的总数 - 我们必须预先聚合它们以提供合适的响应时间,这个过程大约需要5分钟.
问题,我们认为是一个常见的问题,但没有参考,是如何在不关闭用户的情况下允许更新各种销售.此外,用户无法接受最终的一致性 - 如果他们总共向下钻取12个,他们最好看到总数为12的数字.因此,我们需要一致性+可用性.
到目前为止,我们提出的最佳解决方案是将所有查询定向到冗余数据库,"B"(针对查询进行了优化),同时将更新定向到主数据库"A".当我们决定花5分钟更新所有聚合时,我们更新数据库"C",这是另一个冗余数据库,就像"B"一样.然后,新用户会话被定向到"C",而现有用户会话继续使用"B".最后,警告任何人使用"B",我们杀死"B"上的会话并在那里重新聚合,交换"B"和"C"的角色.典型的排水停止方案.
我们感到惊讶的是,我们无法找到任何关于此的讨论,并担心我们过度设计这个问题,或者可能不是我们认为的问题.任何建议都非常感谢.
就CAP定理而言,MongoDB通常默认定义为CP.在副本集方案中,以下是否正确?该选项w是写作问题:
{ w: 1 }:等待仅从主要确认.如果我们从次要成员读取,系统最终是一致的,然后是AP.{ w: 3 }:等待三名成员的确认.如果副本由三个成员组成,则系统是一致的(强?),因此CP.CloudSearch的结果只是最终一致的.
在我的95%的应用程序中,这是它提供的性能和冗余的可接受的权衡.
在最后的5%中,我发现自己发布了一个新的SDF文档,然后立即运行一个查询,我需要反映我刚刚做的POST.
目前,我有一个拼凑在一起的解决方案,涉及轮询CloudSearch,直到结果符合我的预期,直接在POST之后.不幸的是,当我有多个用户时,这会产生许多问题,包括与额外读取相关的成本($)增加到竞争条件.
处理这种情况有什么最佳做法吗?
来自AWS论坛的xpost:https://forums.aws.amazon.com/thread.jspa?messageID = 470636
编辑:有关我的具体用例的其他信息.
我正在搜索带有大量布尔查询的搜索结果,我希望能够更新一个或多个文档,使它们不再出现在查询中,然后刷新视图以显示结果.
具体来说,我有一堆带有布尔值的文档,标记为"已归档"
当我在未归档的视图中查看它们,然后将它们标记为已归档时,我希望能够刷新视图而不显示这些项目.
我也使用CloudSearch进行排序/过滤/分页,这使得插入或修改本地副本变得很困难
consistency eventual-consistency amazon-web-services amazon-cloudsearch
我正在设计JSF中的一些"数据块",我从每个块的Java bean中获取数据.我的问题是我的块从多个表中获取数据.例如:
描述客户个人数据的块包括:
我将不得不访问3个单独的表来填充此块.而不是构建3个不同的DAO(每个表一个),每块构建一个DAO不是更好吗?我理解这种方式在一致性方面存在缺点,因为如果一个表将被多个DAO访问,则表的每次更改都必须应用于每个表.但根据我的具体业务逻辑,我的代码将更容易理解.这有什么其他缺点?通常建议创建可以访问许多表的DAO吗?
在docker中管理和备份数据的建议策略如下所示:
docker run --name mysqldata -v /var/lib/mysql busybox true
docker run --name mysql --volumes-from mysqldata mysql
docker run --volumes-from mysqldata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /var/lib/mysql
Run Code Online (Sandbox Code Playgroud)
但是,当我以这种方式备份运行容器时,我不会获得一致的备份,是吗?我知道像这样的工具mysqldump,但是如果我需要备份,例如,不断添加和删除文件的文件夹,该怎么办?
(我找不到一个好的消息来源解释这个,所以如果它在其他地方可用,你可以指出我)
Hazelcast在群集中的所有节点上复制数据.因此,如果在其中一个节点中更改了数据,节点是否会更新自己的副本,然后将其传播到其他节点?
我在某处读到每个数据都归节点所有,Hazelcast如何确定所有者?业主是根据数据结构中的每个数据结构还是按键确定的?
Hazelcast遵循"最终一致"的原则吗?(当数据在节点之间传播时,可能会有一个小窗口,在此期间数据可能在节点之间不一致)
如何处理冲突?(两个节点同时更新相同的键值)
我知道Cassandra具有不同的读取一致性级别但我没有看到一致性级别,它允许仅通过密钥从一个节点读取数据.我的意思是如果我们有一个复制因子为3的集群,那么我们将在读取时始终询问所有节点.即使我们选择一致性级别,我们也会询问所有节点,但是等待来自任何节点的第一个响应.这就是为什么我们在读取时不仅要加载一个节点而是加载3个(带有协调器节点的4个节点).我认为即使我们设置了更大的复制因子,我们也无法真正提高读取性能.
是否可以仅从单个节点读取?
replication consistency cluster-computing database-replication cassandra
我们正在选择最佳选项,以实现由多个(例如3个)实例组成的服务(用Java编写)的领导者选举,以实现高可用性。我们的目标是在任何给定时间仅激活一个实例。
非常高兴听到您对以下选项的意见:
1)Hazelcast。使用“法定人数”和一把锁,我们可以实施领导者选举。但是,我们可能会遇到裂脑问题,一段时间内可能会出现两名领导人。另外,似乎Hazelcast不支持SSL。
2)Zookeeper。我们可以在Zookeeper集成(在我们的每个服务实例上运行ZK节点)的顶部实现领导者选举。Zookeeper是否比Hazelcast提供更好的一致性保证?它也遭受脑裂问题困扰吗?
3)等 我们可以使用Jetcd库,它似乎是最现代,最强大的技术。在一致性方面真的比Zookeeper好吗?
谢谢。
high-availability consistency hazelcast etcd apache-zookeeper
consistency ×10
cassandra ×2
hazelcast ×2
aggregates ×1
algorithm ×1
backup ×1
caching ×1
dao ×1
database ×1
distributed ×1
docker ×1
etcd ×1
in-memory ×1
mongodb ×1
oop ×1
replication ×1