<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在mongodb如果需要啟用變更監聽功能(watch),mongodb需要在replicaSet或者cluster方式下執行。
replicaSet和cluster從部署難度相比,replicaSet要簡單許多。如果所儲存的資料量規模不算太大的情況下,那麼使用replicaSet方式部署mongodb是一個不錯的選擇。
mongodb版本:mongodb-6.0.5
兩臺主機:主機1(192.168.1.11)、主機2(192.168.1.12)
在主機1和主機2上安裝好docker,並確保兩臺主機能正常通訊
在啟動mongodb前,先準備好對應的目錄與存取key
#在所有主機都建立用於儲存mongodb資料的資料夾 mkdir -p ~/mongo-data/{data,key,backup} #設定key檔案,用於在叢集機器間互相存取,各主機的key需要保持一致 cd ~/mongo-data #在某一節點建立key openssl rand -base64 123 > key/mongo-rs.key sudo chown 999 key/mongo-rs.key #不能是755, 許可權太大不行. sudo chmod 600 key/mongo-rs.key #將key複製到他節點 scp key/mongo-rs.key root@192.168.1.12:/root/mongo-data/key
以上操作在各主機中建立了 ~/mongo-data/{data,key,backup} 這3個目錄,且mongo-rs.key的內容一致。
執行下列命令,啟動mongodb
sudo docker run --name mongo --network=host -p 27017:27017 -v ~/mongo-data/data:/data/db -v ~/mongo-data/backup:/data/backup -v ~/mongo-data/key:/data/key -v /etc/localtime:/etc/localtime -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=123456 -d mongo:6.0.5 --replSet haiyangReplset --auth --keyFile /data/key/mongo-rs.key --bind_ip_all
上面主要將27017埠對映到主機中,並設了admin的預設密碼為123456。
–replSet為指定開啟replicaSet,後面跟的為副本集的名稱。
進入某一節點,進行叢集設定
sudo docker exec -it mongo bash
mongosh
初始化叢集前先登入驗證超級管理員admin
use admin
db.auth(“admin”,“123456”)
再執行以下命令進行初始化
var config={ _id:"haiyangReplset", members:[ {_id:0,host:"192.168.1.11:27017"}, {_id:1,host:"192.168.1.12:27017"}, ]}; rs.initiate(config)
執行成功後,可以看到一個節點為主節點,另一個節點為從節點
其他相關命令
#檢視副本集狀態 rs.status() #檢視副本集設定 rs.conf() #新增節點 rs.add( { host: "ip:port"} ) #刪除節點 rs.remove('ip:port')
在mongodb安裝好後,再用使用者端連線驗證一下。
官方mongodb的使用者端下載地址為:https://www.mongodb.com/try/download/compass
下載完畢後,在使用者端中新建連線。
在本例中,則mongodb的連線地址為:
mongodb://admin:123456@192.168.1.11:27017,192.168.1.12:27017/?authMechanism=DEFAULT&authSource=admin&replicaSet=haiyangReplset
庫與監控資訊一目瞭然~
對於mongodb操作的api在mongodb的官網有比較完備的檔案,java的檔案連線為:https://www.mongodb.com/docs/drivers/java/sync/v4.9/
這裡試一下mongodb中一個比較強悍的功能,記錄的變更監聽。
用這項功能來做一些審計的場景則會非常方便。
官方連結為:https://www.mongodb.com/docs/drivers/java/sync/v4.9/usage-examples/watch/
這裡以java使用者端為例寫個小demo,試一下對於mongodb中集合的建立及watch功能。
package io.github.puhaiyang; import com.google.common.collect.Lists; import com.mongodb.client.*; import org.apache.commons.lang3.StringUtils; import org.bson.Document; import org.bson.conversions.Bson; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.Scanner; import java.util.concurrent.CompletableFuture; /** * @author puhaiyang * @since 2023/3/30 20:01 * MongodbWatchTestMain */ public class MongodbWatchTestMain { public static void main(String[] args) throws Exception { String uri = "mongodb://admin:123456@192.168.1.11:27017,192.168.1.12:27017/?replicaSet=haiyangReplset"; MongoClient mongoClient = MongoClients.create(uri); MongoDatabase mongoDatabase = mongoClient.getDatabase("my-test-db"); String myTestCollectionName = "myTestCollection"; //獲取出collection MongoCollection<Document> mongoCollection = initCollection(mongoDatabase, myTestCollectionName); //進行watch CompletableFuture.runAsync(() -> { while (true) { List<Bson> pipeline = Lists.newArrayList( Aggregates.match(Filters.in("ns.coll", myTestCollectionName)), Aggregates.match(Filters.in("operationType", Arrays.asList("insert", "update", "replace", "delete"))) ); ChangeStreamIterable<Document> changeStream = mongoDatabase.watch(pipeline) .fullDocument(FullDocument.UPDATE_LOOKUP) .fullDocumentBeforeChange(FullDocumentBeforeChange.WHEN_AVAILABLE); changeStream.forEach(event -> { String collectionName = Objects.requireNonNull(event.getNamespace()).getCollectionName(); System.out.println("--------> event:" + event.toString()); }); } }); //資料變更測試 { Thread.sleep(3_000); InsertOneResult insertResult = mongoCollection.insertOne(new Document("test", "sample movie document")); System.out.println("Success! Inserted document id: " + insertResult.getInsertedId()); UpdateResult updateResult = mongoCollection.updateOne(new Document("test", "sample movie document"), Updates.set("field2", "sample movie document update")); System.out.println("Updated " + updateResult.getModifiedCount() + " document."); DeleteResult deleteResult = mongoCollection.deleteOne(new Document("field2", "sample movie document update")); System.out.println("Deleted " + deleteResult.getDeletedCount() + " document."); } new Scanner(System.in).next(); } private static MongoCollection<Document> initCollection(MongoDatabase mongoDatabase, String myTestCollectionName) { ArrayList<Document> existsCollections = mongoDatabase.listCollections().into(new ArrayList<>()); Optional<Document> existsCollInfoOpl = existsCollections.stream().filter(doc -> StringUtils.equals(myTestCollectionName, doc.getString("name"))).findFirst(); existsCollInfoOpl.ifPresent(collInfo -> { //確保開啟了changeStreamPreAndPost Document changeStreamPreAndPostImagesEnable = collInfo.get("options", Document.class).get("changeStreamPreAndPostImages", Document.class); if (changeStreamPreAndPostImagesEnable != null && !changeStreamPreAndPostImagesEnable.getBoolean("enabled")) { Document mod = new Document(); mod.put("collMod", myTestCollectionName); mod.put("changeStreamPreAndPostImages", new Document("enabled", true)); mongoDatabase.runCommand(mod); } }); if (!existsCollInfoOpl.isPresent()) { CreateCollectionOptions collectionOptions = new CreateCollectionOptions(); //建立collection時開啟ChangeStreamPreAndPostImages collectionOptions.changeStreamPreAndPostImagesOptions(new ChangeStreamPreAndPostImagesOptions(true)); mongoDatabase.createCollection(myTestCollectionName, collectionOptions); } return mongoDatabase.getCollection(myTestCollectionName); } }
輸出結果如下:
--------> event:ChangeStreamDocument{ operationType=insert, resumeToken={"_data": "8264255A0F000000022B022C0100296E5A10046A3E3757D6A64DF59E6D94DC56A9210446645F6964006464255A105A91F005CFB2E6D20004"}, namespace=my-test-db.myTestCollection, destinationNamespace=null, fullDocument=Document{{_id=64255a105a91f005cfb2e6d2, test=sample movie document}}, fullDocumentBeforeChange=null, documentKey={"_id": {"$oid": "64255a105a91f005cfb2e6d2"}}, clusterTime=Timestamp{value=7216272998402097154, seconds=1680169487, inc=2}, updateDescription=null, txnNumber=null, lsid=null, wallTime=BsonDateTime{value=1680169487686}}
Success! Inserted document id: BsonObjectId{value=64255a105a91f005cfb2e6d2}
Updated 1 document.
--------> event:ChangeStreamDocument{ operationType=update, resumeToken={"_data": "8264255A0F000000032B022C0100296E5A10046A3E3757D6A64DF59E6D94DC56A9210446645F6964006464255A105A91F005CFB2E6D20004"}, namespace=my-test-db.myTestCollection, destinationNamespace=null, fullDocument=Document{{_id=64255a105a91f005cfb2e6d2, test=sample movie document, field2=sample movie document update}}, fullDocumentBeforeChange=Document{{_id=64255a105a91f005cfb2e6d2, test=sample movie document}}, documentKey={"_id": {"$oid": "64255a105a91f005cfb2e6d2"}}, clusterTime=Timestamp{value=7216272998402097155, seconds=1680169487, inc=3}, updateDescription=UpdateDescription{removedFields=[], updatedFields={"field2": "sample movie document update"}, truncatedArrays=[], disambiguatedPaths=null}, txnNumber=null, lsid=null, wallTime=BsonDateTime{value=1680169487708}}
--------> event:ChangeStreamDocument{ operationType=delete, resumeToken={"_data": "8264255A0F000000042B022C0100296E5A10046A3E3757D6A64DF59E6D94DC56A9210446645F6964006464255A105A91F005CFB2E6D20004"}, namespace=my-test-db.myTestCollection, destinationNamespace=null, fullDocument=null, fullDocumentBeforeChange=Document{{_id=64255a105a91f005cfb2e6d2, test=sample movie document, field2=sample movie document update}}, documentKey={"_id": {"$oid": "64255a105a91f005cfb2e6d2"}}, clusterTime=Timestamp{value=7216272998402097156, seconds=1680169487, inc=4}, updateDescription=null, txnNumber=null, lsid=null, wallTime=BsonDateTime{value=1680169487721}}
Deleted 1 document.
到此這篇關於mongodb使用docker搭建replicaSet叢集與變更監聽的文章就介紹到這了,更多相關mongodb搭建replicaSet叢集內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45