什麼是mongodb的changeStream
- changeStream是mongodb基於oplog(操作日誌)的實時的資料變更流,應用程式可以透過changeStream實現對mongo資料變更的訂閱,我們可以理解為MySQL中的觸發器或者基於binlog複製的從節點。
如何使用
- changeSteam可以對某個db/colletion/deployment進行監聽(watch)
- 監聽的事件(event)包括insert Event、Update Event、Replace Event、 delete Event等事件
使用場景
- 可以利用這個特性實現對mongo中資料變更的監聽,進行資料同步、複製等操作,舉個例子,公司原始系統使用PHP+MySQL進行服務,後續經過發展,賬號服務越來越複雜,賬號屬性多變,資料儲存切換至MongoDB,採用Java進行新服務提供,但是老系統又不能一時砍掉,砍掉我們就要丟飯碗了,那資料流從mongo到MySQL如何進行同步呢,一個方式就是可以利用changeStream 進行。
程式碼實現
這裡我透過一個簡單的demo來學習changeStream
前提準備
安裝MongoDB
mongodb需要開啟複製集,也就是必須要主從,部分版本需要開啟 enableMajorityReadConcern: true
安裝PHPmongdoDB擴充套件,注意事項mongodb擴充套件而不是mongo
composer 安裝php-mongodb包
實現 具體實現後面貼圖
- 配置mongodb的複製集, mongo.conf 在程式碼例項中,這裡我們使用一主兩從
- 啟動 mongod -f /Users/gaoz/project13/mongo/db1/mongod.conf
- 啟動監聽客戶端 php index.php
- 透過mongoshell進行資料insert/update操作
注意事項
- 在實際的使用過程中,要注意資料丟失的情況
- 考慮大量資料變更的發生,加入Mq中介軟體進行訊息處理
- 做好服務故障監聽
啟動mongod服務,這裡建立三個/mongo/db 分別為db1, db2, db3, 埠分別為28017,28018,28019
啟動mongo監聽指令碼
透過mongoshell 運算元據
更新資料
監聽指令碼接受到資料變更
看一下接受到資料
這裡重點關注三個內容
- operationType: 操作型別,可能是update、insert、replace等
- fullDocument: 文件內容
- 如果是更新的話,updateFields則是變更內容
後續的使用,比如同步到MySQL,大家可以在監聽指令碼中加入同步邏輯即可。
參考資料
- 官方文件:docs.mongodb.com/manual/changeStre...
- php-mongodb擴充套件 pecl.php.net/package/mongodb
- php-mongodb composer包 github.com/mongodb/mongo-php-libra...
個人學習使用,歡迎指正討論。
本作品採用《CC 協議》,轉載必須註明作者和本文連結