一、簡介
MongoDB是一種強大、靈活,且易於擴展的通用型數據庫。他能擴展出非常多的功能。如二級索引(secondary index)、范圍查詢(range query)、排序、聚合(aggregation),以及地理空間索引(geospatial index)。
1、易於使用
MongoDB是一個面向文檔(document-oriented)的數據庫,而不是關系型數據庫。面向文檔的數據庫不在有“行(row)”的概念,取而代之的是更為靈活的“文檔(document)”模型。通過在文檔中嵌入文檔和數組,面向文檔的方法能夠僅適用一條記錄來表現復雜的層次關系。
不在有預定義模式(predefined schema),文檔的鍵(key)和值(value)不在是固定的類型和大小。由於沒有固定的模式,根據需要添加或刪除字段變得更容易了。
2、易於擴展
MongoDB的設計采用橫向擴展。面向文檔的數據模型使它很容易地在多台服務器之間進行數據切割。MongoDB能自動處理跨集群的數據和負載,自動重新分配文檔,以及將用戶的路由到正確機器上。
3、豐富的功能
MongoDB作為一款通用型數據庫,除了能夠創建、讀取、更新和刪除數據之外,還提供一系列不斷擴展的獨特功能。
索引(indexing):
MongoDB支持通用二級索引,允許多種快速查找,且提供唯一索引、符合索引、地理空間索引,以及全文索引。
聚合(aggregation):
MongoDB支持“聚合管道(aggregation pipeline)”。用戶能夠通過簡單的片段創建復雜的聚合,並通過數據庫自動優化。
特殊的集合類型:
MongoDB支持存在時間有限的集合,適用於那些將在某個時刻過期的數據,如會話(session)。類似的,MongoDB也支持固定大小的集合,用於保存近期數據,如日志。
文件存儲(file storage):
MongoDB支持一種非常易用的協議,用於存儲大文件和文件元數據。
MongoDB並不具備一些在關系型數據庫中很普遍的功能,如連接(join)和復雜的多事務(multirow transcation)。省略這些功能是出於架構上的考慮(為了得到更好的擴展性),因為在分布式系統中這兩個功能難以高效地實現。
4、卓越的性能
MongoDB能對文檔盡心動態填充(dynamic padding),也能預分配數據文件以利用額外的空間來換取穩定的新能。MongoDB把盡可能多的內存用作緩存(cache),一般會用盡服務器的可用內存,試圖為每次查詢自動選擇正確的索引。 所以MongoDB會非常占用服務器內存,目前並沒有什么辦法可以限制MongoDB占用內存的方法,所以一般不建議在MongoDB服務器上啟用其他進程。
二、下載安裝包
下載地址為:https://www.mongodb.com/download-center?jmp=nav#community
Windows: mongodb-win32-x86_64-2008plus-ssl-3.6.4.zip
Linux(CentOS 7): mongodb-linux-x86_64-rhel70-3.6.4.tgz
注意:這里下載的都是壓縮包,本文不提供rpm和msi等可執行程序的安裝方式
三、Windows下的MongoDB單節點安裝
我們將下載完的包解壓:C:/context/mongodb
在工作目錄下創建MongoDB數據存放目錄:D:/workspaces/mongodbspaces/data
在工作目錄下創建MongoDB日志文件:D:/workspaces/mongodbspaces/logs/mongodb.log
在安裝目錄下創建config目錄:C:/context/mongodb/config
在配置目錄下創建配置文件:C:/context/mongodb/config/config.conf
修改配置文件:
systemLog: # 日志級別,0:包含“info”信息,1~5,即大於0的值均會包含debug信息。類型: integer,默認: 0 verbosity: 0 # 發送所有的診斷信息日志文件的路徑。systemLog.destination為file時有效。類型: string。 path: D:/workspaces/mongodbspaces/logs/mongodb.log # 如果是true,則mongod服務重啟時會將日志追加到日志末尾,否則每次重啟會備份已有的日志並創建新日志。 # 類型: boolean。默認: false。 logAppend: true # 日志輸出目的地,可以指定為“file”或者“syslog”,如果指定“file”則必須要設置systemLog.path。 # 如果不指定,則會輸出到標准輸出中(standard output)。 destination: file processManagement: # Windows特有配置選項 windowsService: # mongos/mongod作為Windows服務時的服務名稱,在net start <name>和net stop <name>時使用。 # 類型: string。默認: MongoDB # 必須與--install 安裝服務或者--remove刪除服務結合使用。 serviceName: MongoDB # 在服務管理應用程序中MongoDB服務應用程序的名稱。默認: MongoDB displayName: MongoDB # 設置MongoDB服務的描述,默認為MongoDB Server,在--install安裝服務時使用。 description: MongoDB Server net: # mongod/mongos服務偵聽客戶端連接的端口。類型: int。默認: 27017。 port: 27017 # mongod/monogs應用偵聽客戶端的IP地址或者完整UNIX域套接字路徑,如果想要綁定多個地址使用逗號分隔。 # 若要綁定到所有IPv4地址,請輸入0.0.0.0。與net.bindIpAll配置互斥,不能同時配置兩個。 # 類型: string。默認: localhost bindIp: 0.0.0.0 security: # 打開訪問數據庫和進行操作的用戶角色認證,僅mongod有效。disabled: 關閉; enabled: 開啟(默認開啟) authorization: enabled # 啟用或禁用服務器端JavaScript執行,僅mongod有效。 # 如果為false,那么任何與javascript相關的功能都不能使用。類型: boolean。默認: true javascriptEnabled: true setParameter: # 如果開啟,則允許本機(localhost/127.0.0.1)第一次訪問時不需要密碼認證,以便於創建第一個admin數據庫的用戶 # true/1或者false/0,默認為true。mongods和mongod有效,建議mongod關閉該功能。 enableLocalhostAuthBypass: true # 認證機制,可選值為“SCRAM-SHA-1”、“MONGODB-CR”、“PLAN”等,建議為“SCRAM-SHA-1” authenticationMechanisms: SCRAM-SHA-1 storage: # mongod實例存儲數據庫文件路徑,僅mongod有效。類型: string dbPath: D:/workspaces/mongodbspaces/data journal: # 是否開啟journal日志持久存儲,journal日志用來數據恢復, # 是mongod最基礎的特性,通常用於故障恢復,僅mongod有效。 # 類型: boolean。64bit默認為true,32bit默認為false enabled: true # 是否將不同DB的數據存儲在不同的目錄中,dbPath的子目錄,目錄名為db的名稱,僅mongod有效。 # 類型: boolean。默認: false directoryPerDB: true # mongod存儲引擎類型,僅mongod有效,可選mmapv1、wiredTiger、inMemory(企業版專用)。3.2之后默認: wiredTiger engine: wiredTiger
wiredTiger: engineConfig: # wiredTiger緩存工作集(working set)數據的內存的最大大小。mmapv1引擎沒有改配置,會占用系統所有內存。 # 這個值需要合理的規划,如果過小會影響MongoDB讀寫性能,如果過大則會大量使用swap甚至進程會被Linux內存管理進程kill。 # 單位:GB,默認值最小256M,如果內存大於512M則默認50%。官方推薦不要將值設置為大於默認值。僅mongod有效 cacheSizeGB: 1 # 是否將集合數據和索引數據分兩個目錄存儲,默認: false。僅mongod有效 directoryForIndexes: true
配置mongodb環境變量這里就不贅述了。我們執行命令將MongoDB安裝成服務:
mongod.exe --config C:/context/mongodb/config/config.conf --install
如果需要刪除MongoDB服務,則需要執行命令:
mongod.exe --config C:/context/mongodb/config/config.conf --remove
如果需要重新安裝MongoDB(先卸載再安裝),則需要執行:
mongod.exe --config C:/context/mongodb/config/config.conf --reinstall
需要注意的是,這里的--config選項的值必須是絕對路徑,也可以使用-f參數后面跟配置文件路徑,這些操作都必須是在管理員CMD命令窗口里面完成。至此MongoDB的安裝已經完成,我們需要先啟動MongoDB服務,然后創建admin數據庫下的管理員賬號和密碼:
C:\Users\Administrator> mongo ... > use admin ... > db.createUser({user: "root", pwd: "root", roles: [{role: "root", db: "admin"}]}) ...
需要注意的是,由於我們第一次啟動之前就已經打開了角色認證功能: security.authorization: enabled,但是初始是沒有用戶和密碼的。MongoDB中 setParameter.enableLocalhostAuthBypass: true 這個配置是默認開啟的,使用localhost/127.0.0.1第一次登錄的時候可以免去角色認證,但是也僅有一次機會。
四、Linux下的MongoDB單節點安裝
我們將下載完的包解壓:
[root@abc] tar -zxvf mongodb-linux-x86_64-rhel70-3.6.4.tgz -C /usr/local/ [root@abc] mv /usr/local/mongodb-linux-x86_64-rhel70-3.6.4 /usr/local/mongodb
在工作目錄下創建MongoDB數據存放目錄:
[root@abc] mkdir /data/mongodb/data -p
在工作目錄下創建MongoDB日志文件:
[root@abc] mkdir /data/mongodb/logs/ -p [root@abc] touch /data/mongodb/logs/mongodb.log
在安裝目錄下創建config配置文件,並編輯配置文件:
[root@abc] mkdir /usr/local/mongodb/config -p [root@abc] vim /usr/local/mongodb/config/config.conf
systemLog: # 日志級別,0:包含“info”信息,1~5,即大於0的值均會包含debug信息。類型: integer,默認: 0 verbosity: 0 # 發送所有的診斷信息日志文件的路徑。systemLog.destination為file時有效。類型: string。 path: /data/mongodb/logs/mongodb.log # 如果是true,則mongod服務重啟時會將日志追加到日志末尾,否則每次重啟會備份已有的日志並創建新日志。 # 類型: boolean。默認: false。 logAppend: true # 日志輸出目的地,可以指定為“file”或者“syslog”,如果指定“file”則必須要設置systemLog.path。 # 如果不指定,則會輸出到標准輸出中(standard output)。 destination: file processManagement: # 是否以守護進程(后台進程)的方式運行mongod/mongos進程。類型: boolean。默認: false。 fork: true # 配合"fork:true"參數,將mongod/mongos進程ID寫入指定的文件,如果不指定,將不會創建PID文件。類型: string pidFilePath: /data/mongodb/logs/mongodb.pid net: # mongod/mongos服務偵聽客戶端連接的端口。類型: int。默認: 27017。 port: 27017 # mongod/monogs應用偵聽客戶端的IP地址或者完整UNIX域套接字路徑,如果想要綁定多個地址使用逗號分隔。 # 若要綁定到所有IPv4地址,請輸入0.0.0.0。與net.bindIpAll配置互斥,不能同時配置兩個。 # 類型: string。默認: localhost bindIp: 0.0.0.0 security: # 打開訪問數據庫和進行操作的用戶角色認證,僅mongod有效。disabled: 關閉; enabled: 開啟(默認開啟) authorization: enabled setParameter: # 如果開啟,則允許本機(localhost/127.0.0.1)第一次訪問時不需要密碼認證,以便於創建第一個admin數據庫的用戶 # true/1或者false/0,默認為true。mongods和mongod有效,建議mongod關閉該功能。 enableLocalhostAuthBypass: true # 認證機制,可選值為“SCRAM-SHA-1”、“MONGODB-CR”、“PLAN”等,建議為“SCRAM-SHA-1” authenticationMechanisms: SCRAM-SHA-1 storage: # mongod實例存儲數據庫文件路徑,僅mongod有效。類型: string dbPath: /data/mongodb/data journal: # 是否開啟journal日志持久存儲,journal日志用來數據恢復, # 是mongod最基礎的特性,通常用於故障恢復,僅mongod有效。 # 類型: boolean。64bit默認為true,32bit默認為false enabled: true # 是否將不同DB的數據存儲在不同的目錄中,dbPath的子目錄,目錄名為db的名稱,僅mongod有效。 # 類型: boolean。默認: false directoryPerDB: true # mongod存儲引擎類型,僅mongod有效,可選mmapv1、wiredTiger、inMemory(企業版專用)。3.2之后默認: wiredTiger engine: wiredTiger
wiredTiger: engineConfig: # wiredTiger緩存工作集(working set)數據的內存的最大大小。mmapv1引擎沒有改配置,會占用系統所有內存。 # 這個值需要合理的規划,如果過小會影響MongoDB讀寫性能,如果過大則會大量使用swap甚至進程會被內存管理器kill。 # 單位:GB,默認值最小256M,如果內存大於512M則默認50%。官方推薦不要將值設置為大於默認值。僅mongod有效 cacheSizeGB: 1 # 是否將集合數據和索引數據分兩個目錄存儲,默認: false。僅mongod有效 directoryForIndexes: true
創建mongodb.service文件,將mongodb配置成Linux服務:
[root@abc] vim /lib/systemd/system/mongodb.service
[Unit] Description=mongodb After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=numactl --interleave=all /usr/local/mongodb/bin/mongod --config /usr/local/mongodb/config/config.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/usr/local/mongodb/bin/mongod --shutdown --config /usr/local/mongodb/config/config.conf PrivateTmp=true [Install] WantedBy=multi-user.target
設置MongoDB服務開機啟動:
[root@abc] systemctl enable mongodb.service
如果需要取消開機啟動則執行: systemctl disable mongodb.service
第一次啟動MongoDB服務:
[root@abc] systemctl start mongodb.service
如果需要停止服務則執行: systemctl stop mongodb.service
配置mongodb環境變量:
[root@abc] vim /etc/profile
... ... export PATH=$PATH:/usr/local/mongodb/bin :wq
[root@abc] source /etc/profile
然后開始創建admin數據庫的root角色用戶。記住,這里只有一次機會免密碼登入創建用戶:
[root@abc] mongo ... > use admin ... > db.createUser({user: "root", pwd: "root", roles: [{role: "root", db: "admin"}]}) ...
五、Linux下的MongoDB集群安裝
在安裝之前,我們得先要了解一下MongoDB集群的集群類型,以及集群中的一些角色和它們的作用。mongodb有傳統的主從集群(未來可能會被廢棄)、副本集集群和分片集群三種模式的集群,傳統的主從集群這里不做介紹。副本集和分片兩種集群模式並不對立,既可以單獨部署也可以組合部署。
1、副本集

在副本集集群中有兩種類型的角色:主節點(primary)和備用節點(secondary)。客戶端只會與主節點進行數據交互(只有主節點允許寫操作),備用節點通過oplog日志異步復制主節點數據,oplog包含了主節點的每一次寫操作,是主節點中local數據庫中的一個固定集合,備用節點通過這個集合復制主節點數據,每個備用節點都維護着自己的oplog,記錄者每一次從主節點復制數據的操作,備用節點不對外提供服務。
集群中每個成員會每隔2秒向其他成員發送一條心跳請求,確認集群中成員的狀態(那個是主節點,那個可以作為同步源、 那個節點下線了),心跳信息量非常小,用於檢查每個成員狀態。心跳的功能之一就是讓主節點知道自己是否滿足集合“大多數”的條件,如果主節點不在得到“大多數”服務器的支持,他就會退位,變成備用節點。
如果主節點宕機或者由於網絡原因,備用節點無法連接到主節點,那么所有得到這個消息的備用節點都會申請被選舉成為主節點,希望被選舉成為主節點的成員會向它能到達的所有成員發送通知。如果這個申請選舉的成員不符合候選主節點要求(這個成員的數據落后於副本集,或者只是由於網絡原因備用節點無法到達主節點而申請的選舉),其他成員不會進行選舉。
如果沒有反對理由,那么其他成員就會對這個成員進行選舉投票。如果這個成員得到副本集中“大多數”贊成票,那么它就會被選舉成為主節點。如果達不到“大多數”的要求,那么選舉失敗,它仍然助於備用節點狀態,它之后還可以在此申請。主節點會一直處於主節點狀態,除非它由於不在滿足“大多數”的要求而退位。副本集節點數據必須是奇數個,否則在選舉時可能會出現平局的選舉結果導致無法出現主節點而集群不能工作。如果一定要使用偶數個節點,那么就必須再加一個仲裁節點,仲裁節點只會在選舉平局的時候出來仲裁,並不會提供其他任何服務,所以占用資源非常少,但官方建議使用奇數個節點。
2、分片

分片是指將數據拆分,將其分散存放到不同的機器上的過程。在分片集群中有配置服務(Config Server)、路由服務(Router Server)、和分片服務(Shard Server)等角色。mongodb本身有兩種組件:mongod和mongos,Shard Server和Config Server服務是以mongod類型的進程運行的,Router Server是以mongos類型的進程運行的。
Config Server:配置服務相當於集群大腦,保存着集群和分片的元數據,即各分片包含着那些數據的信息。MongDB 3.4 之后要求配置服務必須是奇數個節點的副本集,否則集群不能正常啟動。鑒於配置服務所包含的數據極端重要,所以必須啟用日志功能,並確保其數據保存在非易失性驅動器上。
Router Server:前端路由,客戶端由此接入,且讓整個集群看上去像單一數據庫,前端應用可以透明使用。mongos能夠根據給定的片鍵找到文檔的存放位置,但當集群中存在成千上萬個文檔時,就會難以操作。因此將文檔分組為塊(chunk),每個塊由給定片鍵特定范圍內的文檔組成。一個塊只存在一個分片上,所以可以使用一個比較小的空間就能夠維護塊和分片間的映射。數據塊大小是固定的,均衡器(balancer)會周期性地檢查快的大小,當塊超過這個大小之后,會有均衡器將其拆分為多個塊,以保證數據均衡。
Shard Server:用於存儲實際的數據塊,實際生產環境中一個shard server角色可由幾台機器組個一個副本集承擔,防止主機單點故障。當需要對集合分片時,就必須得指定一個片鍵,片鍵必須有索引,如果集合已存儲了大量數據,那么基本就不可能再修改片鍵了,因此選擇片鍵時需要慎重。
3、分片+副本集集群安裝
通過上面的描述,我們大概已經了解了分片+副本集集群的相關概念,可以開始安裝了。這里我們提供三台機器供安裝,服務規划為:
| 172.23.102.56 | 172.23.102.57 | 172.23.102.58 |
| mongos port:27017 | mongos port:27017 | mongos port:27017 |
| config server port:27018 | config server port:27018 | config server port:27018 |
| shard1 server port:27019 | shard1 server port:27019 | shard1 server port:27019 |
| shard2 server port:27020 | shard2 server port:27020 | shard2 server port:27020 |
| shard3 server port:28021 | shard3 server port:28021 | shard3 server port:28021 |
將安裝包解壓到/use/local/mongodb目錄下(三個機器相同操作):
[root@abc] tar -zxvf mongodb-linux-x86_64-rhel70-3.6.4.tgz -C /usr/local/ [root@abc] mv /usr/local/mongodb-linux-x86_64-rhel70-3.6.4 /usr/local/mongodb
在安裝目錄下創建配置文件存放目錄和配置文件(三個機器相同操作):
[root@abc] mkdir /usr/local/mongodb/config [root@abc] cd /usr/local/mongodb/config [root@abc] touch mongos.conf config.conf shard1.conf shard2.conf shard3.conf
配置文件目錄和配置文件都已經創建好了,其中 mongos.conf 為路由服務配置文件, config.conf 為配置服務配置文件, shard1.conf shard2.conf shard3.conf 為三個分片服務配置文件。我們開始創建數據存儲目錄(三個機器相同操作):
[root@abc] mkdir /data/mongodb/mongos/logs -p ## mongos日志文件存儲目錄,由於mongos不存儲數據,所以不需要數據存儲目錄 [root@abc] touch /data/mongodb/mongos/logs/mongos.log ## mongos日志文件 [root@abc] mkdir /data/mongodb/config/logs -p ## config日志文件存儲目錄 [root@abc] touch /data/mongodb/config/logs/config.log ## config日志文件 [root@abc] mkdir /data/mongodb/config/data -p ## config數據文件存儲目錄 [root@abc] mkdir /data/mongodb/shard1/logs -p ## 第一個分片日志文件存儲目錄 [root@abc] touch /data/mongodb/shard1/logs/shard1.log ## 第一個分片日志文件 [root@abc] mkdir /data/mongodb/shard1/data -p ## 第一個分片數據文件存儲目錄 [root@abc] mkdir /data/mongodb/shard2/logs -p ## 第二個分片日志文件存儲目錄 [root@abc] touch /data/mongodb/shard2/logs/shard2.log ## 第二個分片日志文件 [root@abc] mkdir /data/mongodb/shard2/data -p ## 第二個分片數據文件存儲目錄 [root@abc] mkdir /data/mongodb/shard3/logs -p ## 第三個分片日志文件存儲目錄 [root@abc] touch /data/mongodb/shard3/logs/shard3.log ## 第三個分片日志文件 [root@abc] mkdir /data/mongodb/shard3/data -p ## 第三個分片數據文件存儲目錄
在這里我們使用keyFile的方式作為集群成員之間的安全校驗,所以需要先生成keyFile文件:
[root@abc] openssl rand -base64 756 > /usr/local/mongodb/keyFile.file [root@abc] chmod 400 /usr/local/mongodb/keyFile.file
編寫config server配置文件,在三個機器中除 net.bindIp 配置需要對應到不同的機器之外,其他配置都一樣:
systemLog: # 日志級別,0:包含“info”信息,1~5,即大於0的值均會包含debug信息。類型: integer,默認: 0 verbosity: 0 # 發送所有的診斷信息日志文件的路徑。systemLog.destination為file時有效。類型: string。 path: /data/mongodb/config/logs/config.log # 如果是true,則mongod服務重啟時會將日志追加到日志末尾,否則每次重啟會備份已有的日志並創建新日志。 # 類型: boolean。默認: false。 logAppend: true # 日志輸出目的地,可以指定為“file”或者“syslog”,如果指定“file”則必須要設置systemLog.path。 # 如果不指定,則會輸出到標准輸出中(standard output)。 destination: file processManagement: # 是否以守護進程(后台進程)的方式運行mongod/mongos進程。類型: boolean。默認: false。 # 在Linux下如果是使用npm包的方式安裝,並使用自帶的init script腳本,則不推薦修改默認值。 # 否則需要禁用默認的init script,而使用自己的init script。 fork: true # 配合"fork:true"參數,將mongod/mongos進程ID寫入指定的文件,如果不指定,將不會創建PID文件。類型: string pidFilePath: /data/mongodb/config/logs/config.pid net: # mongod/mongos服務偵聽客戶端連接的端口。類型: int。默認: 27017。 port: 27018 # mongod/monogs應用偵聽客戶端的IP地址或者完整UNIX域套接字路徑,如果想要綁定多個地址使用逗號分隔。 # 若要綁定到所有IPv4地址,請輸入0.0.0.0。與net.bindIpAll配置互斥,不能同時配置兩個。 # 類型: string。默認: localhost bindIp: 127.0.0.1,172.23.102.56 / 127.0.0.1,172.23.102.57 / 127.0.0.1,172.23.102.58 #這里三個設備分別對應 security: # 密鑰文件的路徑,它存儲MongoDB實例在共享的集群或副本集中相互驗證的共享密鑰。 # 必須設置security.authorization為enable。類型: string keyFile: /usr/local/mongodb/keyFile.file # 集群成員之間的認證模式。類型: string。可選: keyFile、sendKeyFile、sendX509、x509。默認: keyFile。 clusterAuthMode: keyFile # 打開訪問數據庫和進行操作的用戶角色認證,僅mongod有效。disabled: 關閉; enabled: 開啟(默認開啟) authorization: enabled # 啟用或禁用服務器端JavaScript執行,僅mongod有效。 # 如果為false,那么任何與javascript相關的功能都不能使用。類型: boolean。默認: true javascriptEnabled: true setParameter: # 如果開啟,則允許本機(localhost/127.0.0.1)第一次訪問時不需要密碼認證,以便於創建第一個admin數據庫的用戶 # true/1或者false/0,默認為true。mongods和mongod有效,建議mongod關閉該功能。 enableLocalhostAuthBypass: true # 認證機制,可選值為“SCRAM-SHA-1”、“MONGODB-CR”、“PLAN”等,建議為“SCRAM-SHA-1” authenticationMechanisms: SCRAM-SHA-1 storage: # mongod實例存儲數據庫文件路徑,僅mongod有效。類型: string dbPath: /data/mongodb/config/data journal: # 記錄操作日志,防止數據丟失。64bit默認為true,32bit默認為false enabled: true # 是否將不同DB的數據存儲在不同的目錄中,dbPath的子目錄,目錄名為db的名稱,僅mongod有效。類型: boolean。默認: false directoryPerDB: true # mongod使用fsync操作將數據flush到磁盤的時間間隔,僅mongod有效,不建議修改默認值。類型: number。默認: 60 syncPeriodSecs: 60 # mongod存儲引擎類型,僅mongod有效,可選mmapv1、wiredTiger、inMemory(企業版專用)。3.2之后默認: wiredTiger engine: wiredTiger
wiredTiger: engineConfig: # wiredTiger緩存工作集(working set)數據的內存的最大大小。mmapv1引擎沒有改配置,會占用系統所有內存。 # 這個值需要合理的規划,如果過小會影響MongoDB讀寫性能,如果過大則會大量使用swap甚至進程會被Linux內存管理進程kill。 # 單位:GB,默認值最小256M,如果內存大於512M則默認50%。官方推薦不要將值設置為大於默認值。僅mongod有效 cacheSizeGB: 1 # 是否將集合數據和索引數據分兩個目錄存儲,默認: false。僅mongod有效 directoryForIndexes: true replication: # 指定oplog的最大尺寸。對於已經建立過oplog.rs的數據庫,指定無效。 # 默認為磁盤的5%。僅mongod有效 # oplogSizeMB: # 指定副本集的名稱。僅mongod有效 replSetName: config # 指定副本集成員在接受oplog之前是否加載索引到內存。默認會加載所有的索引到內存。 # none,不加載;all,加載所有;_id_only,僅加載_id。僅mongod有效 secondaryIndexPrefetch: all sharding: # 指定分片集的mongodb角色。configsvr: 配置服務器。shardsvr: 分片實例。僅mongod有效 clusterRole: configsvr # 在塊移動過程中,該選項強制mongodb實例保存所有移動的文檔到moveChunk目錄。 # 在版本3.2及以后版本中默認值為false。 archiveMovedChunks: false
分別啟動三個機器上的config server:
[root@abc] numactl --interleave=all mongod --config /usr/local/mongodb/config/config.conf
當三個機器上的配置服務都啟動之后,然后隨便選擇一個服務登入,將三個配置服務節點添加到一個副本集中:
[root@abc] mongo --port 27018 #連接 ... > config = { > ... _id: "config", # 配置文件中配置服務副本集的名稱 > ... members: [ > ... { _id: 0, host: "172.23.102.56:27018", priority: 100 }, > ... { _id: 1, host: "172.23.102.57:27018", priority: 99 }, > ... { _id: 2, host: "172.23.102.58:27018", priority: 98 } > ... ] > ... } # 設置變量 ... rs.initiate(config) # 初始化副本集 ... rs.status() # 查看副本集狀態 ...
priority 代表優先級,數值越大優先級越高。如果這里使用的是偶數個節點的話,那么就需要多加一個參數 {_id : 2, host : "172.23.102.58:27018", priority: 98, arbiterOnly: true } ,表示58這個機器為仲裁節點。需要注意的是,配置服務一定要在mongos路由服務之前啟動並初始化完成,因為mongos服務需要依賴配置服務中的數據。
編寫shard1 server配置文件,在三個機器中除 net.bindIp 配置需要對應到不同的機器之外,其他配置都一樣:
systemLog: # 日志級別,0:包含“info”信息,1~5,即大於0的值均會包含debug信息。類型: integer,默認: 0 verbosity: 0 # 發送所有的診斷信息日志文件的路徑。systemLog.destination為file時有效。類型: string。 path: /data/mongodb/shard1/logs/shard1.log # 如果是true,則mongod服務重啟時會將日志追加到日志末尾,否則每次重啟會備份已有的日志並創建新日志。 # 類型: boolean。默認: false。 logAppend: true # 日志輸出目的地,可以指定為“file”或者“syslog”,如果指定“file”則必須要設置systemLog.path。 # 如果不指定,則會輸出到標准輸出中(standard output)。 destination: file processManagement: # 是否以守護進程(后台進程)的方式運行mongod/mongos進程。類型: boolean。默認: false。 # 在Linux下如果是使用npm包的方式安裝,並使用自帶的init script腳本,則不推薦修改默認值。 # 否則需要禁用默認的init script,而使用自己的init script。 fork: true # 配合"fork:true"參數,將mongod/mongos進程ID寫入指定的文件,如果不指定,將不會創建PID文件。類型: string pidFilePath: /data/mongodb/shard1/logs/shard1.pid net: # mongod/mongos服務偵聽客戶端連接的端口。類型: int。默認: 27017。 port: 27019 # mongod/monogs應用偵聽客戶端的IP地址或者完整UNIX域套接字路徑,如果想要綁定多個地址使用逗號分隔。 # 若要綁定到所有IPv4地址,請輸入0.0.0.0。與net.bindIpAll配置互斥,不能同時配置兩個。 # 類型: string。默認: localhost bindIp: 127.0.0.1,172.23.102.56 / 127.0.0.1,172.23.102.57 / 127.0.0.1,172.23.102.58 #這里三個設備分別對應 security: # 密鑰文件的路徑,它存儲MongoDB實例在共享的集群或副本集中相互驗證的共享密鑰。 # 必須設置security.authorization為enable。類型: string keyFile: /usr/local/mongodb/keyFile.file # 集群成員之間的認證模式。類型: string。可選: keyFile、sendKeyFile、sendX509、x509。默認: keyFile。 clusterAuthMode: keyFile # 打開訪問數據庫和進行操作的用戶角色認證,僅mongod有效。disabled: 關閉; enabled: 開啟(默認開啟) authorization: enabled # 啟用或禁用服務器端JavaScript執行,僅mongod有效。 # 如果為false,那么任何與javascript相關的功能都不能使用。類型: boolean。默認: true javascriptEnabled: true setParameter: # 如果開啟,則允許本機(localhost/127.0.0.1)第一次訪問時不需要密碼認證,以便於創建第一個admin數據庫的用戶 # true/1或者false/0,默認為true。mongods和mongod有效,建議mongod關閉該功能。 enableLocalhostAuthBypass: true # 認證機制,可選值為“SCRAM-SHA-1”、“MONGODB-CR”、“PLAN”等,建議為“SCRAM-SHA-1” authenticationMechanisms: SCRAM-SHA-1 storage: # mongod實例存儲數據庫文件路徑,僅mongod有效。類型: string dbPath: /data/mongodb/shard1/data journal: # 記錄操作日志,防止數據丟失。64bit默認為true,32bit默認為false enabled: true # 是否將不同DB的數據存儲在不同的目錄中,dbPath的子目錄,目錄名為db的名稱,僅mongod有效。類型: boolean。默認: false directoryPerDB: true # mongod使用fsync操作將數據flush到磁盤的時間間隔,僅mongod有效,不建議修改默認值。類型: number。默認: 60 syncPeriodSecs: 60 # mongod存儲引擎類型,僅mongod有效,可選mmapv1、wiredTiger、inMemory(企業版專用)。3.2之后默認: wiredTiger engine: wiredTiger wiredTiger: engineConfig: # wiredTiger緩存工作集(working set)數據的內存的最大大小。mmapv1引擎沒有改配置,會占用系統所有內存。 # 這個值需要合理的規划,如果過小會影響MongoDB讀寫性能,如果過大則會大量使用swap甚至進程會被Linux內存管理進程kill。 # 單位:GB,默認值最小256M,如果內存大於512M則默認50%。官方推薦不要將值設置為大於默認值。僅mongod有效 cacheSizeGB: 3 # 是否將集合數據和索引數據分兩個目錄存儲,默認: false。僅mongod有效 directoryForIndexes: true replication: # 指定oplog的最大尺寸。對於已經建立過oplog.rs的數據庫,指定無效。 # 默認為磁盤的5%。僅mongod有效 # oplogSizeMB: # 指定副本集的名稱。僅mongod有效 replSetName: shard1 # 指定副本集成員在接受oplog之前是否加載索引到內存。默認會加載所有的索引到內存。 # none,不加載;all,加載所有;_id_only,僅加載_id。僅mongod有效 secondaryIndexPrefetch: all sharding: # 指定分片集的mongodb角色。configsvr: 配置服務器。shardsvr: 分片實例。僅mongod有效 clusterRole: shardsvr # 在塊移動過程中,該選項強制mongodb實例保存所有移動的文檔到moveChunk目錄。 # 在版本3.2及以后版本中默認值為false。 archiveMovedChunks: false
分別啟動三個機器上的shard1 server:
[root@abc] numactl --interleave=all mongod --config /usr/local/mongodb/config/shard1.conf
當三個機器上的第一個分片服務都啟動之后,然后隨便選擇一個服務登入,將三個配置服務節點添加到一個副本集中:
[root@abc] mongo --port 27019 #連接 ... > config = { > ... _id: "shard1", # 配置文件中第一個分片副本集的名稱 > ... members: [ > ... { _id: 0, host: "172.23.102.56:27019", priority: 98 }, > ... { _id: 1, host: "172.23.102.57:27019", priority: 99 }, > ... { _id: 2, host: "172.23.102.58:27019", priority: 100 } > ... ] > ... } # 設置變量 ... rs.initiate(config) # 初始化副本集 ... rs.status() # 查看副本集狀態
...
priority 代表優先級,數值越大優先級越高。如果這里使用的是偶數個節點的話,那么就需要多加一個參數 {_id : 1, host : "172.23.102.57:27019", priority: 98, arbiterOnly: true } ,表示57這個機器為仲裁節點。
編寫shard2 server配置文件,在三個機器中除 net.bindIp 配置需要對應到不同的機器之外,其他配置都一樣:
systemLog: # 日志級別,0:包含“info”信息,1~5,即大於0的值均會包含debug信息。類型: integer,默認: 0 verbosity: 0 # 發送所有的診斷信息日志文件的路徑。systemLog.destination為file時有效。類型: string。 path: /data/mongodb/shard2/logs/shard2.log # 如果是true,則mongod服務重啟時會將日志追加到日志末尾,否則每次重啟會備份已有的日志並創建新日志。 # 類型: boolean。默認: false。 logAppend: true # 日志輸出目的地,可以指定為“file”或者“syslog”,如果指定“file”則必須要設置systemLog.path。 # 如果不指定,則會輸出到標准輸出中(standard output)。 destination: file processManagement: # 是否以守護進程(后台進程)的方式運行mongod/mongos進程。類型: boolean。默認: false。 # 在Linux下如果是使用npm包的方式安裝,並使用自帶的init script腳本,則不推薦修改默認值。 # 否則需要禁用默認的init script,而使用自己的init script。 fork: true # 配合"fork:true"參數,將mongod/mongos進程ID寫入指定的文件,如果不指定,將不會創建PID文件。類型: string pidFilePath: /data/mongodb/shard2/logs/shard2.pid net: # mongod/mongos服務偵聽客戶端連接的端口。類型: int。默認: 27017。 port: 27020 # mongod/monogs應用偵聽客戶端的IP地址或者完整UNIX域套接字路徑,如果想要綁定多個地址使用逗號分隔。 # 若要綁定到所有IPv4地址,請輸入0.0.0.0。與net.bindIpAll配置互斥,不能同時配置兩個。 # 類型: string。默認: localhost bindIp: 127.0.0.1,172.23.102.56 / 127.0.0.1,172.23.102.57 / 127.0.0.1,172.23.102.58 #這里三個設備分別對應 security: # 密鑰文件的路徑,它存儲MongoDB實例在共享的集群或副本集中相互驗證的共享密鑰。 # 必須設置security.authorization為enable。類型: string keyFile: /usr/local/mongodb/keyFile.file # 集群成員之間的認證模式。類型: string。可選: keyFile、sendKeyFile、sendX509、x509。默認: keyFile。 clusterAuthMode: keyFile # 打開訪問數據庫和進行操作的用戶角色認證,僅mongod有效。disabled: 關閉; enabled: 開啟(默認開啟) authorization: enabled # 啟用或禁用服務器端JavaScript執行,僅mongod有效。 # 如果為false,那么任何與javascript相關的功能都不能使用。類型: boolean。默認: true javascriptEnabled: true setParameter: # 如果開啟,則允許本機(localhost/127.0.0.1)第一次訪問時不需要密碼認證,以便於創建第一個admin數據庫的用戶 # true/1或者false/0,默認為true。mongods和mongod有效,建議mongod關閉該功能。 enableLocalhostAuthBypass: true # 認證機制,可選值為“SCRAM-SHA-1”、“MONGODB-CR”、“PLAN”等,建議為“SCRAM-SHA-1” authenticationMechanisms: SCRAM-SHA-1 storage: # mongod實例存儲數據庫文件路徑,僅mongod有效。類型: string dbPath: /data/mongodb/shard2/data journal: # 記錄操作日志,防止數據丟失。64bit默認為true,32bit默認為false enabled: true # 是否將不同DB的數據存儲在不同的目錄中,dbPath的子目錄,目錄名為db的名稱,僅mongod有效。類型: boolean。默認: false directoryPerDB: true # mongod使用fsync操作將數據flush到磁盤的時間間隔,僅mongod有效,不建議修改默認值。類型: number。默認: 60 syncPeriodSecs: 60 # mongod存儲引擎類型,僅mongod有效,可選mmapv1、wiredTiger、inMemory(企業版專用)。3.2之后默認: wiredTiger engine: wiredTiger wiredTiger: engineConfig: # wiredTiger緩存工作集(working set)數據的內存的最大大小。mmapv1引擎沒有改配置,會占用系統所有內存。 # 這個值需要合理的規划,如果過小會影響MongoDB讀寫性能,如果過大則會大量使用swap甚至進程會被Linux內存管理進程kill。 # 單位:GB,默認值最小256M,如果內存大於512M則默認50%。官方推薦不要將值設置為大於默認值。僅mongod有效 cacheSizeGB: 3 # 是否將集合數據和索引數據分兩個目錄存儲,默認: false。僅mongod有效 directoryForIndexes: true replication: # 指定oplog的最大尺寸。對於已經建立過oplog.rs的數據庫,指定無效。 # 默認為磁盤的5%。僅mongod有效 # oplogSizeMB: # 指定副本集的名稱。僅mongod有效 replSetName: shard2 # 指定副本集成員在接受oplog之前是否加載索引到內存。默認會加載所有的索引到內存。 # none,不加載;all,加載所有;_id_only,僅加載_id。僅mongod有效 secondaryIndexPrefetch: all sharding: # 指定分片集的mongodb角色。configsvr: 配置服務器。shardsvr: 分片實例。僅mongod有效 clusterRole: shardsvr # 在塊移動過程中,該選項強制mongodb實例保存所有移動的文檔到moveChunk目錄。 # 在版本3.2及以后版本中默認值為false。 archiveMovedChunks: false
分別啟動三個機器上的shard2 server:
[root@abc] numactl --interleave=all mongod --config /usr/local/mongodb/config/shard2.conf
當三個機器上的第二個分片服務都啟動之后,然后隨便選擇一個服務登入,將三個配置服務節點添加到一個副本集中:
[root@abc] mongo --port 27020 #連接 ... > config = { > ... _id: "shard2", # 配置文件中第二個分片副本集的名稱 > ... members: [ > ... { _id: 0, host: "172.23.102.56:27020", priority: 98 }, > ... { _id: 1, host: "172.23.102.57:27020", priority: 100 }, > ... { _id: 2, host: "172.23.102.58:27020", priority: 99 } > ... ] > ... } # 設置變量 ... rs.initiate(config) # 初始化副本集 ... rs.status() # 查看副本集狀態
...
priority 代表優先級,數值越大優先級越高。如果這里使用的是偶數個節點的話,那么就需要多加一個參數 {_id : 0, host : "172.23.102.56:27020", priority: 98, arbiterOnly: true } ,表示56這個機器為仲裁節點。
編寫shard3 server配置文件,在三個機器中除 net.bindIp 配置需要對應到不同的機器之外,其他配置都一樣:
systemLog: # 日志級別,0:包含“info”信息,1~5,即大於0的值均會包含debug信息。類型: integer,默認: 0 verbosity: 0 # 發送所有的診斷信息日志文件的路徑。systemLog.destination為file時有效。類型: string。 path: /data/mongodb/shard3/logs/shard3.log # 如果是true,則mongod服務重啟時會將日志追加到日志末尾,否則每次重啟會備份已有的日志並創建新日志。 # 類型: boolean。默認: false。 logAppend: true # 日志輸出目的地,可以指定為“file”或者“syslog”,如果指定“file”則必須要設置systemLog.path。 # 如果不指定,則會輸出到標准輸出中(standard output)。 destination: file processManagement: # 是否以守護進程(后台進程)的方式運行mongod/mongos進程。類型: boolean。默認: false。 # 在Linux下如果是使用npm包的方式安裝,並使用自帶的init script腳本,則不推薦修改默認值。 # 否則需要禁用默認的init script,而使用自己的init script。 fork: true # 配合"fork:true"參數,將mongod/mongos進程ID寫入指定的文件,如果不指定,將不會創建PID文件。類型: string pidFilePath: /data/mongodb/shard3/logs/shard3.pid net: # mongod/mongos服務偵聽客戶端連接的端口。類型: int。默認: 27017。 port: 27021 # mongod/monogs應用偵聽客戶端的IP地址或者完整UNIX域套接字路徑,如果想要綁定多個地址使用逗號分隔。 # 若要綁定到所有IPv4地址,請輸入0.0.0.0。與net.bindIpAll配置互斥,不能同時配置兩個。 # 類型: string。默認: localhost bindIp: 127.0.0.1,172.23.102.56 / 127.0.0.1,172.23.102.57 / 127.0.0.1,172.23.102.58 #這里三個設備分別對應 security: # 密鑰文件的路徑,它存儲MongoDB實例在共享的集群或副本集中相互驗證的共享密鑰。 # 必須設置security.authorization為enable。類型: string keyFile: /usr/local/mongodb/keyFile.file # 集群成員之間的認證模式。類型: string。可選: keyFile、sendKeyFile、sendX509、x509。默認: keyFile。 clusterAuthMode: keyFile # 打開訪問數據庫和進行操作的用戶角色認證,僅mongod有效。disabled: 關閉; enabled: 開啟(默認開啟) authorization: enabled # 啟用或禁用服務器端JavaScript執行,僅mongod有效。 # 如果為false,那么任何與javascript相關的功能都不能使用。類型: boolean。默認: true javascriptEnabled: true setParameter: # 如果開啟,則允許本機(localhost/127.0.0.1)第一次訪問時不需要密碼認證,以便於創建第一個admin數據庫的用戶 # true/1或者false/0,默認為true。mongods和mongod有效,建議mongod關閉該功能。 enableLocalhostAuthBypass: true # 認證機制,可選值為“SCRAM-SHA-1”、“MONGODB-CR”、“PLAN”等,建議為“SCRAM-SHA-1” authenticationMechanisms: SCRAM-SHA-1 storage: # mongod實例存儲數據庫文件路徑,僅mongod有效。類型: string dbPath: /data/mongodb/shard3/data journal: # 記錄操作日志,防止數據丟失。64bit默認為true,32bit默認為false enabled: true # 是否將不同DB的數據存儲在不同的目錄中,dbPath的子目錄,目錄名為db的名稱,僅mongod有效。類型: boolean。默認: false directoryPerDB: true # mongod使用fsync操作將數據flush到磁盤的時間間隔,僅mongod有效,不建議修改默認值。類型: number。默認: 60 syncPeriodSecs: 60 # mongod存儲引擎類型,僅mongod有效,可選mmapv1、wiredTiger、inMemory(企業版專用)。3.2之后默認: wiredTiger engine: wiredTiger wiredTiger: engineConfig: # wiredTiger緩存工作集(working set)數據的內存的最大大小。mmapv1引擎沒有改配置,會占用系統所有內存。 # 這個值需要合理的規划,如果過小會影響MongoDB讀寫性能,如果過大則會大量使用swap甚至進程會被Linux內存管理進程kill。 # 單位:GB,默認值最小256M,如果內存大於512M則默認50%。官方推薦不要將值設置為大於默認值。僅mongod有效 cacheSizeGB: 3 # 是否將集合數據和索引數據分兩個目錄存儲,默認: false。僅mongod有效 directoryForIndexes: true replication: # 指定oplog的最大尺寸。對於已經建立過oplog.rs的數據庫,指定無效。 # 默認為磁盤的5%。僅mongod有效 # oplogSizeMB: # 指定副本集的名稱。僅mongod有效 replSetName: shard3 # 指定副本集成員在接受oplog之前是否加載索引到內存。默認會加載所有的索引到內存。 # none,不加載;all,加載所有;_id_only,僅加載_id。僅mongod有效 secondaryIndexPrefetch: all sharding: # 指定分片集的mongodb角色。configsvr: 配置服務器。shardsvr: 分片實例。僅mongod有效 clusterRole: shardsvr # 在塊移動過程中,該選項強制mongodb實例保存所有移動的文檔到moveChunk目錄。 # 在版本3.2及以后版本中默認值為false。 archiveMovedChunks: false
分別啟動三個機器上的shard3 server:
[root@abc] numactl --interleave=all mongod --config /usr/local/mongodb/config/shard3.conf
當三個機器上的第三個分片服務都啟動之后,然后隨便選擇一個服務登入,將三個配置服務節點添加到一個副本集中:
[root@abc] mongo --port 27021 #連接 ... > config = { > ... _id: "shard3", # 配置文件中第三個分片副本集的名稱 > ... members: [ > ... { _id: 0, host: "172.23.102.56:27021", priority: 100 }, > ... { _id: 1, host: "172.23.102.57:27021", priority: 98 }, > ... { _id: 2, host: "172.23.102.58:27021", priority: 99 } > ... ] > ... } # 設置變量 ... rs.initiate(config) # 初始化副本集 ... rs.status() # 查看副本集狀態
...
priority 代表優先級,數值越大優先級越高。如果這里使用的是偶數個節點的話,那么就需要多加一個參數 {_id : 2, host : "172.23.102.58:27021", priority: 99, arbiterOnly: true } ,表示58這個機器為仲裁節點。
編寫mongos server配置文件,在三個機器中除 net.bindIp 配置需要對應到不同的機器之外,其他配置都一樣:
systemLog: # 日志級別,0:包含“info”信息,1~5,即大於0的值均會包含debug信息。類型: integer,默認: 0 verbosity: 0 # 發送所有的診斷信息日志文件的路徑。systemLog.destination為file時有效。類型: string。 path: /data/mongodb/mongos/logs/mongos.log # 如果是true,則mongod服務重啟時會將日志追加到日志末尾,否則每次重啟會備份已有的日志並創建新日志。 # 類型: boolean。默認: false。 logAppend: true # 日志輸出目的地,可以指定為“file”或者“syslog”,如果指定“file”則必須要設置systemLog.path。 # 如果不指定,則會輸出到標准輸出中(standard output)。 destination: file processManagement: # 是否以守護進程(后台進程)的方式運行mongod/mongos進程。類型: boolean。默認: false。 # 在Linux下如果是使用npm包的方式安裝,並使用自帶的init script腳本,則不推薦修改默認值。 # 否則需要禁用默認的init script,而使用自己的init script。 fork: true # 配合"fork:true"參數,將mongod/mongos進程ID寫入指定的文件,如果不指定,將不會創建PID文件。類型: string pidFilePath: /data/mongodb/mongos/logs/mongos.pid net: # mongod/mongos服務偵聽客戶端連接的端口。類型: int。默認: 27017。 port: 27017 # mongod/monogs應用偵聽客戶端的IP地址或者完整UNIX域套接字路徑,如果想要綁定多個地址使用逗號分隔。 # 若要綁定到所有IPv4地址,請輸入0.0.0.0。與net.bindIpAll配置互斥,不能同時配置兩個。 # 類型: string。默認: localhost bindIp: 127.0.0.1,172.23.102.56 / 127.0.0.1,172.23.102.57 / 127.0.0.1,172.23.102.58 #這里三個設備分別對應 security: # 密鑰文件的路徑,它存儲MongoDB實例在共享的集群或副本集中相互驗證的共享密鑰。類型: string keyFile: /usr/local/mongodb/keyFile.file # 集群成員之間的認證模式。類型: string。可選: keyFile、sendKeyFile、sendX509、x509。默認: keyFile。 clusterAuthMode: keyFile setParameter: # 如果開啟,則允許本機(localhost/127.0.0.1)第一次訪問時不需要密碼認證,以便於創建第一個admin數據庫的用戶 # true/1或者false/0,默認為true。mongods和mongod有效,建議mongod關閉該功能。 enableLocalhostAuthBypass: true # 認證機制,可選值為“SCRAM-SHA-1”、“MONGODB-CR”、“PLAN”等,建議為“SCRAM-SHA-1” authenticationMechanisms: SCRAM-SHA-1 sharding: # 配置分片塊大小,默認64(MB)。MongoDB 3.4已刪除該配置。 # chunkSize: 64 # 配置服務器副本集地址。MongoDB 3.2必須將配置服務部署為副本集, # 配置服務副本必須以默認的WiredTiger存儲引擎存儲。 configDB: config/172.23.102.56:27018,172.23.102.57:27018,172.23.102.58:27018
分別啟動三個機器上的mongos server,當然也可以只啟動一個,一個客戶端也只能連接一個mongos:
[root@abc] mongos --config /usr/local/mongodb/config/mongos.conf
當mongos服務都啟動之后登入服務,我們創建集群用戶注意這里同樣只有一次機會。mongos沒有security.authorization配置,一般如果集群成員之間需要進行鑒權,那么mongos就會啟用security相關配置,這樣mongos就必須要進行用戶名和密碼認證了:
[root@abc] mongo
...
> use admin ... > db.createUser({user: "root", pwd: "root", roles: [{role: "root", db: "admin"}]}) ... > db.auth("root", "root") ...
接下來將副本集添加到集群中(其實就是保存在配置服務中):
[root@abc] mongo --port 27017 ... > use admin #使用admin數據庫 ...
> db.auth("root", "root")
... > sh.addShard("shard1/172.23.102.56:27019,172.23.102.57:27019,172.23.102.58:27019") ... > sh.addShard("shard2/172.23.102.56:27020,172.23.102.57:27020,172.23.102.58:27020") ... > sh.addShard("shard3/172.23.102.56:27021,172.23.102.57:27021,172.23.102.58:27021") ... > sh.status() #查看集群狀態
...
至此MongoDB分片和副本集集群已搭建完成。MongoDB數據庫默認會有一個主分片,如果沒有指明數據庫中的集合十分片集合,那么該數據庫的所有集合和文檔都默認會存儲在這個主分片之上。接下來我們來啟用分片集合,首先指明一個數據庫是分片數據庫:
[root@abc] mongo ... > use admin ... > db.auth("root", "root") ... > sh.enableSharding("testdb") # 指明testdb庫啟用分片 ... > sh.status() # 查看分片情況
...
注意,這里如果被啟用分片的數據庫不存在,那么MongoDB會自動創建該數據庫。這里雖然啟用了分片,但還得指明是哪個集合需要分片,使用集合里面的那一個字段作為片鍵,以什么方式進行分片:
[root@abc] mongo ... > use admin ... > db.auth("root", "root") ... > sh.enableSharding("testdb") # 指明testdb庫啟用分片 ... > sh.status() # 查看分片情況 ... # 指定testdb庫下面的mycollection集合以username字段為片鍵進行hash分片 > sh.shardCollection("testdb.mycollection", {"username": "hashed"}) ... > sh.status() # 查看分片情況 ...
這里使用的分片測是hash分片,適合大規模插入、高並發、數據能夠平均分布可充分利用整個集群的性能。還可以進行范圍分片和指定分片(指定拿一些片鍵存儲在那個分片上)等策略進行分片,建議線上大規模讀寫情況下使用hash分片。接下來可以批量插入一些數據,然后查看集合情況:
[root@abc] mongo ... > use admin ... > db.auth("root", "root") ... > sh.enableSharding("testdb") # 指明testdb庫啟用分片 ... > sh.status() # 查看分片情況 ... # 指定testdb庫下面的mycollection集合以username字段為片鍵進行hash分片 > sh.shardCollection("testdb.mycollection", {"username": "hashed"}) ... > sh.status() # 查看分片情況 ... > use testdb ... > db.mycollection.stats() ...
注意,分片集合的片鍵必須有索引。在給集合分片的時候,如果集合不存則會自動創建集合,然后為片鍵創建索引。如果集合存在並且已經有了數據,那么就必須手動為片鍵創建索引,才能為集合分片成功。集合一旦分片成功,片鍵是不能夠修改的,所以選擇片鍵的時候需要謹慎。至此集合分片完成。
如果后期需要直接訪問testdb數據庫,則必須在testdb數據庫下創建用戶。注意用戶信息是全部存儲在admin數據庫下的,用戶必須歸屬為某一個數據庫,admin數據庫下的用戶可以操作所有數據庫,但是直接在非admin數據庫下對admin數據庫的用戶進行認證是不成功的,必須要先切換到admin下進行認證然后在切換到其他庫才可,如果想直接認證則必須在需要認證的數據庫下創建用戶:
[root@abc] mongo ... > use admin ... > db.auth("root", "root") ... > use testdb ... # 注意只有admin數據庫才有root角色,其他數據庫的管理類角色可以選擇:dbOwner、dbAdmin、userAdmin等 > db.createUser({user: "testdb", pwd: "testdb", roles: [{role: "dbOwner", db: "testdb"}]}) ... # 可以切換到admin數據庫下查看用戶信息 > use admin ... > db.system.users.find({}) ... # 也可以刪除用戶 > db.system.users.remove({ _id: "...", user: "..." }) ...
六、配置說明
yaml配置中,縮進只能只用空格,不可以使用tab鍵。如果需要查閱跟多配置相關的信息,請翻閱MongoDB官方手冊: https://docs.mongodb.com/manual/reference/configuration-options/
七、性能優化
說到性能,那么肯定就是和硬件以及操作系統的設置有關了。首先說到硬盤如果是存儲日志這種只需要順序讀寫的數據,那么最好使用SATA類型硬盤。如果是存儲數據庫數據文件,這種文件都是隨機讀寫,那么最好肯定就是SSD了。
每個進程(或線程)都會從父進程繼承NUMA策略,並分配有一個優先node。如果NUMA策略允許的話,進程可以調用其他node上的資源。NUMA的CPU分配策略有cpunodebind、physcpubind。cpunodebind規定進程運行在某幾個node之上,而physcpubind可以更加精細地規定運行在哪些核上。NUMA的內存分配策略有localalloc、preferred、membind、interleave。localalloc規定進程從當前node上請求分配內存;而preferred比較寬松地指定了一個推薦的node來獲取內存,如果被推薦的node上沒有足夠內存,進程可以嘗試別的node。membind可以指定若干個node,進程只能從這些指定的node上請求分配內存。interleave規定進程從指定的若干個node上以RR算法交織地請求分配內存。
NUMA的內存分配策略對於進程(或線程)之間來說,並不是公平的。在現有的Redhat Linux中,localalloc是默認的NUMA內存分配策略,這個配置選項導致資源獨占程序很容易將某個node的內存用盡。而當某個node的內存耗盡時,Linux又剛好將這個node分配給了某個需要消耗大量內存的進程(或線程),swap就妥妥地產生了。盡管此時還有很多page cache可以釋放,甚至還有很多的free內存。要解決這個問題,直接在啟動mongodb之前加上:numactl --interleave=all命令即可。由於只有mognod組建才需要存儲數據,所以只有在啟動配置服務和分片服務時才需要加上該參數。
還可以優化內核參數,針對內核參數overcommit_memory,可選值:0(內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程)、1(表示內核允許分配所有的物理內存,而不管當前的內存狀態如何)、2(表示內核允許分配超過所有物理內存和交換空間總和的內存),這里最好設置為0,即執行:echo 1 > /proc/sys/vm/overcommit_memory。針對zone_reclaim_mode內核參數,可選值為0(當某個節點可用內存不足時,那么系統會傾向於從其他節點分配內存)、1(當某個節點可用內存不足時,那么系統會傾向於從本地節點回收Cache內存多數時候),緩存對性能很重要,所以最好選擇0,即執行:echo 0 > /proc/sys/vm/zone_reclaim_mode
