也许我错过了什么,这似乎太简单了。是否有可能使redis持久有一个主redis节点复制数据到一个从redis节点?
我的情况我有一个REST端点,在收到客户端的请求后,将有效载荷粘在redis队列中,然后返回成功(HTTP 200)给客户端。如果这个队列在消息被处理之前,在fsync发生之前就关闭了,我就失去了有效负载,没有人知道它。
我想知道,如果我可以简单地写两个redis队列(在不同的区域)一个主一个从。当我写'主' redis将自动写入相同的元素在从队列,只有这样,终端返回一个HTTP 200到客户端。
这可能吗?Redis将(i)需要一种写从机的方法,(ii)有一个同步API或可等待API,只有在确认有效负载已经写到主和从机时才会返回。这里的关键是redis允许调用者知道从服务器已经接收到事件。
如果客户端没有收到HTTP 200,他们知道他们应该再次尝试发送它。感觉好像有什么我没注意到的。
感谢这可能吗?
简短的回答。不,不可能。
Redis将(i)需要一种方法写从服务器
Redis可以复制数据到slave。然而,复制是异步的,这意味着它将在数据被写入slave之前返回响应给客户端。
(ii)有一个同步API或可等待API,它只会在确认有效负载已写入主服务器和从服务器时返回。
从Redis 3.0开始,它支持WAIT
命令,该命令将阻塞客户端,直到该客户端的写操作被复制到给定数量的slave。
这可能会缓解问题,至少您可以确保写操作已被复制到多个节点。但是,您仍然可能丢失数据。因为从服务器也可能在将数据持久化到磁盘之前关闭。