閱讀本文大約須要 9 分鐘node
若是對 Docker 不太懂,能夠看看我以前的文章。 這篇文章主要講如下四個內容:mongodb
原本是想用 MongoDB 的 Docker 最新鏡像的,可是 最新鏡像默認綁定了 localhost (詳見官網)才能鏈接數據庫,固然,咱們也能夠進行修改。那我這邊爲了方便,就直接使用 mongo 3.4 ,由於 3.4 的版本沒有綁定 localhost 省去一部分麻煩。docker
在學習集羣以前,咱們來聊聊數據庫的升級方案,我我的認爲有以下一些階段,若是個人認知有錯誤,也煩請讀者朋友指出。shell
階段一
描述:開發初期,應用程序與數據庫在同一臺服務器
缺點:
- 應用程序與數據庫爭奪資源
- 數據庫掛掉,應用程序也沒法提供服務
- 沒法提供數據容災備份
- 讀寫在同一個節點,壓力大
- 吞吐量小,提供服務能力有限
- 無端障恢復功能
複製代碼
階段二
描述:數據庫獨立到一臺服務器,與應用程序分離
缺點:
- 數據庫掛掉,應用程序也沒法提供服務
- 沒法提供數據容災備份
- 讀寫在同一個節點,壓力大
- 吞吐量小,提供服務能力有限
- 無端障恢復功能
複製代碼
階段三
描述:數據庫有主從結構,一臺主要,一臺副本
缺點:
- 數據庫掛掉,應用程序也沒法提供服務
- 讀寫在同一個節點,壓力大
- 吞吐量小,提供服務能力有限
- 無端障恢復功能
複製代碼
階段四
描述:一主兩(多)從,讀寫分離
缺點:
- 吞吐量小,提供服務能力有限
- 數據庫節點多,經濟成本相對增大
複製代碼
階段五
描述:分片,橫向擴展
缺點:
- 數據庫節點多,經濟成本相對增大
複製代碼
version: '2'
services:
master:
image: mongo:3.4
volumes:
- /data/mongodbml/master:/data/db
command: mongod --dbpath /data/db --master
slaver:
image: mongo:3.4
volumes:
- /data/mongodbml/slaver:/data/db
command: mongod --dbpath /data/db --slave --source master:27017
links:
- master
複製代碼
不用新建相應文件目錄,直接運行 yml 文件便可。 在運行 yml 文件以後,執行如下初始化操做: 進入 master 的 mongo 命令行:數據庫
docker-compose exec master mongo
複製代碼
插入一條數據:bash
use test
db.test.insert({msg: "this message is from master", ts: new Date()})
複製代碼
進入 slaver 的 mongo 命令行:服務器
docker-compose exec slaver mongo
複製代碼
查看副本集信息:微信
rs.slaveOk()
use test
db.test.find()
複製代碼
rs.slaveOk() 的功能學習
db.getMongo().setSlaveOk()
This allows the current connection to allow read operations to run on secondary members. See the readPref() method for more fine-grained control over read preference in the mongo shell.
複製代碼
db.test.insert({msg: 'this is from slaver', ts: new Date()})
複製代碼
插入失敗,顯示報錯信息。測試
優缺點: master-slave 結構,當 master 掛了,slave 不會被選舉爲 master,因此這種結構只起到了備份數據的做用
version: '2'
services:
rs1:
image: mongo:3.4
volumes:
- /data/mongodbtest/replset/rs1:/data/db
command: mongod --dbpath /data/db --replSet myset
rs2:
image: mongo:3.4
volumes:
- /data/mongodbtest/replset/rs2:/data/db
command: mongod --dbpath /data/db --replSet myset
rs3:
image: mongo:3.4
volumes:
- /data/mongodbtest/replset/rs3:/data/db
command: mongod --dbpath /data/db --replSet myset
複製代碼
不用新建相應文件目錄,直接運行 yml 文件便可。 在運行 yml 文件以後,執行如下初始化操做:
docker-compose exec rs1 mongo
複製代碼
初始化各個節點:
rs.initiate()
rs.add('rs2:27017')
rs.add('rs3:27017')
複製代碼
查看配置與副本級狀態
rs.conf()
rs.status()
複製代碼
插入信息到主節點:
docker-compose exec rs1 mongo
use test
db.test.insert({msg: 'this is from primary', ts: new Date()})
複製代碼
在副本集中檢測信息是否同步:
docker-compose exec rs2 mongo
rs.slaveOk()
use test
db.test.find()
複製代碼
docker-compose exec rs3 mongo
rs.slaveOk() //副本集默認僅primary可讀寫
use test
db.test.find()
複製代碼
故障測試:
docker-compose stop rs1
複製代碼
分別查看其它節點的信息:注意進入 mongo 命令行後的主從標識符
docker-compose exec rs2 mongo
複製代碼
docker-compose exec rs3 mongo
複製代碼
優缺點:
version: '2'
services:
master:
image: mongo:3.4
volumes:
- /data/mongodb3node/replset/rs1:/data/db
command: mongod --dbpath /data/db --replSet newset --oplogSize 128
slave:
image: mongo:3.4
volumes:
- /data/mongodb3node/replset/rs2:/data/db
command: mongod --dbpath /data/db --replSet newset --oplogSize 128
myarbiter:
image: mongo:3.4
command: mongod --dbpath /data/db --replSet newset --smallfiles --oplogSize 128
複製代碼
不用新建相應文件目錄,直接運行 yml 文件便可。 在運行 yml 文件以後,執行如下初始化操做:
docker-compose exec rs1 mongo
複製代碼
初始化各個節點:
rs.initiate()
rs.add('slave:27017')
rs.add('myarbiter:27017',true)//設置爲仲裁節點
複製代碼
查看配置與副本級狀態
rs.conf()
rs.status()
複製代碼
插入信息到主節點:
docker-compose exec rs1 mongo
use test
db.test.insert({msg: 'this is from primary', ts: new Date()})
複製代碼
在副本集中檢測信息是否同步:
docker-compose exec rs2 mongo
rs.slaveOk()
use test
db.test.find()
複製代碼
docker-compose exec rs3 mongo
rs.slaveOk() //副本集默認僅primary可讀寫
use test
db.test.find()
複製代碼
故障測試:
docker-compose stop master
複製代碼
分別查看其它節點的信息:
docker-compose exec slave mongo
複製代碼
docker-compose exec myarbiter mongo
複製代碼
優缺點:
下一篇文章來講說 MongoDB 分片,歡迎關注