前言
因為之前沒用過mongo,所以最近的開發(fā)踩了不少坑,現(xiàn)在熟練了不少。
mongo在許多地方用起來還有許多不如意的地方,比如不知道如何加行鎖,雖然mongo本身可以加寫鎖, 多寫的時候保證原子性,但不能向mysql在事務中 select ... for update 這樣加鎖, 這樣可以在應用代碼中添加邏輯并且保證該對應行不被讀取或修改。
還好的是Mongodb4.0是支持事務的(看網(wǎng)上貌似3.6就支持了,但得自己開啟)。剛好前端時間有些業(yè)務需求需要用到事務來保證數(shù)據(jù)的準確性,因為一個動作內(nèi)有多條出入和修改的操作,如果中途報錯需要回滾。
連接mongo的shell后使用 db.version() 來查看mongodb的版本
Python只用mongo事務
在python中使用使用 pymongo 來操作數(shù)據(jù)庫
1
2
3
4
5
6
7
|
import pymongo mc = pymongo.MongoClient( 'mongodb://localhost:27018' , connect = False , maxPoolSize = 2000 ) with mc.start_session() as session: with session.start_transaction(): mc[ 'test' ][ 'test' ].insert_one({ 'a' : 1 }, session = session) mc[ 'test' ][ 'test' ].delete_one({ 'a' : 1 }, session = session) ... |
但在實際使用中卻報了個錯
MongoError: Transaction numbers are only allowed on a replica set member or mongos.
上網(wǎng)搜索后很多解決方法都是npm安裝一個什么包,然后用它啟動mongo。
其實根據(jù)英文的意思也差不多能明白是怎么回事,網(wǎng)上搜索后發(fā)現(xiàn)了根本原因:事務只支持副本集和切片。而我這開發(fā)環(huán)境是直接mongod啟的
副本集
副本集搭建
啟動兩個mongodb服務(一個master,一個slave)
1
2
3
4
5
6
7
8
9
10
11
12
|
# 1 / usr / local / mongodb / mongodb4. 0.10 / bin / mongod \ - - bind_ip = 0.0 . 0.0 - - port = 27018 - - logpath = / var / log / mongodb / mongodb_4_0_10.log \ - - dbpath = / data / mongo_4. 0.10_db \ - - replSet rs0 - - fork # 2 / usr / local / mongodb / mongodb4. 0.10 / bin / mongod \ - - bind_ip = 0.0 . 0.0 - - port = 27019 \ - - logpath = / var / log / mongodb / mongodb_4_0_10 - 2.log \ - - dbpath = / data / mongo_4. 0.10_db - 2 \ - - replSet rs0 - - fork |
在mongo shell中執(zhí)行
1
2
3
4
|
# 啟動一個新的副本集 rs.initiate() # 添加一個副本集 rs.add( "localhost.localdomain:27019" ) |
這樣的的話就可以使用mongodb的事務了
單節(jié)點也是支持事務的,我多加一個slave節(jié)點只是為了測試一下
slave節(jié)點讀
默認slave節(jié)點是不能讀的,在Mongo客戶端使用命令 db.setSlaveOk() 來開啟slave節(jié)點讀,
這樣的可以讀寫分離(master寫,slave讀),關(guān)于slave讀對副本集間的同步的影響我沒有實踐就不寫了,網(wǎng)上有資料介紹。
master選舉
http://www.mongoing.com/archives/295
分片
分片集群我沒有搭建,這里有個文章寫的比較不錯,分片加副本集搭建,這樣既分流的數(shù)據(jù)也保證了數(shù)據(jù)的備份。等有時間自己搭建我在詳細記錄這里的坑
http://www.jfrwli.cn/article/68947.html
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。
原文鏈接:https://blog.xubiaosunny.online/技術(shù)/2019/08/07/mongo_rs_and_mongos.html