共計 1746 個字符,預計需要花費 5 分鐘才能閱讀完成。
本篇內容介紹了“怎么對 mongodb 中某個集合做分片”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
本例中 test1 為數據庫,test1 也為集合名
1、先 enable sharding,開啟數據庫的分片功能
mongos use admin
mongos db.runCommand({enablesharding : test1})
2、對具體 collection 做分片, 選擇片鍵為 _id
mongos db.runCommand({shardcollection : test1.test1 , key :{ _id :1}})
{collectionsharded : test1.test1 , ok : 1}
3、觀察 2 個分片 shard_01 shard_02 tunks 數量
===========MongoDB===== 復制集讀寫設置 ====
write concern
默認情況下,Primary 完成寫操作即返回,Driver 可通過設置 [Write Concern] 來設置寫成功的規則。
如下的 write concern 規則設置寫必須在大多數節點上成功,超時時間為 5s。
cfg = rs.conf()
cfg.settings = {}
cfg.settings.getLastErrorDefaults = {w: majority , wtimeout: 5000}
rs.reconfig(cfg)
數據同步
Primary 與 Secondary 之間通過 oplog 來同步數據,Primary 上的寫操作完成后,會向特殊的 local.oplog.rs 特殊集合寫入一條 oplog,Secondary 不斷的從 Primary 取新的 oplog 并應用。
因 oplog 的數據會不斷增加,local.oplog.rs 被設置成為一個 capped 集合,當容量達到配置上限時,會將最舊的數據刪除掉。另外考慮到 oplog 在 Secondary 上可能重復應用,oplog 必須具有冪等性,即重復應用也會得到相同的結果。
如下 oplog 的格式,包含 ts、h、op、ns、o 等字段
{
ts : Timestamp(1446011584, 2),
h : NumberLong(1687359108795812092),
v : 2,
op : i ,
ns : test.nosql ,
o : {_id : ObjectId( 563062c0b085733f34ab4129), name : mongodb , score : 100 }
}
}
ts:操作時間,當前 timestamp + 計數器,計數器每秒都被重置
h:操作的全局唯一標識
v:oplog 版本信息
op:操作類型
i:插入操作
u:更新操作
d:刪除操作
c:執行命令(如 createDatabase,dropDatabase)
n:空操作,特殊用途
ns:操作針對的集合
o:操作內容,如果是更新操作
o2:操作查詢 where 條件,僅 update 操作包含該字段
========oplog 與 journal 日志問題 ========== 張友東博客 ===========
MongoDB 復制集里寫入一個文檔時,需要修改如下數據
將文檔數據寫入對應的集合
更新集合的所有索引信息
寫入一條 oplog 用于同步
上面 3 個修改操作,需要確保要么都成功,要么都失敗,不能出現部分成功的情況。
MongoDB 在寫入數據時,會將上述 3 個操作放到一個 wiredtiger 的事務里,確?!冈有浴?/p>
wiredtiger 提交事務時,會將所有修改操作應用,并將上述 3 個操作寫入到一條 journal 操作日志里;后臺會周期性的 checkpoint,將修改持久化,并移除無用的 journal。
誰先寫入?
oplog 與 journal 是 MongoDB 里不同層次的概念,放在一起比先后本身是不合理的。
oplog 在 MongoDB 里是一個普通的集合,所以 oplog 的寫入與普通集合的寫入并無區別。
一次寫入,會對應數據、索引,oplog 的修改,而這 3 個修改,會對應一條 journal 操作日志
“怎么對 mongodb 中某個集合做分片”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!