问题标签 [durability]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - 原子计数器 - redis vs postgres或其他?
我需要在云上实现一个原子计数器,以从并发连接中生成一个串行整数。背后的业务是跟踪服务器。
优先级要求:
- (必须)耐用- 确保一旦客户获得号码,其他客户将永远不会获得相同的号码。没有重复...
- (必须)可扩展- 当前负载为 10K/秒,未来 1M/秒,来自 200-1000 个并发客户端连接。以 100 递增的可扩展性功能
- (必须)< +-15ms 平均(postgres/mysql/redis 很棒,像 DynamoDB 这样的 http 延迟是不可能的)这只是为了过滤掉缓慢的解决方案
- (很高兴) increment by这是一种可伸缩性,客户端以一个块(例如 100)递增并管理应用程序内存中的增量。
- (很高兴拥有)5k/s 的票价 < 150 美元,并且预计价格将进一步增长。
- (很高兴拥有)HA(高可用性) ——我可以处理 0.01% 的故障,但持久性很重要,我不需要重复的数字。
我的替代方案是:
- postgres 序列
CREATE SEQUENCE serial CACHE 100; SELECT nextval(sequence)
- 140 美元/m MultiAZ AWS RDS db.m3.medium 不如 redis 快,但我认为平均 < 7 毫秒。“缓存”是一个强大的功能,应该可以提高性能。 - Redis INCR 与Redis Sentinel /RDS MultiAZ - cache.m3.medium MultiAZ - 120$/m - 耐用性有问题。
redis 具有 INCRBY,而 postgres 仅具有需要往返数据库的序列的“缓存”功能。
有输入吗?关于这两种选择或其他选择?
相关参考:
- 原子计数器 Postgres vs MongoDB
- http://redis.io/topics/persistence
- https://www.quora.com/When-should-I-use-redis-as-my-primary-data-store
- https://muut.com/blog/technology/redis-as-primary-datastore-wtf.html
- https://discuss.elastic.co/t/replacing-redis-with-elasticsearch-get-query-speed-counters-and-lists/5609/2
queue - RabbitMQ 耐用性
我在docker上使用rabbitMQ。
执行rabbitmq时,我想设置消息持久性(durable/transient)
。
有没有办法设置持久性?(声明队列和交换时除外)
rabbitmq - rabbitmq-server 开始通过持久队列丢失数据
在 Windows 上,当我使用rabbitmq-server
start
/stop
命令时,会删除 RabbitMQ 持久队列上的数据。当我启动 RabbitMQ 服务器时,似乎重新创建了队列。
如果我使用rabbitmqctl
stop_app
/ start_app
,我不会丢失任何数据。为什么?
如果我的服务器出现故障会发生什么情况?我如何确定我不会丢失数据?
database - 持久性在 DBMS 中的实际含义是什么?
从耐用性
一旦用户发出提交命令,则首先将事务写入存储在诸如硬盘之类的非易失性介质上的数据库文件中,这是在向用户确认已发生保存之前完成的。如果数据库在保存之前崩溃,则下次重新启动数据库时数据仍在事务日志中,但任何未提交的更改都将撤消或回滚。
- 说我开始交易
- 触发第一个插入语句;
- 触发第二个插入语句;
- 犯罪;
- 交易结束
现在,当用户在第 4 步提交时,
- 所有插入语句都在时间 T1 写入文件系统中的事务日志
- 确认发送给用户事务已提交,尽管它将在时间 T2 在步骤 3 中完成
- 现在交易在时间 T3 异步进行
以上理解正确吗?如果是,我的问题是为什么在第 3 步之后不发送确认信息?另外,如果 DB 机器在 T2 之前崩溃,那么事务将不持久怎么办?因此,使用日志,我们只是确保数据库是否在 T2 和 T3 时间崩溃,然后我们可以确保持久性
第二个理解 我相信所有事务语句都可以在语句被触发后立即写入日志,而不是在提交时执行。一旦提交完成,事务日志将被标记为提交并发送确认。现在即使数据库在确认后崩溃,数据库也会确保从事务日志中写入数据库文件。因此,基本上,Db 不是在提交时一次性编写所有事务语句,而是在它们触发时在日志中写入语句。在提交时,它只是将这些事务标记为提交,最终将写入日志中的数据库块
从 oracle 的角度来看这个问题
sql-server - 有没有真正耐用的数据库?
我正在阅读http://www.h2database.com/html/advanced.html#durability_problems我发现
一些数据库声称它们可以保证持久性,但这种说法是错误的。针对 H2、HSQLDB、PostgreSQL 和 Derby 运行了持久性测试。所有这些数据库有时都会丢失已提交的事务。该测试包含在 H2 下载中,请参阅 org.h2.test.poweroff.Test
它还说
如果不能接受丢失交易,则应使用笔记本电脑或 UPS(不间断电源)。
那么是否有任何数据库是持久的。该文件说 fsync() 命令和大多数硬盘驱动器不服从 fsync()。它还谈到没有可靠的方法来刷新硬盘驱动器缓冲区
那么,是否有一段时间,承诺的交易会变得持久,所以我们可以购买提供最少那么多备用电源的 ups。
还有一种方法可以知道提交的事务是持久的。假设我们不购买 ups,并且在知道交易是持久的之后,我们可以显示成功消息。
java - 为什么持久订阅一次只能有一个活跃订阅者
来自官方文档
以更高的开销为代价,您可以使用 Session.createDurableSubscriber 方法来创建持久订阅者。持久订阅一次只能有一个活动订阅者
你能解释一下为什么选择了设计吗?
从我的角度来看,主题是特别针对我们有很多订阅者的情况而设计的。
couchbase - 沙发底座高耐用性
我想使用 couchbase 设计一个银行系统,我需要高持久性(如 RDBMS),我怎样才能实现 100% 的持久性而不丢失一点数据?
我知道我可以使用persist_to
和replicate_to
耐用
1-如果我有6台服务器并且我选择persist_to=3
,我如何确保数据是持久的,例如如果活动节点是server1并且我的数据持久化到 server1,server2和server3,并且我们在server1上出现故障,什么如果server4 - 内存或磁盘中没有数据 - 变为活动状态?
2-如何从 SDK 动态检测集群的大小?并设置persist_to
为多数 (numberOfNodes/2+1)
transactions - 处理 Couchbase 中的耐久性要求失败
最近,我开始调查 Couchbase Server 作为该项目的候选者。我现在正在研究的一个特定场景是如何使 Couchbase 充当“事实来源”,这就是我深入研究耐用性方面的原因。
所以这里是ACID Properties 和 Couchbase的一个片段:
如果持久性要求失败,那么 Couchbase 可能仍会保存文档并最终将其分发到集群中。我们所知道的是,就 SDK 所知,它并没有成功。您可以选择根据此信息采取行动,将更多 ACID 属性引入您的应用程序。
那么接下来想象一下。我插入/更新一个文档,主节点失败,直到数据进入任何副本。假设primary已经消失了很长时间。现在,我现在不知道数据是否已写入磁盘......所以这里一个可怕的部分是“Couchbase 可能仍会保存文档并最终将其分布在整个集群中”。这意味着,据客户所知,数据没有成功,因此用户会看到一个错误,但是如果主节点重新上线,它可能会突然出现在系统中。
我是否正确阅读了此声明?如果我是,用 Couchbase 处理它的最佳做法是什么?
c - 通过在文件/行处自动终止 C 程序来测试持久性?
我正在编写一些使用fsync()
系统调用来确保文件持久保存到磁盘的软件。我以前做过,而且我知道您需要注意的各种“陷阱”(即,在替换文件时,您需要fsync()
对该文件,发出 a rename()
,然后fsync()
是包含目录。对软件进行持久编码将文件写入磁盘很好。
测试软件是另一回事。我想验证它在遇到停电等情况时是否正常运行。我的身体反应还不错,但还不足以拔掉两条 CPU 指令之间的电源线。
我应该如何测试写入磁盘的 C 程序的持久性?
(正如标题所暗示的那样,我假设您使用某种类似调试器的软件,可能使用ptrace()
, 来在特定文件/行处自动终止您的程序,如可执行文件的调试信息中所列。)
mongodb - MongoDB:当主节点失败时
我想了解 MongoDB 提供哪些保证(如果有的话),因为它与 Primary 永久或暂时失败的情况下的数据持久性有关,或者当它在网络级别与副本集的其余部分分离时。
我了解 w:1 写问题会发生什么。我理解日记的作用。
我不明白 MongoDB 如何决定在选择新主节点时保留哪些写入以及丢弃哪些写入。在 4 节点(+arbiter)集群中,N1 为主节点,N2、N3、N4 次节点,在这种情况下:
- {w:majority, j:true} 写入命中主节点。
- 辅助节点轮询更改,主节点等待多数确认。
- N2 确认更改。
- N3 已收到更改并正在应用中。
- 初级下降。
- N3 无法向 Primary 确认它已应用更改。
- 选举是强制的。
问题:
- 选举完成后写入是否可用?
- 哪个节点将成为新的主节点有关系吗?
- 如果第 4 步没有发生,结果会有所不同吗?
- 如果 Primary 已收到 N3 的确认,结果是否会有所不同?
- 如果 Primary 已确认写入,并且 N2 复制了写入被多数确认的事实,结果是否会有所不同?
- 如果 N2 和 N3 都复制了写入被多数人确认的事实,结果是否不同?