MongoDB副本集搭建

MongoDB

MongoDB是如今最爲流行的NoSQL數據庫之一。在大數據時代,傳統的關係型數據庫遇到了高併發讀寫、海量數據高效存儲、高可擴展性和高可用性這些難題。以MySQL爲例,在數據量很大須要分表分庫的時候,它自己不提供分片能力,須要本身另建服務。 而NoSQL就是爲了解決這些問題而誕生了的。注: NoSQL(NoSQL = Not Only SQL ),意即"不單單是SQL"。
NoSQL有以下優點:mysql

  • 大數據量,能夠經過廉價服務器存儲大量的數據,輕鬆擺脫傳統mysql單表存儲量級限制。
  • 高性能,NoSQL經過簡單的key-value方式獲取數據,很是快速。還有NoSQL的Cache是記錄級的,是一種細粒度的Cache,因此NoSQL在這個層面上來講就要性能高不少。
  • 靈活的數據模型,NoSQL無需事先爲要存儲的數據創建字段,隨時能夠存儲自定義的數據格式。而在關係數據庫裏,增刪字段是一件很是麻煩的事情。若是是很是大數據量的表,增長字段簡直就是一個噩夢。
  • 高可用,NoSQL在不太影響性能的狀況,就能夠方便的實現高可用的架構。好比mongodb經過mongos、mongo分片就能夠快速配置出高可用配置。

單機版MongoDB

這種配置只適合簡易開發時使用,生產使用不行,由於不是高可用的。這裏我使用docker快速啓動MongoDB服務,MongoDB版本爲3.6。sql

docker-compose.yml

version: '3'
services:
  mongo1:
    image: mongo:3.6
    environment:
        - MONGO_INITDB_ROOT_USERNAME=test
        - MONGO_INITDB_ROOT_PASSWORD=IIm7A5C5GqRWqnLg
    network_mode: "host"
    volumes:
      - ./mongo_data:/data/db
      - ./mongod.conf:/etc/mongo/mongod.conf
      - ./log:/var/log/mongodb
    command: ["--config", "/etc/mongo/mongod.conf"]

mongod.conf

systemLog:
  destination: file
  path: /var/log/mongodb/mongo.log
  logAppend: false
storage:
  dbPath: /data/db
  indexBuildRetry: true
  journal:
    enabled: true
net:
  port: 40031
  bindIp: 0.0.0.0
  maxIncomingConnections: 65536

docker-compose.yml中network_mode: "host"是讓容器直接使用宿主機網絡,配置文件中net下port是指定MongoDB服務監聽的端口,storage下dbPath指定數據存儲目錄,開啓journal是由於journal文件用於數據庫異常退出時恢復數據(默認開啓)。
windows上會遇到MongoDB沒法啓動的問題(WiredTiger提示Operation not permitted),解決方法是本身建立頂級的數據卷mongodb

version: '3'
services:
  mongo1:
    image: mongo:3.6
    environment:
        - MONGO_INITDB_ROOT_USERNAME=test
        - MONGO_INITDB_ROOT_PASSWORD=IIm7A5C5GqRWqnLg
    network_mode: "host"
    volumes:
      - mongo_data:/data/db
      - ./mongod.conf:/etc/mongo/mongod.conf
      - ./log:/var/log/mongodb
    command: ["--config", "/etc/mongo/mongod.conf"]
volumes:
  mongo_data:

副本集

高可用的一個作法就是作主從,MongoDB給的方案就是副本集(對於分佈式存儲有分片集合,以後會寫)。MongoDB副本集中主服務器負責整個副本集的讀寫,副本集按期同步數據備份,一但主節點掛掉,副本節點就會選舉一個新的主服務器,這一切對於應用服務器不須要關心。這樣的機制提升了數據的可用性,並能夠保證數據的安全性。
v2-04c282f930f066a800d342dbf84e136c_r.jpgdocker

須要注意的一點:MongoDB官方已經不建議使用主從模式了,替代方案是採用副本集的模式(4.0更是移除了master-slave功能,連接)。數據庫

REMOVED

MongoDB 4.0 removes support for master-slave replication. Before you
can upgrade to MongoDB 4.0, if your deployment uses master-slave
replication, you must upgrade to a replica set.windows

To convert your master-slave replication, see Convert a Master-Slave
Deployment to a Replica Set.安全

搭建以前咱們須要在mongod.conf加入replication配置項服務器

systemLog:
  destination: file
  path: /var/log/mongodb/mongo.log
  logAppend: false
storage:
  dbPath: /data/db
  indexBuildRetry: true
  journal: 
    enabled: true
net:
  port: 40031
  bindIp: 0.0.0.0
  maxIncomingConnections: 65536
replication:
   replSetName: myset

搭建分片集羣

初始化副本集

在3臺主機上分別啓動MongoDB服務,啓動成功後在某臺主機上登入MongoDB,執行rs.initiate()初始化副本集,會有以下輸出網絡

{
    "info2" : "no configuration specified. Using a default configuration for the set",
    "me" : "mongo1:40031",
    "ok" : 1
}

可經過rs.conf()查看當前副本集的配置信息。架構

維護操做

經過rs.add("ip:port")來增長節點,要移除節點的話,可使用rs.remove("ip:port")
查看查看副本集的狀態能夠用rs.status(),若是你想查看複製延遲,可使用 db.printSlaveReplicationInfo()

相關文章
相關標籤/搜索