基於 Docker 的 MongoDB 主從集羣

閱讀本文大約須要 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.
複製代碼

這裏寫圖片描述
在 slave 中,查詢到了 master 中插入的信息 嘗試在 slave 中,插入信息:

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
複製代碼

優缺點:

  1. 可進行讀寫分離
  2. 具有故障轉移能力

一主一從一仲裁

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
複製代碼

這裏寫圖片描述
能夠看到最後一行標註爲: PRIMARY 故障轉移成功

docker-compose exec myarbiter mongo
複製代碼

這裏寫圖片描述
能夠看到最後一行標註爲: ARBITER

優缺點:

  1. 具有故障轉移能力
  2. 仲裁節點起到選舉做用,節省部分資源

下一篇文章來講說 MongoDB 分片,歡迎關注


關注微信公衆號,回覆【docker資源】,獲取 docker 初級視頻教程

zone_qrcode.jpg
相關文章
相關標籤/搜索