一、簡介 MongoDB是一種強大、靈活,且易於擴展的通用型資料庫。他能擴展出非常多的功能。如二級索引(secondary index)、範圍查詢(range query)、排序、聚合(aggregation),以及地理空間索引(geospatial index)。 1、易於使用 MongoDB是一 ...
一、簡介
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
配置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/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: false # 配合"fork:true"參數,將mongod/mongos進程ID寫入指定的文件,如果不指定,將不會創建PID文件。類型: string pidFilePath: /data/mongodb/logs/mongodb.pid net: # MongoDB服務監聽埠 port: 27017 # 指定MongoDB綁定的IP,多個IP使用逗號分隔。如果是0.0.0.0則可是使用機器上的任何IP訪問,否則只能使用指定IP訪問 bindIp: 0.0.0.0 storage: # 指定數據文件的路徑 dbPath: /data/mongodb/data # 預設關閉 directoryPerDB: true journal: # 記錄操作日誌,防止數據丟失。64bit預設為true,32bit預設為false enabled: true 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
創建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=/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/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] mkdir /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] mkdir /data/mongodb/shard1/logs/shard1.log ## 第一個分片日誌文件 [root@abc] mkdir /data/mongodb/shard1/data -p ## 第一個分片數據文件存儲目錄 [root@abc] mkdir /data/mongodb/shard2/logs -p ## 第二個分片日誌文件存儲目錄 [root@abc] mkdir /data/mongodb/shard2/logs/shard2.log ## 第二個分片日誌文件 [root@abc] mkdir /data/mongodb/shard2/data -p ## 第二個分片數據文件存儲目錄 [root@abc] mkdir /data/mongodb/shard3/logs -p ## 第三個分片日誌文件存儲目錄 [root@abc] mkdir /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: false # 配合"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 # 是否將不同DB的數據存儲在不同的目錄中,dbPath的子目錄,目錄名為db的名稱,僅mongod有效。類型: boolean。預設: false directoryPerDB: true journal: # 記錄操作日誌,防止數據丟失。64bit預設為true,32bit預設為false enabled: 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] mongod --config /usr/local/mongodb/config/config.conf
當三個機器上的配置服務都啟動之後,然後隨便選擇一個服務登入,將三個配置服務節點添加到一個副本集中:
[root@abc] mongo --port 21018 #連接 ... > config = { > ... _id: "config", # 配置文件中配置服務副本集的名稱 > ... members: [ > ... { _id: 0, host: "172.23.102.56:21018" }, > ... { _id: 1, host: "172.23.102.57:21018" }, > ... { _id: 2, host: "172.23.102.58:21018" } > ... ] > ... } # 設置變數 ... rs.initiate(config) # 初始化副本集 ... rs.status(); # 查看副本集狀態
...
如果這裡使用的是偶數個節點的話,那麼就需要多加一個參數 {_id : 2, host : "172.23.102.58:21018", 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: false # 配合"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 # 是否將不同DB的數據存儲在不同的目錄中,dbPath的子目錄,目錄名為db的名稱,僅mongod有效。類型: boolean。預設: false directoryPerDB: true journal: # 記錄操作日誌,防止數據丟失。64bit預設為true,32bit預設為false enabled: 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] mongod --config /usr/local/mongodb/config/shard1.conf
當三個機器上的第一個分片服務都啟動之後,然後隨便選擇一個服務登入,將三個配置服務節點添加到一個副本集中:
[root@abc] mongo --port 21019 #連接 ... > config = { > ... _id: "shard1", # 配置文件中第一個分片副本集的名稱 > ... members: [ > ... { _id: 0, host: "172.23.102.56:21019" }, > ... { _id: 1, host: "172.23.102.57:21019" }, > ... { _id: 2, host: "172.23.102.58:21019" } > ... ] > ... } # 設置變數 ... rs.initiate(config) # 初始化副本集 ... rs.status(); # 查看副本集狀態
...
如果這裡使用的是偶數個節點的話,那麼就需要多加一個參數 {_id : 1, host : "172.23.102.57:21019", 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: false # 配合"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 # 是否將不同DB的數據存儲在不同的目錄中,dbPath的子目錄,目錄名為db的名稱,僅mongod有效。類型: boolean。預設: false directoryPerDB: true journal: # 記錄操作日誌,防止數據丟失。64bit預設為true,32bit預設為false enabled: 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
分別啟動三個機器上的shard2 server:
[root@abc] mongod --config /usr/local/mongodb/config/shard2.conf
當三個機器上的第二個分片服務都啟動之後,然後隨便選擇一個服務登入,將三個配置服務節點添加到一個副本集中:
[root@abc] mongo --port 21020 #連接 ... > config = { > ... _id: "shard2", # 配置文件中第二個分片副本集的名稱 > ... members: [ > ... { _id: 0, host: "172.23.102.56:21020" }, > ... { _id: 1, host: "172.23.102.57:21020" }, > ... { _id: 2, host: "172.23.102.58:21020" } > ... ] > ... } # 設置變數 ... rs.initiate(config) # 初始化副本集 ... rs.status(); # 查看副本集狀態
...
如果這裡使用的是偶數個節點的話,那麼就需要多加一個參數 {_id : 0, host : "172.23.102.56:21020", 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: false # 配合"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