概述
- 前序--聊聊數(shù)據(jù)庫升級方案
- 一主一從
- 一主兩從
- 一主一從一仲裁
本來是想用 MongoDB 的 Docker 最新鏡像的,但是 最新鏡像默認(rèn)綁定了 localhost (詳見官網(wǎng))才能連接數(shù)據(jù)庫疼蛾,當(dāng)然,我們也可以進(jìn)行修改遮斥。那我這邊為了方便粹胯,就直接使用 mongo 3.4 ,因?yàn)?3.4 的版本沒有綁定 localhost 省去一部分麻煩鳖敷。
前序--聊聊數(shù)據(jù)庫升級方案
在學(xué)習(xí)集群之前癣籽,我們來聊聊數(shù)據(jù)庫的升級方案挽唉,我個人認(rèn)為有如下一些階段,如果我的認(rèn)知有錯誤筷狼,也煩請讀者朋友指出瓶籽。
階段一
描述:開發(fā)初期,應(yīng)用程序與數(shù)據(jù)庫在同一臺服務(wù)器
缺點(diǎn):
- 應(yīng)用程序與數(shù)據(jù)庫爭奪資源
- 數(shù)據(jù)庫掛掉埂材,應(yīng)用程序也無法提供服務(wù)
- 無法提供數(shù)據(jù)容災(zāi)備份
- 讀寫在同一個節(jié)點(diǎn)塑顺,壓力大
- 吞吐量小,提供服務(wù)能力有限
- 無故障恢復(fù)功能
階段二
描述:數(shù)據(jù)庫獨(dú)立到一臺服務(wù)器俏险,與應(yīng)用程序分離
缺點(diǎn):
- 數(shù)據(jù)庫掛掉严拒,應(yīng)用程序也無法提供服務(wù)
- 無法提供數(shù)據(jù)容災(zāi)備份
- 讀寫在同一個節(jié)點(diǎn),壓力大
- 吞吐量小竖独,提供服務(wù)能力有限
- 無故障恢復(fù)功能
階段三
描述:數(shù)據(jù)庫有主從結(jié)構(gòu)裤唠,一臺主要,一臺副本
缺點(diǎn):
- 數(shù)據(jù)庫掛掉莹痢,應(yīng)用程序也無法提供服務(wù)
- 讀寫在同一個節(jié)點(diǎn)种蘸,壓力大
- 吞吐量小墓赴,提供服務(wù)能力有限
- 無故障恢復(fù)功能
階段四
描述:一主兩(多)從,讀寫分離
缺點(diǎn):
- 吞吐量小航瞭,提供服務(wù)能力有限
- 數(shù)據(jù)庫節(jié)點(diǎn)多诫硕,經(jīng)濟(jì)成本相對增大
階段五
描述:分片,橫向擴(kuò)展
缺點(diǎn):
- 數(shù)據(jù)庫節(jié)點(diǎn)多刊侯,經(jīng)濟(jì)成本相對增大
一主一從
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
不用新建相應(yīng)文件目錄章办,直接運(yùn)行 yml 文件即可。
在運(yùn)行 yml 文件之后滨彻,執(zhí)行以下初始化操作:
進(jìn)入 master 的 mongo 命令行:
docker-compose exec master mongo
插入一條數(shù)據(jù):
use test
db.test.insert({msg: "this message is from master", ts: new Date()})
進(jìn)入 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.
在 slave 中藕届,查詢到了 master 中插入的信息
嘗試在 slave 中,插入信息:
db.test.insert({msg: 'this is from slaver', ts: new Date()})
插入失敗疮绷,顯示報(bào)錯信息翰舌。
優(yōu)缺點(diǎn): master-slave 結(jié)構(gòu),當(dāng) master 掛了冬骚,slave 不會被選舉為 master,所以這種結(jié)構(gòu)只起到了備份數(shù)據(jù)的作用
一主兩從
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
不用新建相應(yīng)文件目錄懂算,直接運(yùn)行 yml 文件即可只冻。
在運(yùn)行 yml 文件之后,執(zhí)行以下初始化操作:
docker-compose exec rs1 mongo
初始化各個節(jié)點(diǎn):
rs.initiate()
rs.add('rs2:27017')
rs.add('rs3:27017')
查看配置與副本級狀態(tài)
rs.conf()
rs.status()
插入信息到主節(jié)點(diǎn):
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() //副本集默認(rèn)僅primary可讀寫
use test
db.test.find()
故障測試:
docker-compose stop rs1
分別查看其它節(jié)點(diǎn)的信息:注意進(jìn)入 mongo 命令行后的主從標(biāo)識符
docker-compose exec rs2 mongo
docker-compose exec rs3 mongo
優(yōu)缺點(diǎn):
- 可進(jìn)行讀寫分離
- 具備故障轉(zhuǎn)移能力
一主一從一仲裁
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
不用新建相應(yīng)文件目錄计技,直接運(yùn)行 yml 文件即可喜德。
在運(yùn)行 yml 文件之后,執(zhí)行以下初始化操作:
docker-compose exec rs1 mongo
初始化各個節(jié)點(diǎn):
rs.initiate()
rs.add('slave:27017')
rs.add('myarbiter:27017',true)//設(shè)置為仲裁節(jié)點(diǎn)
查看配置與副本級狀態(tài)
rs.conf()
rs.status()
插入信息到主節(jié)點(diǎn):
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() //副本集默認(rèn)僅primary可讀寫
use test
db.test.find()
故障測試:
docker-compose stop master
分別查看其它節(jié)點(diǎn)的信息:
docker-compose exec slave mongo
可以看到最后一行標(biāo)注為: PRIMARY 故障轉(zhuǎn)移成功
docker-compose exec myarbiter mongo
可以看到最后一行標(biāo)注為: ARBITER
優(yōu)缺點(diǎn):
- 具備故障轉(zhuǎn)移能力
- 仲裁節(jié)點(diǎn)起到選舉作用垮媒,節(jié)省部分資源
下一篇文章來說說 MongoDB 分片舍悯,歡迎關(guān)注