1. 程式人生 > >Mongo配置主從,副本集,分片

Mongo配置主從,副本集,分片

Mongo配置

      Mongo在2010年NoSQL浪潮掀起的過程中脫穎而出,較關係型資料庫而言,它將表間的關係去除掉,保留了繁多的資料型別,而且將消除了表關係的劣勢轉化為資料結構的可擴充套件性,這是它之所以流行的一大特色。

      從負載的角度來說,Mongo擁有主從=>副本集=>分片的水平擴充套件能力,自帶監控元件、備份及恢復的能力。mongo也有自己的事物,控制在collection級別,預設使用讀寫鎖,讀鎖和讀鎖不排斥,讀鎖和寫鎖排斥。遇到實時性不強又需要深度計算的資料有可以使用自帶的MapReduce能力,包含了geo的整套演算法元件。

      總之,如果你的專案是新應用,需求會變,資料模型無法確定,想快速迭代開發,沒有佷強的資料關聯性,應用需要TB甚至 PB 級別資料儲存,應用發展迅速,需要能快速水平擴充套件,應用需要大量的地理位置查詢、文字查詢。Mongo很可能會讓你愛不釋手

圖片

      下面,我們一起來認識Mongo

Mongo安裝

      筆者用的是Cent OS,如需其它系統配置,請移步:https://docs.mongodb.com/manual/installation/

  1. 配置yum
[[email protected] ~]$ echo '
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
' > /etc/yum.repos.d/mongodb-org-4.0.repo
  1. Install packages
[[email protected] ~]$ sudo yum install -y mongodb-org
[[email protected] ~]$ sudo yum install -y mongodb-org-4.0.4 mongodb-org-server-4.0.4 mongodb-org-shell-4.0.4 mongodb-org-mongos-4.0.4 mongodb-org-tools-4.0.4
[[email protected] ~]$ echo 'exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools' >> /etc/yum.conf
Mongo配置

      一個配置檔案mongod.conf及mongod命令,mongod.conf中的配置我們儘可能簡單,所有的關鍵配置在mongod啟動時指定。裝好mongo服務後找到mongod.conf檔案,按以下修改

  • mongod.conf
[[email protected] ~]$ echo '
storage:
  dbPath: /opt/mongo/data
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /opt/mongo/log/mongod.log

net:
  port: 27017
  http: 
    enabled: true #啟動web管理頁面
    RESTInterfaceEnabled: false #啟動web管理頁面

replication:
  replSetName: blort

' > ./mongod.conf

  • mongod命令

[[email protected] ~]$ mongod --port 20000 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --fork

      現在已啟動了一個mongo服務,讀者可通過:http://yourip:27017 訪問mongo web管理頁面

  • mongod命令詳解

    在開始主從 => 副本集 => 分片前先理解一下mongod的一些關鍵引數,下面的會用到,以下引數都可以引入 mongod.conf 配置文件裡

引數 說明
–quiet 指定服務埠號,預設埠27017
–port arg 指定服務埠號,預設埠27017
–bind_ip arg 繫結服務IP,若繫結127.0.0.1,則只能本機訪問,不指定預設本地所有IP
–logpath arg 指定MongoDB日誌檔案,注意是指定檔案不是目錄
–logappend 使用追加的方式寫日誌
–pidfilepath arg PID File 的完整路徑,如果沒有設定,則沒有PID檔案
–keyFile arg 叢集的私鑰的完整路徑,只對於Replica Set 架構有效
–unixSocketPrefix arg UNIX域套接字替代目錄,(預設為 /tmp)
–fork 以守護程序的方式執行MongoDB,建立伺服器程序
–auth 啟用驗證
–cpu 定期顯示CPU的CPU利用率和iowait
–dbpath arg 指定資料庫路徑
–diaglog arg diaglog選項 0=off 1=W 2=R 3=both 7=W+some reads
–directoryperdb 設定每個資料庫將被儲存在一個單獨的目錄
–journal 啟用日誌選項,MongoDB的資料操作將會寫入到journal資料夾的檔案裡
–journalOptions arg 啟用日誌診斷選項
–ipv6 啟用IPv6選項
–jsonp 允許JSONP形式通過HTTP訪問(有安全影響)
–maxConns arg 最大同時連線數 預設2000
–noauth 不啟用驗證
–nohttpinterface 關閉http介面,預設關閉27018埠訪問
–noprealloc 禁用資料檔案預分配(往往影響效能)
–noscripting 禁用指令碼引擎
–notablescan 不允許表掃描
–nounixsocket 禁用Unix套接字監聽
–nssize arg (=16) 設定信資料庫.ns檔案大小(MB)
–objcheck 在收到客戶資料,檢查的有效性,
–profile arg 檔案引數 0=off 1=slow, 2=all
–quota 限制每個資料庫的檔案數,設定預設為8
–quotaFiles arg number of files allower per db, requires --quota
–rest 開啟簡單的rest API
–repair 修復所有資料庫run repair on all dbs
–repairpath arg 修復庫生成的檔案的目錄,預設為目錄名稱dbpath
–slowms arg (=100) value of slow for profile and console log
–smallfiles 使用較小的預設檔案
–syncdelay arg (=60) 資料寫入磁碟的時間秒數(0=never,不推薦)
–sysinfo 列印一些診斷系統資訊
–upgrade 如果需要升級資料庫 * Replicaton 引數
–fastsync 從一個dbpath裡啟用從庫複製服務,該dbpath的資料庫是主庫的快照,可用於快速啟用同步
–autoresync 如果從庫與主庫同步資料差得多,自動重新同步,
–oplogSize arg 設定oplog的大小(MB) * 主/從引數
–master 主庫模式
–slave 從庫模式
–source arg 從庫 埠號
–only arg 指定單一的資料庫複製
–slavedelay arg 設定從庫同步主庫的延遲時間 * Replica set(副本集)選項:
–replSet arg 設定副本集名稱 * Sharding(分片)選項
–configsvr 宣告這是一個叢集的config服務,預設埠27019,預設目錄/data/configdb
–shardsvr 宣告這是一個叢集的分片,預設埠27018
–noMoveParanoia 關閉偏執為moveChunk資料儲存
  • 伺服器介紹

    筆者暫且使用3臺機器,分別為192.168.116.131,192.168.116.132,192.168.116.133,在配置時儘可能地簡單,讀者可按照mongod命令詳解自行新增

Mongo主從模式
  • 在192.168.116.131和192.168.116.132中按照Mongo配置中的步驟安裝並配置mongo.conf

在這裡插入圖片描述

  • 啟動服務

    1. 在192.168.116.131啟動主服務
mongod --port 27017 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --master --auth
  1. 在192.168.116.132啟動從服務
mongod --port 27017 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --slave --source 192.168.116.131:27017 --auth

主從服務已啟動完成

Mongo單副本集模式
  • 在192.168.116.131和192.168.116.132和192.168.116.133中按照Mongo配置中的步驟安裝並配置mongo.conf

在這裡插入圖片描述

  • 配置副本集

    1. 副本集通過key檔案用來保證各服務的安全,在192.168.116.131伺服器中執行

[[email protected] ~]$ sudo openssl rand -base64 90 > /opt/mongo/keyfile
[[email protected] ~]$ scp /opt/mongo/keyfile [email protected]:/opt/mongo/
[[email protected] ~]$ scp /opt/mongo/keyfile [email protected]:/opt/mongo/

  1. 啟動各服務,在三臺伺服器中執行

[[email protected] ~]$ mongod --port 27017 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --replSet blort1

  1. 在任意一臺伺服器中執行

[[email protected] ~]$ mongo --port 27017
[mongo-cli] $ rs.initiate({ "_id":"blort_1", "members":[{ "_id":1, "host":"192.168.116.131:27017" }, { "_id":2, "host":"192.168.116.132:27017" }, { "_id":3, "host":"192.168.116.133:27017","arbiterOnly":true }]})
[mongo-cli] $ db.createUser({
"user":"root",
"pwd":"123456",
"roles":[
{"role":"read","db":"admin"},
{"role":"readWrite","db":"admin"},
{"role":"userAdminAnyDatabase","db":"admin"}
]})

  1. 關閉所有mongo服務,在三臺伺服器中執行

[[email protected] ~]$ mongo --port 27017
[mongo-cli] $ db.shutdownServer()

  1. 啟動副本集,在三臺伺服器中執行

[[email protected] ~]$ mongo --port 27017
[mongo-cli] $ mongod --port 27017 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --replSet blort1 --keyFile /opt/mongo/keyfile

副本集配置完成,啟動成功

Mongo分片模式
  • 在192.168.116.131和192.168.116.132和192.168.116.133中按照Mongo配置中的步驟安裝並配置mongo.conf

在這裡插入圖片描述

  • 配置分片

    1. 埠約定

      mongos為 20000, config server 為 21000, shard1為 22000 , shard2為22001, shard3為22002

    2. 配置伺服器啟動,在三臺伺服器分別執行


[[email protected] ~]$ mongod --configsvr --port 21000 --dbpath /opt/mongo/data_conf/data --logpath /opt/mongo/data_conf/log/config.log --replSet confblort --fork 

  1. 配置伺服器副本集INIT,在192.168.116.131伺服器中執行

[[email protected] ~]$ mongo --port 21000
[mongo-cli] $ rs.initiate({ "_id":"confblort", "members":[{ "_id":1, "host":"192.168.116.131:21000" }, { "_id":2, "host":"192.168.116.132:21000" }, { "_id":3, "host":"192.168.116.133:21000"}]})
[mongo-cli] $ db.createUser({
"user":"root",
"pwd":"123456",
"roles":[
{"role":"read","db":"admin"},
{"role":"readWrite","db":"admin"},
{"role":"userAdminAnyDatabase","db":"admin"}
]})

  1. 通過key檔案用來保證各服務的安全,在192.168.116.131伺服器中執行

[[email protected] ~]$ sudo openssl rand -base64 90 > /opt/mongo/keyfile
[[email protected] ~]$ scp /opt/mongo/keyfile [email protected]:/opt/mongo/
[[email protected] ~]$ scp /opt/mongo/keyfile [email protected]:/opt/mongo/

  1. 配置伺服器重啟開啟認證,在三臺伺服器分別執行

[[email protected] ~]$ mongod --configsvr --port 21000 --dbpath /opt/mongo/data_conf/data --logpath /opt/mongo/data_conf/log/config.log --replSet confblort --fork --keyFile /opt/mongo/keyfile

  1. mongos伺服器啟動,在三臺伺服器分別執行

[[email protected] ~]$ mongos --port 20000 --configdb confblort/192.168.116.131:21000,192.168.116.132:21000,192.168.116.133:21000 --logpath /opt/mongo/data_mongos/log/mongos.log --fork --keyFile /opt/mongo/keyfile

  1. 副本集啟動,在三臺伺服器分別執行

[[email protected] ~]$ mongod --shardsvr --port 22000 --dbpath /opt/mongo/data_shard1/data --logpath /opt/mongo/data_shard1/log/shard.log --replSet shard1 --fork
[[email protected] ~]$ mongod --shardsvr --port 22001 --dbpath /opt/mongo/data_shard2/data --logpath /opt/mongo/data_shard2/log/shard.log --replSet shard2 --fork	
[[email protected] ~]$ mongod --shardsvr --port 22002 --dbpath /opt/mongo/data_shard3/data --logpath /opt/mongo/data_shard3/log/shard.log --replSet shard3 --fork

  1. 副本集INIT,在三臺伺服器分別執行

[[email protected] ~]$ mongo --port 22000 | 22001 | 22002
[mongo-cli] $ rs.initiate({ "_id":"shard1", "members":[{ "_id":1, "host":"192.168.116.131:22000" }, { "_id":2, "host":"192.168.116.132:22000" }, { "_id":3, "host":"192.168.116.133:22000","arbiterOnly":true}]})
[mongo-cli] $ rs.initiate({ "_id":"shard2", "members":[{ "_id":1, "host":"192.168.116.131:22001" }, { "_id":2, "host":"192.168.116.132:22001" }, { "_id":3, "host":"192.168.116.133:22001","arbiterOnly":true}]})
[mongo-cli] $ rs.initiate({ "_id":"shard3", "members":[{ "_id":1, "host":"192.168.116.131:22002" }, { "_id":2, "host":"192.168.116.132:22002" }, { "_id":3, "host":"192.168.116.133:22002","arbiterOnly":true}]})

  1. 關閉所有副本集服務,在三臺伺服器中執行

[[email protected] ~]$ mongo --port 27017
[mongo-cli] $ db.shutdownServer()

  1. 副本集重啟開啟認證,在三臺伺服器中執行

[[email protected] ~]$ mongod --configsvr --port 21000 --dbpath /opt/mongo/data_conf/data --logpath /opt/mongo/data_conf/log/config.log --replSet confblort --fork --keyFile /opt/mongo/keyfile
[[email protected] ~]$ mongod --configsvr --port 21001 --dbpath /opt/mongo/data_conf/data --logpath /opt/mongo/data_conf/log/config.log --replSet confblort --fork --keyFile /opt/mongo/keyfile
[[email protected] ~]$ mongod --configsvr --port 21002 --dbpath /opt/mongo/data_conf/data --logpath /opt/mongo/data_conf/log/config.log --replSet confblort --fork --keyFile /opt/mongo/keyfile

  1. 新增副本集到mongos,在三臺伺服器中執行,注意分片的埠號要變,22000|22001|22002

[[email protected] ~]$ mongos --port 20000
[mongo-cli] $ sh.addShard("shard1/192.168.116.131:22000,192.168.116.132:22000,192.168.116.133:22000")

  1. 指定testdb分片生效,指定資料庫裡需要分片的集合和片鍵,在三臺伺服器中執行

    注:3.4.10以後的版本:想要分片必須用雜湊/hash鍵,避免資料傾斜。numInitialChunks初始化塊的數量,預設為shard的數量


[[email protected] ~]$ mongos --port 20000
[mongo-cli] $ db.runCommand( { enablesharding :"test"});
[mongo-cli] $ db.runCommand( { shardcollection : "test.table1",key : {"_id":"hashed"} ,"numInitialChunks":3} )

至此,分片配置完成,啟動成功

以下是筆者整理後的Mongo Shell,一目瞭然,言簡意賅,免費供大家使用:
https://github.com/yuzhou152/MongoConfig-Shell.git