簡體   English   中英

在 MongoDB 副本集中讀取自己的寫入。 隨意的一致性不起作用?

[英]Read own writes in a MongoDB replicaset. Casual consistency not working?

我在 3 成員副本集中使用 mongodb,試圖讀取我自己的寫入。 然而,我似乎從我的閱讀中得到了陳舊的數據。 根據文檔,通過“多數”問題進行讀/寫,它應該保證:

“讀操作反映了它們之前的寫操作的結果。”

2018年的這篇文章中也有同樣的說明:

具有讀取關注多數的因果讀取 R1 等待看到 T1 多數已提交,然后返回成功。

然而,我似乎沒有這么幸運。 下面的代碼插入一個用戶,並立即嘗試通過 ID 找到同一用戶。 這是在一個循環中完成的,只需要 1-3 次迭代,它就會因“找不到用戶”而失敗。

IMongoCollection<User> collection = MongoDatabase.GetCollection<User>("UserCollection")
    .WithReadConcern(ReadConcern.Majority)
    .WithWriteConcern(WriteConcern.WMajority)
    .WithReadPreference(ReadPreference.Secondary);

Random rnd = new Random();

while (true)
{
    User newUser = new User
    {
        Email = $"{rnd.Next(int.MinValue, int.MaxValue)}@gg.com"
    };

    collection.InsertOne(newUser);

    if (newUser.Id == ObjectId.Empty)
    {
        throw new Exception("Id is empty");
    }

    var findFluent = collection.Find(Builders<User>.Filter.Eq(x => x.Id, newUser.Id));
    User foundUser = findFluent.FirstOrDefault();

    if (foundUser == null)
    {
        throw new Exception("User not found");
    }
}

我已經為讀/寫指定了“多數”問題。 為了測試,我將“次要”指定為閱讀偏好。 如果我將“Primary”指定為讀取首選項,這將永遠不會失敗(顯然)。

我究竟做錯了什么?

首先, 您的鏈接中描述的因果一致性需要在 session 中執行操作。 我沒有看到 session 在您的代碼中使用。

其次, 大多數閱讀關注意味着:

讀取關注“多數”保證讀取的數據已被大多數副本集成員確認(即讀取的文檔是持久的並且保證不會回滾)。

這並不能保證返回的數據是文檔的最新版本 如果您正在執行輔助讀取,您將獲得截至該輔助節點的集群時間提交給大多數節點的數據,這可能落后於主節點的集群時間。

根據this note ,您需要一個 session 來獲得與大多數讀取問題的因果一致性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM