Der Redis-Cluster garantiert keine starke Konsistenz. In einigen speziellen Szenarien kann es vorkommen, dass der Client auch dann Daten verliert, wenn er eine Schreibbestätigung erhält.
Szenario 1: Asynchrone Replikation
- Client schreibt an Master B
- Master B antwortet mit OK
- Master B synchronisiert mit Slave B1 B2 B3
B antwortet dem Client, ohne auf die Bestätigung von B1 B2 B3 zu warten. Wenn der Master ausfällt, bevor die Slave-Synchronisierung abgeschlossen ist, wird einer der Slaves als Master ausgewählt und die zuvor vom Client geschriebenen Daten gehen verloren. Der Befehl
wait
kann in diesem Szenario die Datensicherheit verbessern. wait
命令可以增强这种场景的数据安全性。
wait
会阻塞当前 client 直到之前的写操作被指定数量的 slave 同步成功。
wait
可以提高数据的安全性,但并不保证强一致性。
因为即使使用了这种同步复制方式,也存在特殊情况:一个没有完成同步的 slave 被选举为了 master。
场景2:网络分区
6个节点 A, B, C, A1, B1, C1
,3个master,3个slave,还有一个client,Z1
。
发生网络分区之后,形成了2个区,A, C, A1, B1, C1
和 B Z1
。
这时 Z1 还是可以向 B 写入的,如果短时间内分区就恢复了,那就没问题,整个集群继续正常工作,但如果时间一长,B1 就会成为所在分区的 master,Z1 写入 B 的数据就丢了。
maximum window(最大时间窗口)
可以减少数据损失,可以控制 Z1 向 B 写入的总数:
过去一定时间后,分区的多数边就会进行选举,slave 成为 master,这时分区少数边的 master 就会拒绝接收写请求。
这个时间量是非常重要的,称为节点过期时间。
一个 master 在达到过期时间后,就被认为是故障的,进入 error 状态,停止接收写请求,可以被 slave 取代。
小结
Redis Cluster 不保证强一致性,存在丢失数据的场景:
在 master 写成功,但 slave 同步完成之前,master 宕机了,slave 变为 master,数据丢失。
wait
wait
blockiert den aktuellen Client, bis der vorherige Schreibvorgang erfolgreich durch die angegebene Anzahl von Slaves synchronisiert wurde. -
wait
kann die Datensicherheit verbessern, garantiert jedoch keine starke Konsistenz.
Denn selbst wenn diese synchrone Replikationsmethode verwendet wird, gibt es eine besondere Situation: Ein Slave, der die Synchronisierung noch nicht abgeschlossen hat, wird zum Master gewählt. Szenario 2: Netzwerkpartition 6 Knoten A, B, C, A1, B1, C1
, 3 Master, 3 Slaves und ein Client, Z1
Code> . Nach der Netzwerkteilung wurden 2 Zonen gebildet . A , C, A1, B1, C1
und B Z1
.
🎜🎜🎜Zu diesem Zeitpunkt kann Z1 noch Fragen stellen ritten, wenn innerhalb einer kurzen Wenn die Partition wiederhergestellt wird, gibt es kein Problem. Der gesamte Cluster funktioniert jedoch weiterhin normal. Wenn jedoch Zeit vergeht, wird B1 zum Master der Partition, auf der er sich befindet, und die von Z1 geschriebenen Daten B wird verloren gehen. 🎜🎜
kann den Datenverlust reduzieren und die Gesamtzahl der Schreibvorgänge von Z1 nach B steuern: 🎜
🎜Diese 🎜Zeitspanne🎜 ist sehr wichtig und wird als 🎜Knotenablaufzeit🎜 bezeichnet. 🎜🎜Nachdem ein Master die Ablaufzeit erreicht hat, gilt er als fehlerhaft, geht in den Fehlerzustand über, empfängt keine Schreibanfragen mehr und kann durch einen Slave ersetzt werden. 🎜🎜Zusammenfassung🎜🎜Redis-Cluster garantiert keine starke Konsistenz und es gibt Szenarien, in denen Daten verloren gehen: 🎜🎜🎜Asynchrone Replikation🎜🎜🎜Wenn der Master erfolgreich geschrieben wurde, aber bevor die Slave-Synchronisierung abgeschlossen ist, fällt der Master aus. Der Slave wird zum Master und die Daten gehen verloren. Der Befehl 🎜🎜
kann für die synchrone Replikation verwendet werden, er kann jedoch nicht vollständig garantieren, dass keine Daten verloren gehen, und er beeinträchtigt die Leistung. 🎜🎜🎜Netzwerkpartition🎜🎜🎜Nach der Partitionierung empfängt ein Master weiterhin Schreibanfragen. Nach der Wiederherstellung der Partition wird der Master möglicherweise zum Slave und die zuvor geschriebenen Daten gehen verloren. 🎜🎜Sie können die Ablaufzeit des Knotens festlegen, um die Anzahl der vom Master während der Partitionierung empfangenen Schreibvorgänge zu reduzieren und die Kosten für Datenverluste zu senken. 🎜🎜🎜🎜Empfohlenes Lernen: „🎜Redis-Tutorial🎜“🎜🎜🎜
Das obige ist der detaillierte Inhalt vonWird der Redis-Cluster Daten verlieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!