Mongo配置主從,副本集,分片
Mongo配置
Mongo在2010年NoSQL浪潮掀起的過程中脫穎而出,較關係型資料庫而言,它將表間的關係去除掉,保留了繁多的資料型別,而且將消除了表關係的劣勢轉化為資料結構的可擴充套件性,這是它之所以流行的一大特色。
從負載的角度來說,Mongo擁有主從=>副本集=>分片的水平擴充套件能力,自帶監控元件、備份及恢復的能力。mongo也有自己的事物,控制在collection級別,預設使用讀寫鎖,讀鎖和讀鎖不排斥,讀鎖和寫鎖排斥。遇到實時性不強又需要深度計算的資料有可以使用自帶的MapReduce能力,包含了geo的整套演算法元件。
總之,如果你的專案是新應用,需求會變,資料模型無法確定,想快速迭代開發,沒有佷強的資料關聯性,應用需要TB甚至 PB 級別資料儲存,應用發展迅速,需要能快速水平擴充套件,應用需要大量的地理位置查詢、文字查詢。Mongo很可能會讓你愛不釋手
下面,我們一起來認識Mongo
Mongo安裝
筆者用的是Cent OS,如需其它系統配置,請移步:https://docs.mongodb.com/manual/installation/
- 配置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
- 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
-
啟動服務
- 在192.168.116.131啟動主服務
mongod --port 27017 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --master --auth
- 在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
-
配置副本集
- 副本集通過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/
- 啟動各服務,在三臺伺服器中執行
[[email protected] ~]$ mongod --port 27017 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --replSet blort1
- 在任意一臺伺服器中執行
[[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"}
]})
- 關閉所有mongo服務,在三臺伺服器中執行
[[email protected] ~]$ mongo --port 27017
[mongo-cli] $ db.shutdownServer()
- 啟動副本集,在三臺伺服器中執行
[[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
-
配置分片
-
埠約定
mongos為 20000, config server 為 21000, shard1為 22000 , shard2為22001, shard3為22002
-
配置伺服器啟動,在三臺伺服器分別執行
-
[[email protected] ~]$ mongod --configsvr --port 21000 --dbpath /opt/mongo/data_conf/data --logpath /opt/mongo/data_conf/log/config.log --replSet confblort --fork
- 配置伺服器副本集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"}
]})
- 通過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/
- 配置伺服器重啟開啟認證,在三臺伺服器分別執行
[[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
- 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
- 副本集啟動,在三臺伺服器分別執行
[[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
- 副本集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}]})
- 關閉所有副本集服務,在三臺伺服器中執行
[[email protected] ~]$ mongo --port 27017
[mongo-cli] $ db.shutdownServer()
- 副本集重啟開啟認證,在三臺伺服器中執行
[[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
- 新增副本集到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")
-
指定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