MongoDB副本集搭建

MongoDB

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

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

單機版MongoDB

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

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),解決方法是自己創建頂級的數據卷

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副本集中主服務器負責整個副本集的讀寫,副本集定期同步數據備份,一但主節點掛掉,副本節點就會選舉一個新的主服務器,這一切對於應用服務器不需要關心。這樣的機制提高了數據的可用性,並可以保證數據的安全性。
replicSet
需要注意的一點: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.

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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章