目前,我们使用Redis作为内存中的快速缓存。它工作得很好。问题是,一旦Redis重启,我们需要通过从持久化存储中获取数据来重新填充它。这会使我们的持久存储超载,超出其容量,因此恢复需要很长时间。
我们研究了Redis持久化选项。最好的选择(不会影响性能)是使用AOF和'appendfsync with‘。但是使用这个选项,我们可以丢失最后一秒的数据。这是不可接受的。将AOF与“appednfsync”一起使用会有相当大的性能损失。
因此,我们正在评估单节点Aerospike。它是否保证在断电时不会丢失数据?也就是说,为了响应写操作,一旦Aerospike向客户端发送成功,即使我拔下服务器的电源线,数据也永远不会丢失。正如我在上面提到的,我相信Redis可以通过“appednfsync”选项来保证这一点。但我们没有考虑它,因为它有相当大的性能损失。
如果Aerospike可以做到这一点,我想详细了解持久化是如何在Aerospike中工作的。请分享一些资源来解释同样的问题。
我们不是在寻找分布式系统,因为对我们来说,强一致性是必须的。数据不应该在节点故障或大脑分裂的情况下丢失。
如果不是aerospike,你能告诉我另一个可以帮助实现这一点的工具吗?
发布于 2016-04-28 05:30:18
这不是数据库问题,而是硬件和风险问题。
所有(具有持久性的)数据库都以相同的方式工作,一些数据库直接将数据写入物理磁盘,而另一些数据库则告诉操作系统写入数据。确保每次写入都是安全的唯一方法是等待磁盘确认写入数据。
这是没有办法的,正如您所看到的,它会极大地降低吞吐量。这就是为什么数据库使用内存缓冲区,并在短时间间隔内将批量数据从缓冲区写入磁盘的原因。但是,这意味着在将数据写入缓冲区之后、写入磁盘之前发生的机器问题(电源、磁盘故障等)可能会导致数据丢失。
在一台服务器上,您可以通过多个电源、备用电池和其他保护措施来购买保护,但这很快就会变得棘手和昂贵。这就是为什么分布式架构在今天的可用性和冗余性方面如此普遍。分布式系统并不意味着失去一致性,相反,它们可以通过保护您的数据来帮助确保一致性。
解决问题的最简单方法是使用允许复制的数据库,以便每次写入至少到两台不同的机器上。这样,一台断电的机器不会影响对另一台机器的写操作,您的数据仍然是安全的。
您仍需要在更高级别防止可能影响所有服务器(如整个数据中心断电)的停电,但您可以通过跨更多边界分布来解决此问题。这完全取决于你能接受多大的风险。
在调整数据库中的磁盘写入间隔和使用适当的分布式体系结构之间,您可以获得所需的一致性和性能需求。
发布于 2016-04-20 20:00:29
我为航空公司工作。您可以选择将命名空间存储在内存、磁盘或具有磁盘持久性的内存中。在所有这些场景中,与Redis在现实世界的基准测试中相比,我们的表现都很好。
考虑磁盘上的存储当写入发生时,它在被刷新到磁盘之前命中缓冲区。直到该缓冲区被成功地写入,ack才返回到客户端。如果您在缓冲区刷新之前拔出电源线,则在单节点群集中,写入可能已确认到客户端,然后丢失。
答案是在群集中有多个节点和一个replication-factor >= 2。然后,写入将转到客户端和复制副本上的缓冲区,并且必须在两者上都成功,然后才能作为成功确认到客户端。如果从一个节点拉出电源,则副本仍将存在于另一个节点上,不会丢失任何数据。
因此,是的,可以在最低成本和最小延迟的情况下,使Aerospike具有最大的弹性。最好的做法是下载社区版,看看您的想法。我想你会喜欢的。
发布于 2016-04-20 18:03:03
我相信/etc/aerospike/aerospike.conf会满足您的需求,您可以在aerospike.conf中的命名空间(即DB)级别将其配置为混合存储
有关详细信息,请参阅此处的官方文档:http://www.aerospike.com/docs/operations/configure/namespace/storage/
https://stackoverflow.com/questions/36739117
复制相似问题